前日看了一个帖子,其实也是困扰了我好些日子的问题-------winforn 下的多语言本地化实现,公司的小项目有个winforn通信程序,需要支持中英文,就学着用了.net的资源文件 。但是,对于多线程跨窗体调用的控件,其它类中的消息框,异常信息,等输出到界面的文字内容并不是很好的处理 ,苦苦想了很久,没找到正解!过了一个月,在看到这个帖子时才下决心!
希望用设计模式和委托的方式解决。 这样只要在类中new个对象,注册事件,当CultureInfo对象改变时,触发事件来改变界面语言,现在终于想通了点。
1.
我代码实现的原理和基本思路是这个意思;
FORM观察CultureInfo的改变,目标对象CultureInfo用工厂取回对应的语言产品
2.
我的本意不是为了用设计模式,而是在你用菜单选哪一个语言更新界面时,很简单的调用一个方法或是赋值,在你form.cs里你不用关心怎么去读xml或是txt的文本, 又能像写按钮菜单等事件一样,修改界面的语言,我要的就是一种懒人的做法,操作简单的实现
- /*
- 我的代码的思想是:
- 在窗体类中,窗体作为观察者,监视CultureInfo对象,
- CultureInfo的改变,将激发界面语言的改变,
- 所以,在form类中建立观察者的基类,并注册事件,
- CultureInfo的改变要使得ILocalizableLanguage 接口对象的改变,
- 而用工厂方法返回依据CultureInfo创建的不同的语言对象!
- *
- */
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Globalization;
- using System.IO;
- namespace LocalizableLanguage
- {
- /// <summary>
- /// 观察目标对象,窗体FORM作为观察者
- /// </summary>
- public class SubjectLanguageObserver
- {
- private CultureInfo thisCulture;//具体的观察目标
- public CultureInfo ThisCulture
- {
- get { return thisCulture; }
- set { thisCulture = value; }
- }
- /// <summary>
- /// 定义一个Delegate,用来规范函数结构。
- /// 在激发事件时,函数会传递观察目标对象LanguageObserverSubject--》thisCulture和读到的数据
- /// </summary>
- /// <param name="sender">LanguageObserverSubject</param>
- /// <param name="e">CultureInfoEventArgs</param>
- public delegate void CultureInfoEventHandler(Object sender, CultureInfoEventArgs e);
- /// <summary>
- /// 让观察者FORM注册delegate事件CultureInfoEventHandler
- /// </summary>
- public event CultureInfoEventHandler CultureInfoChanged; //声明事件
- protected virtual void OnCultureInfoChanged(CultureInfoEventArgs e)
- {
- if (CultureInfoChanged != null)//如果有对象注册
- {
- CultureInfoChanged(this, e);//调用所有注册对象的方法
- }
- }
- /// <summary>
- /// 触发具体的观察目标的状态改变,改变 CultureInfo即改变UI的语言
- /// </summary>
- public void CultureInfoChangeUILanguage()
- {
- CultureInfoEventArgs e = new CultureInfoEventArgs(thisCulture);
- OnCultureInfoChanged(e);
- }
- public void CultureInfoChangeUILanguage(CultureInfo c)
- {
- thisCulture = c;
- CultureInfoEventArgs e = new CultureInfoEventArgs(c);
- OnCultureInfoChanged(e);
- }
- public void CultureInfoChangeUILanguage(int cl_id)
- {
- thisCulture = new CultureInfo(cl_id);
- CultureInfoEventArgs e = new CultureInfoEventArgs(thisCulture);
- OnCultureInfoChanged(e);
- }
- /// <summary>
- /// 传递给Observer所感兴趣的信息
- /// </summary>
- public class CultureInfoEventArgs : EventArgs
- {
- private readonly CultureInfo culture;
- private readonly ILocalizableLanguage langDictionary;
- public CultureInfoEventArgs(CultureInfo thisCulture)
- {
- culture = thisCulture;
- ill = LocalizableLanguageFactory.CreateLocalizableLanguage(thisCulture);
- langDictionary =ill ;
- }
- }
- private static ILocalizableLanguage ill;
- public ILocalizableLanguage languageDictionary { get { return ill; } }
- public SubjectLanguageObserver()
- {
- if (thisCulture == null)
- thisCulture = System.Threading.Thread.CurrentThread.CurrentCulture;
- ill = LocalizableLanguageFactory.CreateLocalizableLanguage(thisCulture);
- }
- }
- public interface ILocalizableLanguage {
- string GetLocalizableLanguageByKey(string key);
- }
- internal abstract class AbstractLocalizableLanguage : ILocalizableLanguage {
- public abstract string GetLocalizableLanguageByKey(string key);
- public abstract IDictionary<string, string> LoadLanguageFile(string path);
- private IDictionary<string, string> languageDictionary;
- public IDictionary<string, string> LanguageDictionary
- {
- get { return languageDictionary; }
- set { languageDictionary = value; }
- }
- }
- #region 生成本地化语言的工厂:LocalizableLanguageFactory
- /// <summary>
- /// 生成本地化语言的工厂
- /// </summary>
- public sealed class LocalizableLanguageFactory
- {
- public LocalizableLanguageFactory() { }
- private static CultureInfo currentCulture;
- public static CultureInfo CurrentCulture
- {
- get { return currentCulture; }
- set { currentCulture = value; }
- }
- public static ILocalizableLanguage CreateLocalizableLanguage()
- {
- return CreateLocalizableLanguage(currentCulture);
- }
- public static ILocalizableLanguage CreateLocalizableLanguage(CultureInfo CurrentUICulture)
- {
- ILocalizableLanguage currentLanguage;
- switch (CurrentUICulture.LCID)
- {
- case 0x0004: //zh-Hans 0x0004 中文(简体)
- currentLanguage = new Simplified_Chinese("zh-Hans.lang");
- break;
- case 0x0804: //zh-CN 0x0804 中文(中国)
- currentLanguage = new Simplified_Chinese("zh-CN.lang");
- break;
- case 0x0009://en 英语
- currentLanguage = new Default("en.lang");
- break;
- case 0x0409://en-US 英语(美国)
- currentLanguage = new Default("en-US.lang");
- break;
- case 0x0809://en-GB 英语(英国)
- currentLanguage = new Default("en-GB.lang");
- break;
- default://""(空字符串) 0x007F 固定区域性
- currentLanguage = new Default("Default.lang");
- break;
- }
- return currentLanguage;
- }
- }
- #endregion
- #region 实现AbstractLanguages的各种语言
- internal sealed class Default : AbstractLocalizableLanguage
- {
- public Default()
- {
- this.LanguageDictionary = new SortedDictionary<string, string>();
- }
- public Default(string path)
- {
- LanguageDictionary = new SortedDictionary<string, string>();
- LoadLanguageFile(path);
- }
- public override string GetLocalizableLanguageByKey(string ControlKeyName)
- {
- string txt = string.Empty;
- LanguageDictionary.TryGetValue(ControlKeyName, out txt);
- return txt;
- }
- public override IDictionary<string, string> LoadLanguageFile(string path)
- {
- if (string.IsNullOrEmpty(path))
- { throw new ArgumentNullException("Path of Language resource file is null value!"); }
- List<string> CtrlValues = new List<string>();
- string Input = null;
- if (File.Exists(System.IO.Path.GetFullPath(path)) == false)
- { throw new NullReferenceException("Can't Find Language resource file!"); }
- StreamReader SR = File.OpenText(System.IO.Path.GetFullPath(path));
- while ((Input = SR.ReadLine()) != null)
- {
- CtrlValues.Add(Input);
- //System.Windows.Forms.MessageBox.Show("Test"+Input);
- }
- for (int i = 0; i < CtrlValues.Count; i++)
- {
- string[] item = CtrlValues[i].Split('=');
- if (item.Length >= 2)
- {
- //注意:要求读入的字符串key值不能相同
- //将会报ArgumentException
- LanguageDictionary.Add(item[0].TrimEnd(' '), item[1].TrimStart(' ').TrimEnd(';').Trim('"'));
- }
- }
- SR.Close();
- return LanguageDictionary;
- }
- }
- internal sealed class Simplified_Chinese : AbstractLocalizableLanguage
- {
- public Simplified_Chinese() { this.LanguageDictionary = new SortedDictionary<string, string>(); }
- public Simplified_Chinese(string path)
- {
- this.LanguageDictionary = new SortedDictionary<string, string>();
- LoadLanguageFile(path);
- }
- public override string GetLocalizableLanguageByKey(string ControlKeyName)
- {
- string txt = string.Empty;
- LanguageDictionary.TryGetValue(ControlKeyName, out txt);
- return txt;
- }
- public override IDictionary<string, string> LoadLanguageFile(string path)
- {
- if (string.IsNullOrEmpty(path))
- { throw new ArgumentNullException("Path of Language resource file is null value!"); }
- List<string> CtrlValues = new List<string>();
- string Input = null;
- if (File.Exists(System.IO.Path.GetFullPath(path)) == false)
- { throw new NullReferenceException("Can't Find Language resource file!"); }
- StreamReader SR = File.OpenText(System.IO.Path.GetFullPath(path));
- while ((Input = SR.ReadLine()) != null)
- {
- CtrlValues.Add(Input);
- //System.Windows.Forms.MessageBox.Show("Test"+Input);
- }
- for (int i = 0; i < CtrlValues.Count; i++)
- {
- string[] item = CtrlValues[i].Split('=');
- if (item.Length >= 2)
- {
- //注意:要求读入的字符串key值不能相同
- //将会报ArgumentException
- LanguageDictionary.Add(item[0].TrimEnd(' '), item[1].TrimStart(' ').TrimEnd(';').Trim('"'));
- }
- }
- SR.Close();
- return LanguageDictionary;
- }
- }
- #endregion
- }
上面是我写的语言本地化的类库,它将依据
- /*
- *
- //ArrayList 和 StringCollection 类以及 List 泛型类通过元素的从零开始的索引提供对元素的访问。
- //Hashtable、SortedList、ListDictionary 和 StringDictionary 类以及 Dictionary 和 SortedDictionary 泛型类通过元素的键提供对元素的访问。
- //NameObjectCollectionBase 和 NameValueCollection 类以及 KeyedCollection 和 SortedList 泛型类通过其元素的从零开始的索引或者通过其元素的键提供对元素的访问。
- *
- *
- * ****************
- * CultureInfo 类 *
- * ****************
- *
- *
- CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.FrameworkCultures);
- foreach (CultureInfo c in cultures)
- {
- comboBoxLanguageChoose.Items.Add(c.LCID.ToString ()+"|"+c.Name+"|"+c.EnglishName+"|"+c.DisplayName);
- }
- LCID 作为判断序号------ 区域性标识符
- Name是短名称--- 区域性/语言名称
- * EnglishName 英文名称
- * DisplayName 系统显示名称--- 固定区域性
- *
- *
- *
- *
- *
- 区域性/语言名称
- 区域性标识符
- 区域性
- ""(空字符串)
- 0x007F ===int 127
- 固定区域性
- af
- 0x0036
- 南非荷兰语
- af-ZA
- 0x0436
- 南非荷兰语(南非)
- sq
- 0x001C
- 阿尔巴尼亚语
- sq-AL
- 0x041C
- 阿尔巴尼亚语(阿尔巴尼亚)
- ar
- 0x0001
- 阿拉伯语
- ar-DZ
- 0x1401
- 阿拉伯语(阿尔及利亚)
- ar-BH
- 0x3C01
- 阿拉伯语(巴林)
- ar-EG
- 0x0C01
- 阿拉伯语(埃及)
- ar-IQ
- 0x0801
- 阿拉伯语(伊拉克)
- ar-JO
- 0x2C01
- 阿拉伯语(约旦)
- ar-KW
- 0x3401
- 阿拉伯语(科威特)
- ar-LB
- 0x3001
- 阿拉伯语(黎巴嫩)
- ar-LY
- 0x1001
- 阿拉伯语(利比亚)
- ar-MA
- 0x1801
- 阿拉伯语(摩洛哥)
- ar-OM
- 0x2001
- 阿拉伯语(阿曼)
- ar-QA
- 0x4001
- 阿拉伯语(卡塔尔)
- ar-SA
- 0x0401
- 阿拉伯语(沙特阿拉伯)
- ar-SY
- 0x2801
- 阿拉伯语(叙利亚)
- ar-TN
- 0x1C01
- 阿拉伯语(突尼斯)
- ar-AE
- 0x3801
- 阿拉伯语(阿联酋)
- ar-YE
- 0x2401
- 阿拉伯语(也门)
- hy
- 0x002B
- 亚美尼亚语
- hy-AM
- 0x042B
- 亚美尼亚语(亚美尼亚)
- az
- 0x002C
- 阿泽里语
- az-Cyrl-AZ
- 0x082C
- 阿泽里语(阿塞拜疆,西里尔语)
- az-Latn-AZ
- 0x042C
- 阿泽里语(阿塞拜疆,拉丁语)
- eu
- 0x002D
- 巴斯克语
- eu-ES
- 0x042D
- 巴斯克语(巴斯克地区)
- be
- 0x0023
- 白俄罗斯语
- be-BY
- 0x0423
- 白俄罗斯语(白俄罗斯)
- bg
- 0x0002
- 保加利亚语
- bg-BG
- 0x0402
- 保加利亚语(保加利亚)
- ca
- 0x0003
- 加泰罗尼亚语
- ca-ES
- 0x0403
- 加泰罗尼亚语(加泰罗尼亚地区)
- zh-HK
- 0x0C04
- 中文(香港特别行政区,中国)
- zh-MO
- 0x1404
- 中文(澳门特别行政区)
- zh-CN
- 0x0804
- 中文(中国)
- zh-Hans
- 0x0004
- 中文(简体)
- zh-SG
- 0x1004
- 中文(新加坡)
- zh-TW
- 0x0404
- 中文(台湾)
- zh-Hant
- 0x7C04
- 中文(繁体)
- hr
- 0x001A
- 克罗地亚语
- hr-HR
- 0x041A
- 克罗地亚语(克罗地亚)
- cs
- 0x0005
- 捷克语
- cs-CZ
- 0x0405
- 捷克语(捷克共和国)
- da
- 0x0006
- 丹麦语
- da-DK
- 0x0406
- 丹麦语(丹麦)
- dv
- 0x0065
- 迪维希语
- dv-MV
- 0x0465
- 迪维希语(马尔代夫)
- nl
- 0x0013
- 荷兰语
- nl-BE
- 0x0813
- 荷兰语(比利时)
- nl-NL
- 0x0413
- 荷兰语(荷兰)
- en
- 0x0009
- 英语
- en-AU
- 0x0C09
- 英语(澳大利亚)
- en-BZ
- 0x2809
- 英语(伯利兹)
- en-CA
- 0x1009
- 英语(加拿大)
- en-029
- 0x2409
- 英语(加勒比)
- en-IE
- 0x1809
- 英语(爱尔兰)
- en-JM
- 0x2009
- 英语(牙买加)
- en-NZ
- 0x1409
- 英语(新西兰)
- en-PH
- 0x3409
- 英语(菲律宾)
- en-ZA
- 0x1C09
- 英语(南非)
- en-TT
- 0x2C09
- 英语(特立尼达和多巴哥)
- en-GB
- 0x0809
- 英语(英国)
- en-US
- 0x0409
- 英语(美国)
- en-ZW
- 0x3009
- 英语(津巴布韦)
- et
- 0x0025
- 爱沙尼亚语
- et-EE
- 0x0425
- 爱沙尼亚语(爱沙尼亚)
- fo
- 0x0038
- 法罗语
- fo-FO
- 0x0438
- 法罗语(法罗群岛)
- fa
- 0x0029
- 波斯语
- fa-IR
- 0x0429
- 波斯语(伊朗)
- fi
- 0x000B
- 芬兰语
- fi-FI
- 0x040B
- 芬兰语(芬兰)
- fr
- 0x000C
- 法语
- fr-BE
- 0x080C
- 法语(比利时)
- fr-CA
- 0x0C0C
- 法语(加拿大)
- fr-FR
- 0x040C
- 法语(法国)
- fr-LU
- 0x140C
- 法语(卢森堡)
- fr-MC
- 0x180C
- 法语(摩纳哥)
- fr-CH
- 0x100C
- 法语(瑞士)
- gl
- 0x0056
- 加利西亚语
- gl-ES
- 0x0456
- 加利西亚语(西班牙)
- ka
- 0x0037
- 格鲁吉亚语
- ka-GE
- 0x0437
- 格鲁吉亚语(格鲁吉亚)
- de
- 0x0007
- 德语
- de-AT
- 0x0C07
- 德语(奥地利)
- de-DE
- 0x0407
- 德语(德国)
- de-LI
- 0x1407
- 德语(列支敦士登)
- de-LU
- 0x1007
- 德语(卢森堡)
- de-CH
- 0x0807
- 德语(瑞士)
- el
- 0x0008
- 希腊语
- el-GR
- 0x0408
- 希腊语(希腊)
- gu
- 0x0047
- 古吉拉特语
- gu-IN
- 0x0447
- 古吉拉特语(印度)
- he
- 0x000D
- 希伯来语
- he-IL
- 0x040D
- 希伯来语(以色列)
- hi
- 0x0039
- 印地语
- hi-IN
- 0x0439
- 印地语(印度)
- hu
- 0x000E
- 匈牙利语
- hu-HU
- 0x040E
- 匈牙利语(匈牙利)
- is
- 0x000F
- 冰岛语
- is-IS
- 0x040F
- 冰岛语(冰岛)
- id
- 0x0021
- 印度尼西亚语
- id-ID
- 0x0421
- 印度尼西亚语(印度尼西亚)
- it
- 0x0010
- 意大利语
- it-IT
- 0x0410
- 意大利语(意大利)
- it-CH
- 0x0810
- 意大利语(瑞士)
- ja
- 0x0011
- 日语
- ja-JP
- 0x0411
- 日语(日本)
- kn
- 0x004B
- 卡纳达语
- kn-IN
- 0x044B
- 卡纳达语(印度)
- kk
- 0x003F
- 哈萨克语
- kk-KZ
- 0x043F
- 哈萨克语(哈萨克斯坦)
- kok
- 0x0057
- 贡根语
- kok-IN
- 0x0457
- 贡根语(印度)
- ko
- 0x0012
- 朝鲜语
- ko-KR
- 0x0412
- 朝鲜语(韩国)
- ky
- 0x0040
- 吉尔吉斯语
- ky-KG
- 0x0440
- 吉尔吉斯语(吉尔吉斯坦)
- lv
- 0x0026
- 拉脱维亚语
- lv-LV
- 0x0426
- 拉脱维亚语(拉脱维亚)
- lt
- 0x0027
- 立陶宛语
- lt-LT
- 0x0427
- 立陶宛语(立陶宛)
- mk
- 0x002F
- 马其顿语
- mk-MK
- 0x042F
- 马其顿语(马其顿,FYROM)
- ms
- 0x003E
- 马来语
- ms-BN
- 0x083E
- 马来语(文莱达鲁萨兰)
- ms-MY
- 0x043E
- 马来语(马来西亚)
- mr
- 0x004E
- 马拉地语
- mr-IN
- 0x044E
- 马拉地语(印度)
- mn
- 0x0050
- 蒙古语
- mn-MN
- 0x0450
- 蒙古语(蒙古)
- no
- 0x0014
- 挪威语
- nb-NO
- 0x0414
- 挪威语(伯克梅尔,挪威)
- nn-NO
- 0x0814
- 挪威语(尼诺斯克,挪威)
- pl
- 0x0015
- 波兰语
- pl-PL
- 0x0415
- 波兰语(波兰)
- pt
- 0x0016
- 葡萄牙语
- pt-BR
- 0x0416
- 葡萄牙语(巴西)
- pt-PT
- 0x0816
- 葡萄牙语(葡萄牙)
- pa
- 0x0046
- 旁遮普语
- pa-IN
- 0x0446
- 旁遮普语(印度)
- ro
- 0x0018
- 罗马尼亚语
- ro-RO
- 0x0418
- 罗马尼亚语(罗马尼亚)
- ru
- 0x0019
- 俄语
- ru-RU
- 0x0419
- 俄语(俄罗斯)
- sa
- 0x004F
- 梵语
- sa-IN
- 0x044F
- 梵语(印度)
- sr-Cyrl-CS
- 0x0C1A
- 塞尔维亚语(塞尔维亚,西里尔语)
- sr-Latn-CS
- 0x081A
- 塞尔维亚语(塞尔维亚,拉丁语)
- sk
- 0x001B
- 斯洛伐克语
- sk-SK
- 0x041B
- 斯洛伐克语(斯洛伐克)
- sl
- 0x0024
- 斯洛文尼亚语
- sl-SI
- 0x0424
- 斯洛文尼亚语(斯洛文尼亚)
- es
- 0x000A
- 西班牙语
- es-AR
- 0x2C0A
- 西班牙语(阿根廷)
- es-BO
- 0x400A
- 西班牙语(玻利维亚)
- es-CL
- 0x340A
- 西班牙语(智利)
- es-CO
- 0x240A
- 西班牙语(哥伦比亚)
- es-CR
- 0x140A
- 西班牙语(哥斯达黎加)
- es-DO
- 0x1C0A
- 西班牙语(多米尼加共和国)
- es-EC
- 0x300A
- 西班牙语(厄瓜多尔)
- es-SV
- 0x440A
- 西班牙语(萨尔瓦多)
- es-GT
- 0x100A
- 西班牙语(危地马拉)
- es-HN
- 0x480A
- 西班牙语(洪都拉斯)
- es-MX
- 0x080A
- 西班牙语(墨西哥)
- es-NI
- 0x4C0A
- 西班牙语(尼加拉瓜)
- es-PA
- 0x180A
- 西班牙语(巴拿马)
- es-PY
- 0x3C0A
- 西班牙语(巴拉圭)
- es-PE
- 0x280A
- 西班牙语(秘鲁)
- es-PR
- 0x500A
- 西班牙语(波多黎各)
- es-ES
- 0x0C0A
- 西班牙语(西班牙)
- es-ES_tradnl
- 0x040A
- 西班牙语(西班牙,传统排序)
- es-UY
- 0x380A
- 西班牙语(乌拉圭)
- es-VE
- 0x200A
- 西班牙语(委内瑞拉)
- sw
- 0x0041
- 斯瓦希里语
- sw-KE
- 0x0441
- 斯瓦希里语(肯尼亚)
- sv
- 0x001D
- 瑞典语
- sv-FI
- 0x081D
- 瑞典语(芬兰)
- sv-SE
- 0x041D
- 瑞典语(瑞典)
- syr
- 0x005A
- 叙利亚语
- syr-SY
- 0x045A
- 叙利亚语(叙利亚)
- ta
- 0x0049
- 泰米尔语
- ta-IN
- 0x0449
- 泰米尔语(印度)
- tt
- 0x0044
- 鞑靼语
- tt-RU
- 0x0444
- 鞑靼语(俄罗斯)
- te
- 0x004A
- 泰卢固语
- te-IN
- 0x044A
- 泰卢固语(印度)
- th
- 0x001E
- 泰语
- th-TH
- 0x041E
- 泰语(泰国)
- tr
- 0x001F
- 土耳其语
- tr-TR
- 0x041F
- 土耳其语(土耳其)
- uk
- 0x0022
- 乌克兰语
- uk-UA
- 0x0422
- 乌克兰语(乌克兰)
- ur
- 0x0020
- 乌尔都语
- ur-PK
- 0x0420
- 乌尔都语(巴基斯坦)
- uz
- 0x0043
- 乌兹别克语
- uz-Cyrl-UZ
- 0x0843
- 乌兹别克语(乌兹别克斯坦,西里尔语)
- uz-Latn-UZ
- 0x0443
- 乌兹别克语(乌兹别克斯坦,拉丁语)
- vi
- 0x002A
- 越南语
- vi-VN
- 0x042A
- 越南语(越南)
- */
在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等等
具体使用如同此法:
- suing System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Text;
- using System.Windows.Forms;
- using LocalizableLanguage;
- namespace LocalizableLanguageTestForm
- {
- public partial class MainForm : Form
- {
- public MainForm()
- {
- InitializeComponent();
- }
- public MainForm(SubjectLanguageObserver slo)
- {
- LOS = slo;
- InitializeComponent();
- }
- SubjectLanguageObserver LOS = null;
- public SubjectLanguageObserver _LOS
- {
- get { return LOS; }
- set { LOS = value; }
- }
- private void englishToolStripMenuItem_Click(object sender, EventArgs e)
- {
- LOS.CultureInfoChangeUILanguage(0x0809);
- }
- private void simplifiedChineseToolStripMenuItem_Click(object sender, EventArgs e)
- {
- LOS.CultureInfoChangeUILanguage(0x0804);
- }
- private void MainForm_Load(object sender, EventArgs e)
- {
- if(LOS !=null )
- LOS.CultureInfoChanged += new SubjectLanguageObserver.CultureInfoEventHandler(LOS_CultureInfoChanged);
- }
- private void LOS_CultureInfoChanged(object sender, SubjectLanguageObserver.CultureInfoEventArgs e)
- {
- languageToolStripMenuItem.Text = LOS.languageDictionary.GetLocalizableLanguageByKey("MainForm.languageToolStripMenuItem.Text");
- englishToolStripMenuItem.Text= LOS.languageDictionary.GetLocalizableLanguageByKey("MainForm.englishToolStripMenuItem.Text");
- simplifiedChineseToolStripMenuItem.Text= LOS.languageDictionary.GetLocalizableLanguageByKey("MainForm.simplifiedChineseToolStripMenuItem.Text");
- columnHeaderNo.Text= LOS.languageDictionary.GetLocalizableLanguageByKey("MainForm.columnHeaderNo.Text");
- columnHeaderName.Text = LOS.languageDictionary.GetLocalizableLanguageByKey("MainForm.columnHeaderName.Text");
- columnHeaderPhone.Text = LOS.languageDictionary.GetLocalizableLanguageByKey("MainForm.columnHeaderPhone.Text");
- columnHeaderEmail.Text =LOS.languageDictionary.GetLocalizableLanguageByKey("MainForm.columnHeaderEmail.Text");
- toolStripStatusLabel1.Text = LOS.languageDictionary.GetLocalizableLanguageByKey("MainForm.toolStripStatusLabel1.Text");
- }
- }
- }
语言文件内容:
-------------------------------------------
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="状态";
.....