winForm 国际化的简单实现
国际化就是要实现多语种的界面切换。首先,我们不可能用if else等语句来根据选择的不同语种对所有的控件一个一个的设值,这样太麻烦了。.Net提供了国际化相关的支持,主要放在System.Globalization命名空间下。下面是一个简单的实现,麻雀虽小,五脏俱全。
这个程序是最近写的一个程序,就在这基础上进行改造,关键是弄懂原理。
1> 首先要加入Resource文件
在VS工程-->添加新项目里加入三个resource文件,Resource文件的作用就是存放我们的界面控件的显示字符串。这里我们要实现3种语言的切换,所有加入了3个,分别命名为:Resource.en-US.resx,Resource.zh-CN.resx,Resource.ja-JP.resx。注意命名规则第一部分要相同,第二部分是不同语言的culture name,我定义的就是英语,中文,日文。
2> 在这3个文件中定义界面相关的字符串信息。
注意定义的名字在3个文件中要一致,否则找不到。
Resource.en-US.resx
tsmi_language_Name Language
tsmi_易做图ese_Name Japanese
tsmi_english_Name English
tsmi_close_Name Close
tsmi_chiniese_Name Chinese
Resource.zh-CN.resx
tsmi_language_Name 语言
tsmi_chiniese_Name 中文
tsmi_english_Name 英文
tsmi_易做图ese_Name 日文
tsmi_close_Name 退出
Resource.ja-JP.resx
tsmi_language_Name 言語
tsmi_chiniese_Name 中国語
tsmi_english_Name 英語
tsmi_易做图ese_Name 日本語
tsmi_close_Name 閉じる
3> 利用ResourceManager类进行读取。
ResourceManager会根据不同的cultrue来读不同的resource文件,所以,实现的关键就是根据不同的语言来改变当前程序线程的cultrue就可以达到目地。而对于界面控件Text的赋值代码将是不变的,当新增加一种语言是,也就是再加一个resource文件,对代码的改动几乎没有影响。
基本代码:
Resource的读取类
class ResourceCluture
{
/// <summary>
/// 设定语言环境
/// </summary>
/// <param name="strClutrue"></param>
public static void SetLocalClutrue(string strClutrue)
{
if(string.IsNullOrEmpty(strClutrue))
{
strClutrue = "zh-CN";
}
CultureInfo currentClutrue = new CultureInfo(strClutrue);
Thread.CurrentThread.CurrentCulture = currentClutrue;
}
/// <summary>
/// 取值
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public static string GetString(string id)
{
string strValue = string.Empty;
try
{
ResourceManager resManager = new ResourceManager("ApplicationActive.Properties.Resource", Assembly.GetExecutingAssembly());
strValue = resManager.GetString(id, Thread.CurrentThread.CurrentCulture);
}
catch
{
strValue = "No id:" + id + "please add";
}
return strValue;
}
}
class ResourceCluture
{
/// <summary>
/// 设定语言环境
/// </summary>
/// <param name="strClutrue"></param>
public static void SetLocalClutrue(string strClutrue)
{
if(string.IsNullOrEmpty(strClutrue))
{
strClutrue = "zh-CN";
}
CultureInfo currentClutrue = new CultureInfo(strClutrue);
Thread.CurrentThread.CurrentCulture = currentClutrue;
}
/// <summary>
/// 取值
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public static string GetString(string id)
{
string strValue = string.Empty;
try
{
ResourceManager resManager = new ResourceManager("ApplicationActive.Properties.Resource", Assembly.GetExecutingAssembly());
strValue = resManager.GetString(id, Thread.CurrentThread.CurrentCulture);
}
catch
{
strValue = "No id:" + id + "please add";
}
return strValue;
}
}
设定控件文字的代码:
/// <summary>
/// 根据不同的语言文化,设定界面控件的文字
/// </summary>
/// <param name="strClutrue">"en-US","ch-CN","ja-JP" etc..<</param>
private void SetFormTextByLanguage(string strClutrue)
{
ResourceCluture.SetLocalClutrue(strClutrue);
this.lblPath.Text = ResourceCluture.GetString("lblPath_Name");
this.tsmi_language.Text = ResourceCluture.GetString("tsmi_language_Name");&nb
补充:Web开发 , ASP.Net ,