两种实现Winform程序的多语言支持的解决方案.docx
- 文档编号:15175501
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:113
- 大小:30.95KB
两种实现Winform程序的多语言支持的解决方案.docx
《两种实现Winform程序的多语言支持的解决方案.docx》由会员分享,可在线阅读,更多相关《两种实现Winform程序的多语言支持的解决方案.docx(113页珍藏版)》请在冰点文库上搜索。
两种实现Winform程序的多语言支持的解决方案
方案一:
在窗体基类中每次加载并显示窗体时,会自动递归遍历含文本显示的控件(Button,CheckBox,GroupBox,Label,LinkLabel,TextBox,StatusStrip,TabPage,ToolStrip,RadioButton,DateTimePicker,DataGridView,CheckedListBox,TreeView,MenuStrip),并根据不同的控件类型的文本属性调用简繁转换方法进行转换并重新设置新的相应文本属性的内容(比如:
繁体内容)
优点:
编码简单,对普通程序员的编码无影响(除窗体类的基类由Form类变成MyStyleFormBase类);
缺点:
因每次打开窗体都需要遍历控件并进行简繁转换,如果界面上的控件较多,则可能导致打开窗体较慢,影响用户体验,且子控件的文本内容改变时需程序员手动通知,无法自动感知并转换。
具体实现思路如下:
一.对Form类进行二次封装(继承),定义一个MyStyleFormBase类,并在里面加入每次加载并显示窗体类型时,会自动递归遍历含文本显示的控件,并根据不同的控件类型的文本属性调用简繁转换方法进行转换并重新设置新的相应文本属性的内容,这样当所有的窗体都继承MyStyleFormBase类时,均默认就实现了遍历与转换的过程,程序员无需再次编码,甚至都无需知道存在遍历与转换的过程,从而提高了代码的复用性,具体代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
publicclassMyStyleFormBase:
Form
{
publicMyStyleFormBase()
{
if(!
Thread.CurrentThread.CurrentUICulture.Name.Equals("zh-CHS",StringComparison.OrdinalIgnoreCase))//如果是简体,则无需转换
{
base.TextChanged+=MyStyleFormBase_TextChanged;
base.Shown+=MyStyleFormBase_Shown;
}
}
privatevoidMyStyleFormBase_TextChanged(objectsender,EventArgse)
{
this.Text=LanguageHelper.GetLanguageText(this.Text);
}
privatevoidMyStyleFormBase_Shown(objectsender,EventArgse)
{
LanguageHelper.SetControlLanguageText(this);
base.ControlAdded+=MyStyleFormBase_ControlAdded;
}
privatevoidMyStyleFormBase_ControlAdded(objectsender,ControlEventArgse)
{
LanguageHelper.SetControlLanguageText(e.Control);
}
///
///强制通知子控件改变消息
///
///
protectedvirtualvoidPerformChildrenChange(Controltarget)
{
LanguageHelper.SetControlLanguageText(target);
}
///
///弹出消息框
///
///
///
///
///
///
///
protectedDialogResultMessageBoxShow(stringtext,stringcaption,MessageBoxButtonsbuttons=MessageBoxButtons.OK,MessageBoxIconicon=MessageBoxIcon.None,MessageBoxDefaultButtondefaultButton=MessageBoxDefaultButton.Button1)
{
returnMessageBox.Show(LanguageHelper.GetLanguageText(text),LanguageHelper.GetLanguageText(caption),buttons,icon,defaultButton);
}
}
代码逻辑简要说明:
1.当当前UI的文化区域不为中文简体时(因为本程序本身都是基于简体开发的),就订阅窗体显示事件Shown及窗体标题改变事件TextChanged,作用:
当窗体显示时,则会遍历控件并转换为繁体,当标题的文本改变时,也会自动转换为繁体;
2.当窗体显示后订阅窗体的控件增加事件ControlAdded,作用:
当窗体显示后,若后续存在代码增加控件时,会自动将控件及其子控件进行繁体的转换,保证一个都不漏;
3.增加一个消息提示框方法,目的是弹出消息窗口前能够将简体文本转换成繁体文本;
4.增加一个强制通知子控件改变消息的方法PerformChildrenChange,当某个控件的文本内容或增加子控件发生时,由于窗体本身无法捕获到,故需要调用该方法来遍历与转换子控件的文本内容;(感觉这里不太好,但目前没有更好的办法,如果大家有更好的办法,欢迎留言评论)
二、LanguageHelper:
语方转换公共类(目前仅支持简繁转换,依赖于:
ChineseConverter.dll)代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
publicclassLanguageHelper
{
#region简繁体转换
///
///内容的语言转化
///
///
publicstaticvoidSetControlLanguageText(System.Windows.Forms.Controlparent)
{
if(parent.HasChildren)
{
foreach(System.Windows.Forms.Controlctrlinparent.Controls)
{
SetContainerLanguage(ctrl);
}
}
else
{
SetLanguage(parent);
}
}
#endregion
#region控件简繁体语言转换
///
///设置容器类控件的语言
///
///
///
privatestaticvoidSetContainerLanguage(System.Windows.Forms.Controlctrl)
{
if(ctrlisDataGridView)
{
try
{
DataGridViewdataGridView=(DataGridView)ctrl;
foreach(DataGridViewColumndgvcindataGridView.Columns)
{
try
{
if(dgvc.HeaderText.ToString()!
=""&&dgvc.Visible)
{
dgvc.HeaderText=GetLanguageText(dgvc.HeaderText);
}
}
catch
{
}
}
}
catch(Exception)
{}
}
if(ctrlisMenuStrip)
{
MenuStripmenuStrip=(MenuStrip)ctrl;
foreach(ToolStripMenuItemtoolIteminmenuStrip.Items)
{
try
{
toolItem.Text=GetLanguageText(toolItem.Text);
}
catch(Exception)
{
}
finally
{
if(toolItem.DropDownItems.Count>0)
{
GetItemText(toolItem);
}
}
}
}
elseif(ctrlisTreeView)
{
TreeViewtreeView=(TreeView)ctrl;
foreach(TreeNodenodeintreeView.Nodes)
{
try
{
node.Text=GetLanguageText(node.Text);
}
catch(Exception)
{
}
finally
{
if(node.Nodes.Count>0)
{
GetNodeText(node);
}
}
}
}
elseif(ctrlisTabControl)
{
TabControltabCtrl=(TabControl)ctrl;
try
{
foreach(TabPagetabPageintabCtrl.TabPages)
{
tabPage.Text=GetLanguageText(tabPage.Text);
}
}
catch(Exception)
{
}
}
elseif(ctrlisStatusStrip)
{
StatusStripstatusStrip=(StatusStrip)ctrl;
foreach(ToolStripItemtoolIteminstatusStrip.Items)
{
try
{
toolItem.Text=GetLanguageText(toolItem.Text);
}
catch(Exception)
{
}
finally
{
ToolStripDropDownButtontsDDBtn=toolItemasToolStripDropDownButton;
if(tsDDBtn!
=null&&tsDDBtn.DropDownItems.Count>0)
{
GetItemText(tsDDBtn);
}
}
}
}
elseif(ctrlisToolStrip)
{
ToolStripstatusStrip=(ToolStrip)ctrl;
foreach(ToolStripItemtoolIteminstatusStrip.Items)
{
try
{
toolItem.Text=GetLanguageText(toolItem.Text);
}
catch(Exception)
{
}
}
}
elseif(ctrlisCheckedListBox)
{
CheckedListBoxchkListBox=(CheckedListBox)ctrl;
try
{
for(intn=0;n { chkListBox.Items[n]=GetLanguageText(chkListBox.Items[n].ToString()); } } catch(Exception) {} } if(ctrl.HasChildren) { foreach(System.Windows.Forms.Controlcinctrl.Controls) { SetContainerLanguage(c); } } else { SetLanguage(ctrl); } } /// ///设置普通控件的语言 /// /// /// privatestaticvoidSetLanguage(System.Windows.Forms.Controlctrl) { if(true) { if(ctrlisCheckBox) { CheckBoxcheckBox=(CheckBox)ctrl; try { checkBox.Text=GetLanguageText(checkBox.Text); } catch(Exception) { } } elseif(ctrlisLabel) { Labellabel=(Label)ctrl; try { label.Text=GetLanguageText(label.Text); } catch(Exception) { } } elseif(ctrlisButton) { Buttonbutton=(Button)ctrl; try { button.Text=GetLanguageText(button.Text); } catch(Exception) { } } elseif(ctrlisGroupBox) { GroupBoxgroupBox=(GroupBox)ctrl; try { groupBox.Text=GetLanguageText(groupBox.Text); } catch(Exception) { } } elseif(ctrlisRadioButton) { RadioButtonradioButton=(RadioButton)ctrl; try { radioButton.Text=GetLanguageText(radioButton.Text); } catch(Exception) { } } } } /// ///递归转化菜单 /// /// privatestaticvoidGetItemText(ToolStripDropDownItemmenuItem) { foreach(ToolStripItemtoolIteminmenuItem.DropDownItems) { try { toolItem.Text=GetLanguageText(toolItem.Text); } catch(Exception) { } finally { if(toolItemisToolStripDropDownItem) { ToolStripDropDownItemsubMenuStrip=(ToolStripDropDownItem)toolItem; if(subMenuStrip.DropDownItems.Count>0) { GetItemText(subMenuStrip); } } } } } /// ///递归转化树 /// /// privatestaticvoidGetNodeText(TreeNodenode) { foreach(TreeNodetreeNodeinnode.Nodes) { try { treeNode.Text=GetLanguageText(treeNode.Text); } catch(Exception) { } finally { if(treeNode.Nodes.Count>0) { GetNodeText(treeNode); } } } } /// ///根据语言标识符得到转换后的值 /// /// /// /// publicstaticstringGetLanguageText(stringvalue) { stringlanguageFlag=Thread.CurrentThread.CurrentUICulture.Name; if(string.IsNullOrWhiteSpace(value)) { returnvalue; } switch(languageFlag.ToUpper()) { case"ZH-CHT": { returnToTraditional(value); } default: { returnToSimplified(value); } } } /// ///简体转换为繁体 /// /// /// private
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实现 Winform 程序 语言 支持 解决方案