C# winForm资源文件实现多语言切换
这是我目前看到过最简单的多语言切换了
操作步骤
界面上的多语
Step1.将界面Form的属性的Localizable属性设为True
Step2.切换界面From的Language属性为欲使用的语系
设完后会在分页标签上看到目前设定的语系
Step3.设定界面上欲显示的字样并适当的调整版面
到此,用资源档做的多语系程序就完成了。
我们可以到档案总管看一下,可看到Visual Studio自己帮我们产生了对应的资源档。
因此,在实作界面上的多语时,我们并不需自己手动加入资源档。
信息的多语
上面的示例带出了界面上支持多语的写法,但却不适用于信息上,若要在信息上也支持多语。请依下列步骤:
Step1.加入资源档
资源档依照“资源文件名.文化特性.resx”格式命名,如“Resources.zh-tw.resx”。
Step2.设定资源档内的信息内容
在资源档上连点两下
设定对应的语系字串
Step3.使用资源档内的信息内容
这边只要透过My.Resources去取出资源档内的值即可,内部OR Mapping转换都帮你做好好,可以用强型别的方式直接取用,能避免掉许多不必要的低级错误。
MsgBox(My.Resources.Resource1.String1)
其实个人习惯是命名为“Resources.文化特性.resx”,因为项目里已偷放了一个Resources.resx资源档,因此只需加入非预设语系的资源档即可
在使用上也会变得较为简短
MsgBox(My.Resources.String1)
切换语系
依上面步骤操作完后,其实已具多语支持能力。当程序开启时,会自动依照当前语系去显示界面画面。因此我们开启时应该是显示中文而不是本来的英文。若要自己切换语系可利用Threading.Thread.CurrentThread.CurrentUICulture。
Threading.Thread.CurrentThread.CurrentUICulture = New CultureInfo(“en”)
值得注意的是,这样的写法是不会影响已开启的视窗的。只有后来开启的视窗会被切换语系。
那是否已开启的视窗就无法切换了呢?那倒也不是。可以透过使用ResourceManager.GetString去取得对应的字串,把取出的字串再设到界面上即可。但是这也不是很好的方法,个人倾向使用ComponentResourceManager配合递回去把界面上的字串换成对应语系的字串。有兴趣的可以参考Form.Designer.vb档的代码。
注意事项
在用多国语言资源档时,建议最后在弄其它语系的设定。因为当我们设定多语系时,Visual Studio会自动帮我们产生资源档,且内含预设的设定值。若太早让Visual Studi产生资源档,则预设的设定值将只有少少的几个,后面的设定值都需手动的设定,且每个语系的资源档都要设定。
调用
SetLang("语言标识", this, typeof(窗体));
public static class JapanHelper { /// <summary> /// 设置当前程序的界面语言 /// </summary> /// <param name="lang">language:zh-CN, en-US</param> /// <param name="form">窗体实例</param> /// <param name="formType">窗体类型</param> public static void SetLang(string lang, Form form) { System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang); if (form != null) { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(form.GetType()); resources.ApplyResources(form, "$this"); AppLang(form, resources); } } /// <summary> /// 遍历窗体所有控件,针对其设置当前界面语言 /// </summary> /// <param name="control"></param> /// <param name="resources"></param> private static void AppLang(Control control, System.ComponentModel.ComponentResourceManager resources) { if (control is MenuStrip) { //将资源应用与对应的属性 resources.ApplyResources(control, control.Name); MenuStrip ms = (MenuStrip)control; if (ms.Items.Count > 0) { foreach (ToolStripMenuItem c in ms.Items) { //调用 遍历菜单 设置语言 AppLang(c, resources); } } } foreach (Control c in control.Controls) { resources.ApplyResources(c, c.Name); AppLang(c, resources); } } /// <summary> /// 遍历菜单 /// </summary> /// <param name="item"></param> /// <param name="resources"></param> private static void AppLang(ToolStripMenuItem item, System.ComponentModel.ComponentResourceManager resources) { if (item is ToolStripMenuItem) { resources.ApplyResources(item, item.Name); ToolStripMenuItem tsmi = (ToolStripMenuItem)item; if (tsmi.DropDownItems.Count > 0) { foreach (ToolStripMenuItem c in tsmi.DropDownItems) { //if (tsmi != ToolStripSeparator) //{ } AppLang(c, resources); } } } } }