在实际的项目开发中,软件需要实现多语言切换。本文通过一个实际的例子,可以让你学习到这个技能。











using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace MultiLanguageDemo
{
class MultiLanguage
{
public static string DefaultLanguage = "zh-CN";
/// <summary>
/// 修改默认语言
/// </summary>
/// <param name="lang">待设置默认语言</param>
public static void SetDefaultLanguage(string lang)
{
Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang);
DefaultLanguage = lang;
Properties.Settings.Default.DefaultLanguage = lang;//【在Properties.Settings中添加DefaultLanguage】
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)
{
ComponentResourceManager resources = new 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, 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);
}
}
}
if (control is StatusStrip)
{
//将资源与控件对应
resources.ApplyResources(control, control.Name);
StatusStrip ts = (StatusStrip)control;
foreach (ToolStripItem c in ts.Items)
{
//遍历菜单
resources.ApplyResources(c, c.Name);
}
}
//需要大家去完善
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, 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);
}
}
}
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace MultiLanguageDemo
{
public partial class Form1 : Form
{
public enum Language
{
ChineseSimplified,//简体中文
English //英语
//....如果有别的语言,另外添加
}
//当前选择的语言
private Language CurrentSelectedLanguage = Language.ChineseSimplified;
public Form1()
{
InitializeComponent();
//获取上次存储的语言,进行界面的更新
string language = Properties.Settings.Default.DefaultLanguage;
MultiLanguage.SetDefaultLanguage(language);
MultiLanguage.LoadLanguage(this, typeof(Form1));
switch (language.ToLower())
{
case "zh-cn": this.CurrentSelectedLanguage = Language.ChineseSimplified; break;
case "en-us": this.CurrentSelectedLanguage = Language.English; break;
default:
break;
}
}
private void btn_Connect_Click(object sender, EventArgs e)
{
switch (this.CurrentSelectedLanguage)
{
case Language.ChineseSimplified:
listBox1.Items.Add(DateTime.Now.ToString("HH:mm:ss") + "建立连接");
break;
case Language.English:
listBox1.Items.Add(DateTime.Now.ToString("HH:mm:ss") + "Connect Success");
break;
default:
break;
}
}
private void btn_Disconnect_Click(object sender, EventArgs e)
{
switch (this.CurrentSelectedLanguage)
{
case Language.ChineseSimplified:
listBox1.Items.Add(DateTime.Now.ToString("HH:mm:ss") + "断开连接");
break;
case Language.English:
listBox1.Items.Add(DateTime.Now.ToString("HH:mm:ss") + "Disconnect Success");
break;
default:
break;
}
}
private void lbl_LanguageSelect_Click(object sender, EventArgs e)
{
//第一步:判断当前是什么语言
if (this.lbl_Language.Text == "中文-简体")
{
MultiLanguage.SetDefaultLanguage("en-US");
this.CurrentSelectedLanguage = Language.English;
}
else
{
MultiLanguage.SetDefaultLanguage("zh-CN");
this.CurrentSelectedLanguage = Language.ChineseSimplified;
}
foreach (Form form in Application.OpenForms)
{
LoadAll(form);
}
}
private void LoadAll(Form form)
{
if (form.Name == "Form1")
{
MultiLanguage.LoadLanguage(form, typeof(Form1));
}
//如果还有别的窗体,这里要完善一下
}
}
}
public Form1()
{
InitializeComponent();
//获取上次存储的语言,进行界面的更新
string language = Properties.Settings.Default.DefaultLanguage;
MultiLanguage.SetDefaultLanguage(language);
MultiLanguage.LoadLanguage(this, typeof(Form1));
switch (language.ToLower())
{
case "zh-cn": this.CurrentSelectedLanguage = Language.ChineseSimplified; break;
case "en-us": this.CurrentSelectedLanguage = Language.English; break;
default:
break;
}
}
public enum Language
{
ChineseSimplified,//简体中文
English //英语
//....如果有别的语言,另外添加
}
//当前选择的语言
private Language CurrentSelectedLanguage = Language.ChineseSimplified;
private void btn_Connect_Click(object sender, EventArgs e)
{
switch (this.CurrentSelectedLanguage)
{
case Language.ChineseSimplified:
listBox1.Items.Add(DateTime.Now.ToString("HH:mm:ss") + "建立连接");
break;
case Language.English:
listBox1.Items.Add(DateTime.Now.ToString("HH:mm:ss") + "Connect Success");
break;
default:
break;
}
}
private void btn_Disconnect_Click(object sender, EventArgs e)
{
switch (this.CurrentSelectedLanguage)
{
case Language.ChineseSimplified:
listBox1.Items.Add(DateTime.Now.ToString("HH:mm:ss") + "断开连接");
break;
case Language.English:
listBox1.Items.Add(DateTime.Now.ToString("HH:mm:ss") + "Disconnect Success");
break;
default:
break;
}
}



https://download.csdn.net/download/sinat_40003796/85405096
归结起来,要在C#的WinForm中实现国际化,至少需要做好以下几点:
(1)准备所需资源文件(如本文中提到的英文和中文资源文件);
(2)引入命名空间(包括:System.Reflection、System.Resources、System.Threading和System.Globalization);
(3)实例化资源管理器(即ResourceManager);
(4)设置当前进程的语言区域;
(5)通过资源管理器从指定的资源文件中获取所需值。
具体可以参考源码进行理解:
源码链接:https://mp.csdn.net/mp_download/manage/download/UpDetailed