本文使用resx文件实现Winform多语言切换,以实现简体中文、英文的切换为例。如果后续需要增加其它语言的切换,只需要按照步骤重复操作即可。 并且,当修改了语言之后,会更新主窗口的语言,后续打开窗口的语言与主窗口保持一致。下面开始正文。
- 新建一个解决方案,右击窗体应用程序–>添加新建项,选中Windows窗体,得到Form2。
- 给Form1和Form2添加控件,如下所示
表一:
其中,控件comboBox按照下述步骤添加语言选项。
表二:
- 开始进入正题了,我们先设置中文下的窗体……
首先将Form1的 Localizable 属性为 true( 设置该属性后,.net 将根据不同的语言,为应用程序生成不同的资源文件),然后将Language属性设置为中文(简体,中国),如下所示。
此时可以看到:
对应的Form1目录底下出现了Form1.zh-CN.resx资源文件
我们依次将Form1和控件的Text改为下图所示的情形,对应的Form1.zh-CN.resx也出现了相应的变化:
同样的Form2也重复上述操作:
- 然后设置英文下的窗体……,将Language属性设置为英语,
对应的Form1目录底下出现了Form1.zh-CN.resx资源文件,
我们依次将Form1和控件的Text改为下图所示的情形,
对应的Form1.en.resx也出现了相应的变化:
同样的Form2也重复上述操作:
- 到目前为止,窗体设置完毕。下一步在项目的Properties的Settings.settings中添加变量DefaultLanguage,用于保存当前设置的默认语言。当下次启动程序时,会读取该变量,从而将程序的语言设置为上次程序关闭时的语言。第一次将默认语言设置为中文zh-CN。
- 创建一个静态类(MultiLanguage.cs)用于编写与切换语言相关的变量和代码。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
class MultiLanguage
{
//当前默认语言
public static string DefaultLanguage = "zh-CN";
/// <summary>
/// 修改默认语言
/// </summary>
/// <param name="lang">待设置默认语言</param>
public static void SetDefaultLanguage(string lang)
{
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang);
DefaultLanguage = lang;
Properties.Settings.Default.DefaultLanguage = lang;
Properties.Settings.Default.Save();
}
/// <summary>
/// 加载语言
/// </summary>
/// <param name="form">加载语言的窗口</param>
/// <param name="formType">窗口的类型</param>
public static void LoadLanguage(Form form, Type formType)
{
if (form != null)
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(formType);
resources.ApplyResources(form, "$this");
Loading(form, resources);
}
}
/// <summary>
/// 加载语言
/// </summary>
/// <param name="control">控件</param>
/// <param name="resources">语言资源</param>
private static void Loading(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)
{
//遍历菜单
Loading(c, resources);
}
}
}
foreach (Control c in control.Controls)
{
resources.ApplyResources(c, c.Name);
Loading(c, resources);
}
}
/// <summary>
/// 遍历菜单
/// </summary>
/// <param name="item">菜单项</param>
/// <param name="resources">语言资源</param>
private static void Loading(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)
{
Loading(c, resources);
}
}
}
}
}
}
- 在Form1的Load(双击Form1即可跳转至该事件)事件中读取Properties.Settings.Default.DefaultLanguage,并将ComboBox赋值为当前默认语言,即简体中文或英文。
private void Form1_Load(object sender, EventArgs e)
{
//设置combobox的值
string language = Properties.Settings.Default.DefaultLanguage;
if (language == "zh-CN")
{
comboBox1.Text = "简体中文(默认)";
}
else if (language == "en-US")
{
comboBox1.Text = "English";
}
}
- 在Form2的Load事件中调用函数MultiLanguage.LoadLanguage,使窗口在出现时即显示为当前默认语言。有更多的窗体直接重复该步骤即可。
private void Form2_Load(object sender, EventArgs e)
{
MultiLanguage.LoadLanguage(this, typeof(Form2));
}
- 编写用于切换语言的ComboBox的SelectedIndexChanged事件,使得当用户选择对应的语言时,程序会切换到该语言。
事件添加方式如下:选中ComboBox,点击事件,在SelectedIndexChanged事件中输入方法名languageTxt_SelectedIndexChanged,按回车即可自动生成。
对应的代码为:
//切换语言
private void languageTxt_SelectedIndexChanged(object sender, EventArgs e)
{
comboBox1.Enabled = false;
if (comboBox1.Text == "简体中文(默认)")
{
//修改默认语言
MultiLanguage.SetDefaultLanguage("zh-CN");
//对所有打开的窗口重新加载语言
foreach (Form form in Application.OpenForms)
{
LoadAll(form);
}
}
else if (comboBox1.Text == "English")
{
//修改默认语言
MultiLanguage.SetDefaultLanguage("en-US");
//对所有打开的窗口重新加载语言
foreach (Form form in Application.OpenForms)
{
LoadAll(form);
}
}
comboBox1.Enabled = true;
}
private void LoadAll(Form form)
{
if (form.Name == "Form1")
{
MultiLanguage.LoadLanguage(form, typeof(Form1));
}
else if (form.Name == "Form2")
{
MultiLanguage.LoadLanguage(form, typeof(Form2));
}
}
- 其中点击Form1的修改/Modify按钮会跳转到Form1,故给button2添加Click事件(双击button2即可自动生成),代码如下:
/// <summary>
/// 点击修改按钮,出现第二个界面
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
Form2 Form2 = new Form2();
LoadAll(Form2);
Form2.ShowDialog();
}
- 运行之后效果如下:
中文界面:
英文界面:
到此基本功能实现。
不足:当Form1与Form2同时开启的时候无法切换语言,必须要在Form2关闭后,才能切换。后续要做进一步的优化才行。
注释:该文章参考了第一篇博客和第二篇博客。其中代码来源于第一篇博客,但第二篇博客有着另外切换语言的实现方法。后续我会做新的尝试,希望这篇文章会对大家有帮助,别忘了给我点赞哦!