创建窗体
开发环境:VS2022 社区版 中文界面 .Net 6.0 WinForm界面程序
- 创建窗体,并添加几个按钮;添加切换语言的RadioButton;
- 修改窗体的Localizable属性为True
- 修改窗体的Language属性为’英语(美国)',修改按钮文本
- 编译生成工程
- 检查解决方案资源管理器的Form1.cs下面是否生成Form1.en-US.resx文件
注意事项
- 建议不要手动修改*.resx文件,特别是名称栏
- 修改语言,生成项目后,关闭窗体设计器再次打开才会显示不同语言版本的窗体设计器
效果
关键代码
Radio按钮选择事件及封装的语言管理类
public partial class Form1 : Form
{
private void ra_ZH_CheckedChanged(object sender, EventArgs e)
{
LanguageManager.ChangeLanguage(this, LanguageManager.LangKeys.zh_CN);
}
private void ra_EN_CheckedChanged(object sender, EventArgs e)
{
LanguageManager.ChangeLanguage(this, LanguageManager.LangKeys.en_US);
}
}
/// <summary>
/// WinForm本地化语言管理
/// </summary>
public static class LanguageManager
{
/// <summary>
/// 常用语言
/// </summary>
public static class LangKeys
{
public const string zh_CN = "zh-CN";
public const string zh_TW = "zh-TW";
public const string en_US = "en-US";
}
private static void ApplyResources(ComponentResourceManager resources, Control root, string Name)
{
foreach (var item in root.Controls)
{
Control? ctl = item as Control;
if (ctl != null)
{
ApplyResources(resources, ctl, ctl.Name);
}
}
resources.ApplyResources(root, Name);
}
/// <summary>
/// 改变窗体语言
/// </summary>
/// <param name="root">窗体</param>
/// <param name="LanguageKey">语言Key带后缀的(如:zh-CN)</param>
public static void ChangeLanguage(Form root, string LanguageKey)
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo(LanguageKey);
ComponentResourceManager resources = new ComponentResourceManager(root.GetType());
ApplyResources(resources, root, root.Name);
}
}
截图
窗体属性:
资源管理器不同语言文件:Form1.resx为默认语言中文
不同语言的窗体设计器:
优缺点
- LanguageManager使用递归查找控件;自动切换语言不需要每增加一个控件加一句代码;
- resx文件的名称的资源名称不能手动修改
- 有多个语言版本时建议先复制一个非默认的resx文件;复制一份并修改文件名称