c#winform:开发多语言应用程序---多国语言本地化与设计模式的思考----观察者模式+工厂模式!

前日看了一个帖子,其实也是困扰了我好些日子的问题-------winforn 下的多语言本地化实现,公司的小项目有个winforn通信程序,需要支持中英文,就学着用了.net的资源文件 。但是,对于多线程跨窗体调用的控件,其它类中的消息框,异常信息,等输出到界面的文字内容并不是很好的处理 ,苦苦想了很久,没找到正解!过了一个月,在看到这个帖子时才下决心!
希望用设计模式和委托的方式解决。 这样只要在类中new个对象,注册事件,当CultureInfo对象改变时,触发事件来改变界面语言,现在终于想通了点。

1.

我代码实现的原理和基本思路是这个意思;
FORM观察CultureInfo的改变,目标对象CultureInfo用工厂取回对应的语言产品

2.

我的本意不是为了用设计模式,而是在你用菜单选哪一个语言更新界面时,很简单的调用一个方法或是赋值,在你form.cs里你不用关心怎么去读xml或是txt的文本, 又能像写按钮菜单等事件一样,修改界面的语言,我要的就是一种懒人的做法,操作简单的实现

  1. /*
  2. 我的代码的思想是:
  3. 在窗体类中,窗体作为观察者,监视CultureInfo对象,
  4. CultureInfo的改变,将激发界面语言的改变,
  5. 所以,在form类中建立观察者的基类,并注册事件,
  6. CultureInfo的改变要使得ILocalizableLanguage 接口对象的改变,
  7. 而用工厂方法返回依据CultureInfo创建的不同的语言对象!
  8.  * 
  9.  */
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Text;
  13. using System.Globalization;
  14. using System.IO;
  15. namespace LocalizableLanguage
  16. {
  17.     /// <summary>
  18.     /// 观察目标对象,窗体FORM作为观察者
  19.     /// </summary>
  20.     public class SubjectLanguageObserver
  21.     {
  22.         private CultureInfo thisCulture;//具体的观察目标
  23.         public CultureInfo ThisCulture
  24.         {
  25.             get { return thisCulture; }
  26.             set { thisCulture = value; }
  27.         }
  28.        
  29.         /// <summary>
  30.         /// 定义一个Delegate,用来规范函数结构。
  31.         /// 在激发事件时,函数会传递观察目标对象LanguageObserverSubject--》thisCulture和读到的数据
  32.         /// </summary>
  33.         /// <param name="sender">LanguageObserverSubject</param>
  34.         /// <param name="e">CultureInfoEventArgs</param>
  35.         public delegate void CultureInfoEventHandler(Object sender, CultureInfoEventArgs e);
  36.         /// <summary>
  37.         /// 让观察者FORM注册delegate事件CultureInfoEventHandler
  38.         /// </summary>
  39.         public event CultureInfoEventHandler CultureInfoChanged;    //声明事件
  40.        
  41.         protected virtual void OnCultureInfoChanged(CultureInfoEventArgs e)
  42.         {
  43.             if (CultureInfoChanged != null)//如果有对象注册
  44.             {
  45.                 CultureInfoChanged(this, e);//调用所有注册对象的方法
  46.             }
  47.         }
  48.         /// <summary>
  49.         /// 触发具体的观察目标的状态改变,改变 CultureInfo即改变UI的语言
  50.         /// </summary>
  51.         public void CultureInfoChangeUILanguage()
  52.         {
  53.             CultureInfoEventArgs e = new CultureInfoEventArgs(thisCulture);
  54.             OnCultureInfoChanged(e);
  55.         }
  56.         public void CultureInfoChangeUILanguage(CultureInfo c)
  57.         {
  58.             thisCulture = c;
  59.             CultureInfoEventArgs e = new CultureInfoEventArgs(c);
  60.             OnCultureInfoChanged(e);
  61.         }
  62.         public void CultureInfoChangeUILanguage(int cl_id)
  63.         {
  64.             thisCulture = new CultureInfo(cl_id);
  65.             CultureInfoEventArgs e = new CultureInfoEventArgs(thisCulture);
  66.             OnCultureInfoChanged(e);
  67.         }
  68.         /// <summary>
  69.         /// 传递给Observer所感兴趣的信息
  70.         /// </summary>
  71.         public class CultureInfoEventArgs : EventArgs
  72.         {
  73.             private readonly CultureInfo culture;
  74.             private readonly ILocalizableLanguage langDictionary;
  75.             public CultureInfoEventArgs(CultureInfo thisCulture)
  76.             {
  77.                 culture = thisCulture;
  78.                 ill = LocalizableLanguageFactory.CreateLocalizableLanguage(thisCulture);
  79.                 langDictionary =ill ;
  80.             }
  81.             
  82.         }
  83.         private static  ILocalizableLanguage ill;
  84.         public ILocalizableLanguage languageDictionary { get { return ill; } }
  85.         public SubjectLanguageObserver()
  86.         {
  87.             if (thisCulture == null)
  88.                 thisCulture = System.Threading.Thread.CurrentThread.CurrentCulture;
  89.             ill = LocalizableLanguageFactory.CreateLocalizableLanguage(thisCulture);
  90.         }
  91.     }
  92.     public interface ILocalizableLanguage {
  93.         string  GetLocalizableLanguageByKey(string key);
  94.     }
  95.     internal abstract class AbstractLocalizableLanguage : ILocalizableLanguage {
  96.         public abstract string GetLocalizableLanguageByKey(string key);
  97.         public abstract IDictionary<stringstring> LoadLanguageFile(string path);
  98.         private IDictionary<stringstring> languageDictionary;
  99.         public IDictionary<stringstring> LanguageDictionary
  100.         {
  101.             get { return languageDictionary; }
  102.             set { languageDictionary = value; }
  103.         }
  104.     }
  105.     #region 生成本地化语言的工厂:LocalizableLanguageFactory
  106.     /// <summary>
  107.     /// 生成本地化语言的工厂
  108.     /// </summary>
  109.     public sealed class LocalizableLanguageFactory
  110.     {
  111.         public LocalizableLanguageFactory() { }
  112.         private static CultureInfo currentCulture;
  113.         public static CultureInfo CurrentCulture
  114.         {
  115.             get { return currentCulture; }
  116.             set { currentCulture = value; }
  117.         }
  118.         public static ILocalizableLanguage CreateLocalizableLanguage()
  119.         {
  120.             return CreateLocalizableLanguage(currentCulture);
  121.         }
  122.         public static ILocalizableLanguage CreateLocalizableLanguage(CultureInfo CurrentUICulture)
  123.         {
  124.             ILocalizableLanguage currentLanguage;
  125.             switch (CurrentUICulture.LCID)
  126.             {
  127.                 case 0x0004:   //zh-Hans  0x0004  中文(简体)                  
  128.                     currentLanguage = new Simplified_Chinese("zh-Hans.lang");
  129.                     break;
  130.                 case 0x0804:  //zh-CN  0x0804  中文(中国)                   
  131.                     currentLanguage = new Simplified_Chinese("zh-CN.lang");
  132.                     break;
  133.                 case 0x0009://en  英语 
  134.                     currentLanguage = new Default("en.lang");
  135.                     break;
  136.                 case 0x0409://en-US 英语(美国)
  137.                     currentLanguage = new Default("en-US.lang");
  138.                     break;
  139.                 case 0x0809://en-GB 英语(英国)  
  140.                     currentLanguage = new Default("en-GB.lang");
  141.                     break;
  142.                 default://""(空字符串)  0x007F  固定区域性 
  143.                     currentLanguage = new Default("Default.lang");
  144.                     break;
  145.             }
  146.             return currentLanguage;
  147.         }
  148.     }
  149.     #endregion
  150.     #region 实现AbstractLanguages的各种语言
  151.     internal sealed class Default : AbstractLocalizableLanguage
  152.     {
  153.         public Default()
  154.         {
  155.             this.LanguageDictionary = new SortedDictionary<stringstring>();
  156.         }
  157.         public Default(string path)
  158.         {
  159.             LanguageDictionary = new SortedDictionary<stringstring>();
  160.             LoadLanguageFile(path);
  161.         }
  162.         public override string GetLocalizableLanguageByKey(string ControlKeyName)
  163.         {
  164.             string txt = string.Empty;
  165.             LanguageDictionary.TryGetValue(ControlKeyName, out txt);
  166.             return txt;
  167.         }
  168.         public override IDictionary<stringstring> LoadLanguageFile(string path)
  169.         {
  170.             if (string.IsNullOrEmpty(path))
  171.             { throw new ArgumentNullException("Path of Language resource file is null value!"); }
  172.             List<string> CtrlValues = new List<string>();
  173.             string Input = null;
  174.             if (File.Exists(System.IO.Path.GetFullPath(path)) == false)
  175.             { throw new NullReferenceException("Can't Find  Language resource file!"); }
  176.             StreamReader SR = File.OpenText(System.IO.Path.GetFullPath(path));
  177.             while ((Input = SR.ReadLine()) != null)
  178.             {
  179.                 CtrlValues.Add(Input);
  180.                 //System.Windows.Forms.MessageBox.Show("Test"+Input);
  181.             }
  182.             for (int i = 0; i < CtrlValues.Count; i++)
  183.             {
  184.                 string[] item = CtrlValues[i].Split('=');
  185.                 if (item.Length >= 2)
  186.                 {
  187.                     //注意:要求读入的字符串key值不能相同                   
  188.                     //将会报ArgumentException                      
  189.                     LanguageDictionary.Add(item[0].TrimEnd(' '), item[1].TrimStart(' ').TrimEnd(';').Trim('"'));
  190.                 }
  191.             }
  192.             SR.Close();
  193.             return LanguageDictionary;
  194.         }
  195.     }
  196.     internal sealed class Simplified_Chinese : AbstractLocalizableLanguage
  197.     {
  198.         public Simplified_Chinese() { this.LanguageDictionary = new SortedDictionary<stringstring>(); }
  199.         public Simplified_Chinese(string path)
  200.         {
  201.             this.LanguageDictionary = new SortedDictionary<stringstring>();
  202.             LoadLanguageFile(path);
  203.         }
  204.         public override string GetLocalizableLanguageByKey(string ControlKeyName)
  205.         {
  206.             string txt = string.Empty;
  207.             LanguageDictionary.TryGetValue(ControlKeyName, out txt);
  208.             return txt;
  209.         }
  210.         public override IDictionary<stringstring> LoadLanguageFile(string path)
  211.         {
  212.             if (string.IsNullOrEmpty(path))
  213.             { throw new ArgumentNullException("Path of Language resource file is null value!"); }
  214.             List<string> CtrlValues = new List<string>();
  215.             string Input = null;
  216.             if (File.Exists(System.IO.Path.GetFullPath(path)) == false)
  217.             { throw new NullReferenceException("Can't Find  Language resource file!"); }
  218.             StreamReader SR = File.OpenText(System.IO.Path.GetFullPath(path));
  219.             while ((Input = SR.ReadLine()) != null)
  220.             {
  221.                 CtrlValues.Add(Input);
  222.                 //System.Windows.Forms.MessageBox.Show("Test"+Input);
  223.             }
  224.             for (int i = 0; i < CtrlValues.Count; i++)
  225.             {
  226.                 string[] item = CtrlValues[i].Split('=');
  227.                 if (item.Length >= 2)
  228.                 {
  229.                     //注意:要求读入的字符串key值不能相同                   
  230.                     //将会报ArgumentException                      
  231.                     LanguageDictionary.Add(item[0].TrimEnd(' '), item[1].TrimStart(' ').TrimEnd(';').Trim('"'));
  232.                 }
  233.             }
  234.             SR.Close();
  235.             return LanguageDictionary;
  236.         }
  237.     }
  238.     #endregion
  239. }

上面是我写的语言本地化的类库,它将依据

  1. /*
  2.  * 
  3. //ArrayList 和 StringCollection 类以及 List 泛型类通过元素的从零开始的索引提供对元素的访问。
  4. //Hashtable、SortedList、ListDictionary 和 StringDictionary 类以及 Dictionary 和 SortedDictionary 泛型类通过元素的键提供对元素的访问。
  5. //NameObjectCollectionBase 和 NameValueCollection 类以及 KeyedCollection 和 SortedList 泛型类通过其元素的从零开始的索引或者通过其元素的键提供对元素的访问。
  6.  * 
  7.  * 
  8.  * ****************
  9.  * CultureInfo 类 *
  10.  * ****************
  11.  * 
  12.  * 
  13.             CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.FrameworkCultures);
  14.             foreach (CultureInfo c in cultures)
  15.             {
  16.                 comboBoxLanguageChoose.Items.Add(c.LCID.ToString ()+"|"+c.Name+"|"+c.EnglishName+"|"+c.DisplayName);
  17.             }
  18. LCID  作为判断序号------ 区域性标识符 
  19.  Name是短名称--- 区域性/语言名称 
  20.  * EnglishName  英文名称
  21.  * DisplayName  系统显示名称--- 固定区域性 
  22.  *  
  23.  * 
  24.  * 
  25.  * 
  26.  * 
  27.  区域性/语言名称 
  28.  区域性标识符 
  29.  区域性 
  30. ""(空字符串) 
  31.  0x007F ===int 127
  32.  固定区域性 
  33. af 
  34.  0x0036 
  35.  南非荷兰语 
  36. af-ZA 
  37.  0x0436 
  38.  南非荷兰语(南非)
  39. sq 
  40.  0x001C 
  41.  阿尔巴尼亚语 
  42. sq-AL 
  43.  0x041C 
  44.  阿尔巴尼亚语(阿尔巴尼亚) 
  45. ar 
  46.  0x0001 
  47.  阿拉伯语 
  48. ar-DZ 
  49.  0x1401 
  50.  阿拉伯语(阿尔及利亚) 
  51. ar-BH 
  52.  0x3C01 
  53.  阿拉伯语(巴林) 
  54. ar-EG 
  55.  0x0C01 
  56.  阿拉伯语(埃及) 
  57. ar-IQ 
  58.  0x0801 
  59.  阿拉伯语(伊拉克) 
  60. ar-JO 
  61.  0x2C01 
  62.  阿拉伯语(约旦) 
  63. ar-KW 
  64.  0x3401 
  65.  阿拉伯语(科威特) 
  66. ar-LB 
  67.  0x3001 
  68.  阿拉伯语(黎巴嫩) 
  69. ar-LY 
  70.  0x1001 
  71.  阿拉伯语(利比亚) 
  72. ar-MA 
  73.  0x1801 
  74.  阿拉伯语(摩洛哥) 
  75. ar-OM 
  76.  0x2001 
  77.  阿拉伯语(阿曼) 
  78. ar-QA 
  79.  0x4001 
  80.  阿拉伯语(卡塔尔) 
  81. ar-SA 
  82.  0x0401 
  83.  阿拉伯语(沙特阿拉伯) 
  84. ar-SY 
  85.  0x2801 
  86.  阿拉伯语(叙利亚) 
  87. ar-TN 
  88.  0x1C01 
  89.  阿拉伯语(突尼斯) 
  90. ar-AE 
  91.  0x3801 
  92.  阿拉伯语(阿联酋) 
  93. ar-YE 
  94.  0x2401 
  95.  阿拉伯语(也门) 
  96. hy 
  97.  0x002B 
  98.  亚美尼亚语 
  99. hy-AM 
  100.  0x042B 
  101.  亚美尼亚语(亚美尼亚) 
  102. az 
  103.  0x002C 
  104.  阿泽里语 
  105. az-Cyrl-AZ 
  106.  0x082C 
  107.  阿泽里语(阿塞拜疆,西里尔语) 
  108. az-Latn-AZ 
  109.  0x042C 
  110.  阿泽里语(阿塞拜疆,拉丁语) 
  111. eu 
  112.  0x002D 
  113.  巴斯克语 
  114. eu-ES 
  115.  0x042D 
  116.  巴斯克语(巴斯克地区) 
  117. be 
  118.  0x0023 
  119.  白俄罗斯语 
  120. be-BY 
  121.  0x0423 
  122.  白俄罗斯语(白俄罗斯) 
  123. bg 
  124.  0x0002 
  125.  保加利亚语 
  126. bg-BG 
  127.  0x0402 
  128.  保加利亚语(保加利亚) 
  129. ca 
  130.  0x0003 
  131.  加泰罗尼亚语 
  132. ca-ES 
  133.  0x0403 
  134.  加泰罗尼亚语(加泰罗尼亚地区) 
  135. zh-HK 
  136.  0x0C04 
  137.  中文(香港特别行政区,中国) 
  138. zh-MO 
  139.  0x1404 
  140.  中文(澳门特别行政区) 
  141. zh-CN 
  142.  0x0804 
  143.  中文(中国) 
  144. zh-Hans 
  145.  0x0004 
  146.  中文(简体) 
  147. zh-SG 
  148.  0x1004 
  149.  中文(新加坡) 
  150. zh-TW 
  151.  0x0404 
  152.  中文(台湾) 
  153. zh-Hant 
  154.  0x7C04 
  155.  中文(繁体) 
  156. hr 
  157.  0x001A 
  158.  克罗地亚语 
  159. hr-HR 
  160.  0x041A 
  161.  克罗地亚语(克罗地亚) 
  162. cs 
  163.  0x0005 
  164.  捷克语 
  165. cs-CZ 
  166.  0x0405 
  167.  捷克语(捷克共和国) 
  168. da 
  169.  0x0006 
  170.  丹麦语 
  171. da-DK 
  172.  0x0406 
  173.  丹麦语(丹麦) 
  174. dv 
  175.  0x0065 
  176.  迪维希语 
  177. dv-MV 
  178.  0x0465 
  179.  迪维希语(马尔代夫) 
  180. nl 
  181.  0x0013 
  182.  荷兰语 
  183. nl-BE 
  184.  0x0813 
  185.  荷兰语(比利时) 
  186. nl-NL 
  187.  0x0413 
  188.  荷兰语(荷兰) 
  189. en 
  190.  0x0009 
  191.  英语 
  192. en-AU 
  193.  0x0C09 
  194.  英语(澳大利亚) 
  195. en-BZ 
  196.  0x2809 
  197.  英语(伯利兹) 
  198. en-CA 
  199.  0x1009 
  200.  英语(加拿大) 
  201. en-029 
  202.  0x2409 
  203.  英语(加勒比) 
  204. en-IE 
  205.  0x1809 
  206.  英语(爱尔兰) 
  207. en-JM 
  208.  0x2009 
  209.  英语(牙买加) 
  210. en-NZ 
  211.  0x1409 
  212.  英语(新西兰) 
  213. en-PH 
  214.  0x3409 
  215.  英语(菲律宾) 
  216. en-ZA 
  217.  0x1C09 
  218.  英语(南非) 
  219. en-TT 
  220.  0x2C09 
  221.  英语(特立尼达和多巴哥) 
  222. en-GB 
  223.  0x0809 
  224.  英语(英国) 
  225. en-US 
  226.  0x0409 
  227.  英语(美国) 
  228. en-ZW 
  229.  0x3009 
  230.  英语(津巴布韦) 
  231. et 
  232.  0x0025 
  233.  爱沙尼亚语 
  234. et-EE 
  235.  0x0425 
  236.  爱沙尼亚语(爱沙尼亚) 
  237. fo 
  238.  0x0038 
  239.  法罗语 
  240. fo-FO 
  241.  0x0438 
  242.  法罗语(法罗群岛) 
  243. fa 
  244.  0x0029 
  245.  波斯语 
  246. fa-IR 
  247.  0x0429 
  248.  波斯语(伊朗) 
  249. fi 
  250.  0x000B 
  251.  芬兰语 
  252. fi-FI 
  253.  0x040B 
  254.  芬兰语(芬兰) 
  255. fr 
  256.  0x000C 
  257.  法语 
  258. fr-BE 
  259.  0x080C 
  260.  法语(比利时) 
  261. fr-CA 
  262.  0x0C0C 
  263.  法语(加拿大) 
  264. fr-FR 
  265.  0x040C 
  266.  法语(法国) 
  267. fr-LU 
  268.  0x140C 
  269.  法语(卢森堡) 
  270. fr-MC 
  271.  0x180C 
  272.  法语(摩纳哥) 
  273. fr-CH 
  274.  0x100C 
  275.  法语(瑞士) 
  276. gl 
  277.  0x0056 
  278.  加利西亚语 
  279. gl-ES 
  280.  0x0456 
  281.  加利西亚语(西班牙) 
  282. ka 
  283.  0x0037 
  284.  格鲁吉亚语 
  285. ka-GE 
  286.  0x0437 
  287.  格鲁吉亚语(格鲁吉亚) 
  288. de 
  289.  0x0007 
  290.  德语 
  291. de-AT 
  292.  0x0C07 
  293.  德语(奥地利) 
  294. de-DE 
  295.  0x0407 
  296.  德语(德国) 
  297. de-LI 
  298.  0x1407 
  299.  德语(列支敦士登) 
  300. de-LU 
  301.  0x1007 
  302.  德语(卢森堡) 
  303. de-CH 
  304.  0x0807 
  305.  德语(瑞士) 
  306. el 
  307.  0x0008 
  308.  希腊语 
  309. el-GR 
  310.  0x0408 
  311.  希腊语(希腊) 
  312. gu 
  313.  0x0047 
  314.  古吉拉特语 
  315. gu-IN 
  316.  0x0447 
  317.  古吉拉特语(印度) 
  318. he 
  319.  0x000D 
  320.  希伯来语 
  321. he-IL 
  322.  0x040D 
  323.  希伯来语(以色列) 
  324. hi 
  325.  0x0039 
  326.  印地语 
  327. hi-IN 
  328.  0x0439 
  329.  印地语(印度) 
  330. hu 
  331.  0x000E 
  332.  匈牙利语 
  333. hu-HU 
  334.  0x040E 
  335.  匈牙利语(匈牙利) 
  336. is 
  337.  0x000F 
  338.  冰岛语 
  339. is-IS 
  340.  0x040F 
  341.  冰岛语(冰岛) 
  342. id 
  343.  0x0021 
  344.  印度尼西亚语 
  345. id-ID 
  346.  0x0421 
  347.  印度尼西亚语(印度尼西亚) 
  348. it 
  349.  0x0010 
  350.  意大利语 
  351. it-IT 
  352.  0x0410 
  353.  意大利语(意大利) 
  354. it-CH 
  355.  0x0810 
  356.  意大利语(瑞士) 
  357. ja 
  358.  0x0011 
  359.  日语 
  360. ja-JP 
  361.  0x0411 
  362.  日语(日本) 
  363. kn 
  364.  0x004B 
  365.  卡纳达语 
  366. kn-IN 
  367.  0x044B 
  368.  卡纳达语(印度) 
  369. kk 
  370.  0x003F 
  371.  哈萨克语 
  372. kk-KZ 
  373.  0x043F 
  374.  哈萨克语(哈萨克斯坦) 
  375. kok 
  376.  0x0057 
  377.  贡根语 
  378. kok-IN 
  379.  0x0457 
  380.  贡根语(印度) 
  381. ko 
  382.  0x0012 
  383.  朝鲜语 
  384. ko-KR 
  385.  0x0412 
  386.  朝鲜语(韩国) 
  387. ky 
  388.  0x0040 
  389.  吉尔吉斯语 
  390. ky-KG 
  391.  0x0440 
  392.  吉尔吉斯语(吉尔吉斯坦) 
  393. lv 
  394.  0x0026 
  395.  拉脱维亚语 
  396. lv-LV 
  397.  0x0426 
  398.  拉脱维亚语(拉脱维亚) 
  399. lt 
  400.  0x0027 
  401.  立陶宛语 
  402. lt-LT 
  403.  0x0427 
  404.  立陶宛语(立陶宛) 
  405. mk 
  406.  0x002F 
  407.  马其顿语 
  408. mk-MK 
  409.  0x042F 
  410.  马其顿语(马其顿,FYROM) 
  411. ms 
  412.  0x003E 
  413.  马来语 
  414. ms-BN 
  415.  0x083E 
  416.  马来语(文莱达鲁萨兰) 
  417. ms-MY 
  418.  0x043E 
  419.  马来语(马来西亚) 
  420. mr 
  421.  0x004E 
  422.  马拉地语 
  423. mr-IN 
  424.  0x044E 
  425.  马拉地语(印度) 
  426. mn 
  427.  0x0050 
  428.  蒙古语 
  429. mn-MN 
  430.  0x0450 
  431.  蒙古语(蒙古) 
  432. no 
  433.  0x0014 
  434.  挪威语 
  435. nb-NO 
  436.  0x0414 
  437.  挪威语(伯克梅尔,挪威) 
  438. nn-NO 
  439.  0x0814 
  440.  挪威语(尼诺斯克,挪威) 
  441. pl 
  442.  0x0015 
  443.  波兰语 
  444. pl-PL 
  445.  0x0415 
  446.  波兰语(波兰) 
  447. pt 
  448.  0x0016 
  449.  葡萄牙语 
  450. pt-BR 
  451.  0x0416 
  452.  葡萄牙语(巴西) 
  453. pt-PT 
  454.  0x0816 
  455.  葡萄牙语(葡萄牙) 
  456. pa 
  457.  0x0046 
  458.  旁遮普语 
  459. pa-IN 
  460.  0x0446 
  461.  旁遮普语(印度) 
  462. ro 
  463.  0x0018 
  464.  罗马尼亚语 
  465. ro-RO 
  466.  0x0418 
  467.  罗马尼亚语(罗马尼亚) 
  468. ru 
  469.  0x0019 
  470.  俄语 
  471. ru-RU 
  472.  0x0419 
  473.  俄语(俄罗斯) 
  474. sa 
  475.  0x004F 
  476.  梵语 
  477. sa-IN 
  478.  0x044F 
  479.  梵语(印度) 
  480. sr-Cyrl-CS 
  481.  0x0C1A 
  482.  塞尔维亚语(塞尔维亚,西里尔语) 
  483. sr-Latn-CS 
  484.  0x081A 
  485.  塞尔维亚语(塞尔维亚,拉丁语) 
  486. sk 
  487.  0x001B 
  488.  斯洛伐克语 
  489. sk-SK 
  490.  0x041B 
  491.  斯洛伐克语(斯洛伐克) 
  492. sl 
  493.  0x0024 
  494.  斯洛文尼亚语 
  495. sl-SI 
  496.  0x0424 
  497.  斯洛文尼亚语(斯洛文尼亚) 
  498. es 
  499.  0x000A 
  500.  西班牙语 
  501. es-AR 
  502.  0x2C0A 
  503.  西班牙语(阿根廷) 
  504. es-BO 
  505.  0x400A 
  506.  西班牙语(玻利维亚) 
  507. es-CL 
  508.  0x340A 
  509.  西班牙语(智利) 
  510. es-CO 
  511.  0x240A 
  512.  西班牙语(哥伦比亚) 
  513. es-CR 
  514.  0x140A 
  515.  西班牙语(哥斯达黎加) 
  516. es-DO 
  517.  0x1C0A 
  518.  西班牙语(多米尼加共和国)
  519. es-EC 
  520.  0x300A 
  521.  西班牙语(厄瓜多尔) 
  522. es-SV 
  523.  0x440A 
  524.  西班牙语(萨尔瓦多) 
  525. es-GT 
  526.  0x100A 
  527.  西班牙语(危地马拉) 
  528. es-HN 
  529.  0x480A 
  530.  西班牙语(洪都拉斯) 
  531. es-MX 
  532.  0x080A 
  533.  西班牙语(墨西哥) 
  534. es-NI 
  535.  0x4C0A 
  536.  西班牙语(尼加拉瓜) 
  537. es-PA 
  538.  0x180A 
  539.  西班牙语(巴拿马) 
  540. es-PY 
  541.  0x3C0A 
  542.  西班牙语(巴拉圭) 
  543. es-PE 
  544.  0x280A 
  545.  西班牙语(秘鲁) 
  546. es-PR 
  547.  0x500A 
  548.  西班牙语(波多黎各) 
  549. es-ES 
  550.  0x0C0A 
  551.  西班牙语(西班牙) 
  552. es-ES_tradnl
  553.  0x040A
  554.  西班牙语(西班牙,传统排序)
  555. es-UY 
  556.  0x380A 
  557.  西班牙语(乌拉圭) 
  558. es-VE 
  559.  0x200A 
  560.  西班牙语(委内瑞拉) 
  561. sw 
  562.  0x0041 
  563.  斯瓦希里语 
  564. sw-KE 
  565.  0x0441 
  566.  斯瓦希里语(肯尼亚) 
  567. sv 
  568.  0x001D 
  569.  瑞典语 
  570. sv-FI 
  571.  0x081D 
  572.  瑞典语(芬兰) 
  573. sv-SE 
  574.  0x041D 
  575.  瑞典语(瑞典) 
  576. syr 
  577.  0x005A 
  578.  叙利亚语 
  579. syr-SY 
  580.  0x045A 
  581.  叙利亚语(叙利亚) 
  582. ta 
  583.  0x0049 
  584.  泰米尔语 
  585. ta-IN 
  586.  0x0449 
  587.  泰米尔语(印度) 
  588. tt 
  589.  0x0044 
  590.  鞑靼语 
  591. tt-RU 
  592.  0x0444 
  593.  鞑靼语(俄罗斯) 
  594. te 
  595.  0x004A 
  596.  泰卢固语 
  597. te-IN 
  598.  0x044A 
  599.  泰卢固语(印度) 
  600. th 
  601.  0x001E 
  602.  泰语 
  603. th-TH 
  604.  0x041E 
  605.  泰语(泰国) 
  606. tr 
  607.  0x001F 
  608.  土耳其语 
  609. tr-TR 
  610.  0x041F 
  611.  土耳其语(土耳其) 
  612. uk 
  613.  0x0022 
  614.  乌克兰语 
  615. uk-UA 
  616.  0x0422 
  617.  乌克兰语(乌克兰) 
  618. ur 
  619.  0x0020 
  620.  乌尔都语 
  621. ur-PK 
  622.  0x0420 
  623.  乌尔都语(巴基斯坦) 
  624. uz 
  625.  0x0043 
  626.  乌兹别克语 
  627. uz-Cyrl-UZ 
  628.  0x0843 
  629.  乌兹别克语(乌兹别克斯坦,西里尔语) 
  630. uz-Latn-UZ 
  631.  0x0443 
  632.  乌兹别克语(乌兹别克斯坦,拉丁语) 
  633. vi 
  634.  0x002A 
  635.  越南语 
  636. vi-VN 
  637.  0x042A 
  638.  越南语(越南)
  639.  */

 

在LocalizableLanguageFactory里的     public static ILocalizableLanguage CreateLocalizableLanguage(CultureInfo CurrentUICulture)

依据微软的定义 CurrentUICulture.LCID ,可以自己扩充需要的界面语言文件

 currentLanguage = new Default("Default.lang");

 

构造函数里传入你的资源文件路径名称,它可以是多样化的,我是使用简单的文本文件,也可以是xml或者其它的资源文件,这决定了具体产品实现抽象类AbstractLocalizableLanguage 后,如何读取与返回产品

 internal abstract class AbstractLocalizableLanguage : ILocalizableLanguage {
        public abstract string GetLocalizableLanguageByKey(string key);
        public abstract IDictionary<string, string> LoadLanguageFile(string path);
......

}

 

LoadLanguageFile方法是关键,不管你使用什么样的文件,我个人认为都会返回一个你要用的结果集,我为了方便就使用了IDictionary泛型接口

 

而在实际界面中,我就能很简单的使用,我代码的缺点是,比较烦的传SubjectLanguageObserver对象,就是说项目的窗体和其他类中使用,都要传SubjectLanguageObserver对象和增加注册事件

 LOS.CultureInfoChanged += new SubjectLanguageObserver.CultureInfoEventHandler(LOS_CultureInfoChanged);          
  LOS.CultureInfoChangeUILanguage(System.Threading.Thread.CurrentThread.CurrentCulture);    

这样才能改变窗体的语言文本值或类中的 MessageBox.Show等等

 

具体使用如同此法:

  1. suing System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. using LocalizableLanguage;
  9. namespace LocalizableLanguageTestForm
  10. {
  11.     public partial class MainForm : Form
  12.     {
  13.         public MainForm()
  14.         {
  15.             InitializeComponent();
  16.         }
  17.         public MainForm(SubjectLanguageObserver slo)
  18.         {
  19.             LOS = slo;
  20.             InitializeComponent();
  21.         }
  22.         SubjectLanguageObserver LOS = null;
  23.         public SubjectLanguageObserver _LOS
  24.         {
  25.             get { return LOS; }
  26.             set { LOS = value; }
  27.         }
  28.         private void englishToolStripMenuItem_Click(object sender, EventArgs e)
  29.         {
  30.             LOS.CultureInfoChangeUILanguage(0x0809);
  31.         }
  32.         private void simplifiedChineseToolStripMenuItem_Click(object sender, EventArgs e)
  33.         {
  34.             LOS.CultureInfoChangeUILanguage(0x0804);
  35.         }
  36.         private void MainForm_Load(object sender, EventArgs e)
  37.         {
  38.             if(LOS !=null )
  39.                 LOS.CultureInfoChanged += new SubjectLanguageObserver.CultureInfoEventHandler(LOS_CultureInfoChanged);
  40.         }
  41.         private void LOS_CultureInfoChanged(object sender, SubjectLanguageObserver.CultureInfoEventArgs e)
  42.         {
  43.             languageToolStripMenuItem.Text = LOS.languageDictionary.GetLocalizableLanguageByKey("MainForm.languageToolStripMenuItem.Text");
  44.             englishToolStripMenuItem.Text= LOS.languageDictionary.GetLocalizableLanguageByKey("MainForm.englishToolStripMenuItem.Text");
  45.             simplifiedChineseToolStripMenuItem.Text= LOS.languageDictionary.GetLocalizableLanguageByKey("MainForm.simplifiedChineseToolStripMenuItem.Text");
  46.             columnHeaderNo.Text= LOS.languageDictionary.GetLocalizableLanguageByKey("MainForm.columnHeaderNo.Text");
  47.             columnHeaderName.Text =  LOS.languageDictionary.GetLocalizableLanguageByKey("MainForm.columnHeaderName.Text");
  48.             columnHeaderPhone.Text = LOS.languageDictionary.GetLocalizableLanguageByKey("MainForm.columnHeaderPhone.Text");
  49.             columnHeaderEmail.Text =LOS.languageDictionary.GetLocalizableLanguageByKey("MainForm.columnHeaderEmail.Text");
  50.             toolStripStatusLabel1.Text = LOS.languageDictionary.GetLocalizableLanguageByKey("MainForm.toolStripStatusLabel1.Text");
  51.         }
  52.     }
  53. }

 

语言文件内容:

-------------------------------------------

Default.lang   /  en-GB.lang

-------------------------------------------

StartForm.buttonOK.Text="OK";
StartForm.labelLanguageChoose.Text="Language Choose";

MainForm.languageToolStripMenuItem.Text="language";
MainForm.englishToolStripMenuItem.Text="english";
MainForm.simplifiedChineseToolStripMenuItem.Text="simplified Chinese";
MainForm.columnHeaderNo.Text="No.";
MainForm.columnHeaderName.Text="Name";
MainForm.columnHeaderPhone.Text="Phone";
MainForm.columnHeaderEmail.Text="Email";
MainForm.toolStripStatusLabel1.Text="Status";

........

************************************************************

zh-CN.lang

-------------------------------------------

StartForm.buttonOK.Text="确定";
StartForm.labelLanguageChoose.Text="选择语言";

MainForm.languageToolStripMenuItem.Text="语言";
MainForm.englishToolStripMenuItem.Text="英语";
MainForm.simplifiedChineseToolStripMenuItem.Text="中文";
MainForm.columnHeaderNo.Text="编号";
MainForm.columnHeaderName.Text="姓名";
MainForm.columnHeaderPhone.Text="电话";
MainForm.columnHeaderEmail.Text="电子邮件";
MainForm.toolStripStatusLabel1.Text="状态";

.....

 

 

 

 

 

 

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值