C#的Winform多语言实现(resx文件)

使用resx文件实现Winform多语言切换,本博文提供的代码可以实现简体中文、繁体中文、英文的切换。如果需要增加其它语言的切换,只需要编写相应的语言的resx文件即可。 并且,当修改了语言之后,会更新所有打开的窗口。先贴几张图展示一下效果。

程序下载:点击打开链接

http://download.csdn.net/detail/softimite_zifeng/9731575

1. 简体中文


2. 繁体中文


3. 英文


下面子丰介绍一下实现的过程:

1. 为每个窗口创建相应语言的resx文件。子丰以英文为例,右键->添加->新建项->资源文件,文件名为窗口名.en-US如上面的两个窗口,分别为LoginForm.en-US.resx和PasswordForm.en-US.resx。简体中文为LoginForm.zh-CN.resx和PasswordForm.zh-CN.resx,繁体中文为LoginForm.zh-CHT.resx和PasswordForm.zh-CHT.resx。下面给出LoginForm.en-US.resx文件的截图。




2. 在项目的Properties的Settings.settings中添加变量DefaultLanguage,用于保存当前设置的默认语言。当下次启动程序时,会读取该变量,从而将程序的语言设置为上次程序关闭时的语言。




3. 创建一个静态类(MultiLanguage.cs)用于编写与切换语言相关的变量和代码。

(1)变量DefaultLanguage,用于保存当前默认语言

[csharp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //当前默认语言  
  2. public static string DefaultLanguage = "zh-CN";  
(2)函数SetDefaultLanguage修改当前默认语言

[csharp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /// <summary>  
  2. /// 修改默认语言  
  3. /// </summary>  
  4. /// <param name="lang">待设置默认语言</param>  
  5. public static void SetDefaultLanguage(string lang)  
  6. {  
  7.     System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang);  
  8.     DefaultLanguage = lang;  
  9.     Properties.Settings.Default.DefaultLanguage = lang;  
  10.     Properties.Settings.Default.Save();  
  11. }  
(3)函数LoadLanguage用于加载语言或切换语言

[csharp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /// <summary>  
  2. /// 加载语言  
  3. /// </summary>  
  4. /// <param name="form">加载语言的窗口</param>  
  5. /// <param name="formType">窗口的类型</param>  
  6. public static void LoadLanguage(Form form, Type formType)  
  7. {  
  8.     if (form != null)  
  9.     {  
  10.         System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(formType);  
  11.         resources.ApplyResources(form, "$this");  
  12.         Loading(form, resources);  
  13.     }  
  14. }  
  15.   
  16. /// <summary>  
  17. /// 加载语言  
  18. /// </summary>  
  19. /// <param name="control">控件</param>  
  20. /// <param name="resources">语言资源</param>  
  21. private static void Loading(Control control, System.ComponentModel.ComponentResourceManager resources)  
  22. {  
  23.     if (control is MenuStrip)  
  24.     {  
  25.         //将资源与控件对应  
  26.         resources.ApplyResources(control, control.Name);  
  27.         MenuStrip ms = (MenuStrip)control;  
  28.         if (ms.Items.Count > 0)  
  29.         {  
  30.             foreach (ToolStripMenuItem c in ms.Items)  
  31.             {  
  32.                 //遍历菜单  
  33.                 Loading(c, resources);  
  34.             }  
  35.         }  
  36.     }  
  37.   
  38.     foreach (Control c in control.Controls)  
  39.     {  
  40.         resources.ApplyResources(c, c.Name);  
  41.         Loading(c, resources);  
  42.     }  
  43. }  
  44.   
  45. /// <summary>  
  46. /// 遍历菜单  
  47. /// </summary>  
  48. /// <param name="item">菜单项</param>  
  49. /// <param name="resources">语言资源</param>  
  50. private static void Loading(ToolStripMenuItem item, System.ComponentModel.ComponentResourceManager resources)  
  51. {  
  52.     if (item is ToolStripMenuItem)  
  53.     {  
  54.         resources.ApplyResources(item, item.Name);  
  55.         ToolStripMenuItem tsmi = (ToolStripMenuItem)item;  
  56.         if (tsmi.DropDownItems.Count > 0)  
  57.         {  
  58.             foreach (ToolStripMenuItem c in tsmi.DropDownItems)  
  59.             {  
  60.                 Loading(c, resources);  
  61.             }  
  62.         }  
  63.     }  
  64. }  


4. 在主窗口的Load事件中读取Properties.Settings.Default.DefaultLanguage,并将ComboBox赋值为当前默认语言,即简体中文、繁体中文或英文。

[csharp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. private void LoginForm_Load(object sender, EventArgs e)  
  2. {  
  3.     //设置combobox的值  
  4.     string language = Properties.Settings.Default.DefaultLanguage;  
  5.     if (language == "zh-CN")  
  6.     {  
  7.         languageTxt.Text = "简体中文(默认)";  
  8.     }  
  9.     else if (language == "zh-CHT")  
  10.     {  
  11.         languageTxt.Text = "繁體中文";  
  12.     }  
  13.     else if (language == "en-US")  
  14.     {  
  15.         languageTxt.Text = "English";  
  16.     }  
  17. }  

5. 在每个窗口的Load事件中调用函数MultiLanguage.LoadLanguage,使窗口在出现时即显示为当前默认语言。

[csharp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. private void PasswordForm_Load(object sender, EventArgs e)  
  2. {  
  3.     //加载语言  
  4.     MultiLanguage.LoadLanguage(thistypeof(PasswordForm));  
  5. }  


6. 编写用于切换语言的ComboBox的SelectedIndexChanged事件,使得当用户选择对应的语言时,程序会切换到该语言。

[csharp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //切换语言  
  2. private void languageTxt_SelectedIndexChanged(object sender, EventArgs e)  
  3. {  
  4.     languageTxt.Enabled = false;  
  5.     if (languageTxt.Text == "简体中文(默认)")  
  6.     {  
  7.         //修改默认语言  
  8.         MultiLanguage.SetDefaultLanguage("zh-CN");  
  9.         //对所有打开的窗口重新加载语言  
  10.         foreach (Form form in Application.OpenForms)  
  11.         {  
  12.             LoadAll(form);  
  13.         }  
  14.     }  
  15.     else if (languageTxt.Text == "繁體中文")  
  16.     {  
  17.         //修改默认语言  
  18.         MultiLanguage.SetDefaultLanguage("zh-CHT");  
  19.         //对所有打开的窗口重新加载语言  
  20.         foreach (Form form in Application.OpenForms)  
  21.         {  
  22.             LoadAll(form);  
  23.         }  
  24.     }  
  25.     else if (languageTxt.Text == "English")  
  26.     {  
  27.         //修改默认语言  
  28.         MultiLanguage.SetDefaultLanguage("en-US");  
  29.         //对所有打开的窗口重新加载语言  
  30.         foreach (Form form in Application.OpenForms)  
  31.         {  
  32.             LoadAll(form);  
  33.         }  
  34.     }  
  35.     languageTxt.Enabled = true;  
  36. }  
  37.   
  38. private void LoadAll(Form form)  
  39. {  
  40.     if (form.Name == "LoginForm")  
  41.     {  
  42.         MultiLanguage.LoadLanguage(form, typeof(LoginForm));  
  43.     }  
  44.     else if (form.Name == "PasswordForm")  
  45.     {  
  46.         MultiLanguage.LoadLanguage(form, typeof(PasswordForm));  
  47.     }  
  48. }  
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值