看了蟈蟈今天發的文章後,研究了一下WinForm的多語言解決方案,參考網上的一些資料後,發現一個簡單的方法,完全可以通過VS.NET的強大功能實現。
具體方法如下:
1. 選中一個Form表單,在屬性編輯器中設定Localizable屬性為true(預設為false)
2. 設定Language屬性為default,這樣就可以編輯預設情況下的文化設定
3. 然後在Form中添加你需要的基本控制項,如按鈕、菜單、標籤等
注意,一旦Form發生變化,VS.net就會自動產生<Form名稱>.resx檔案
技巧:如果要看resx檔案,可以點擊右側"方案總管"頂部的“顯示所有檔案“表徵圖,這樣就可以看到Form表單的cs檔案下多了一個<Form名稱>.resx檔案
4. 菜單布局完成後,重新設定Language屬性為另一種語言,如中文(簡體)
5. Form中修改剛才添加的按鈕、菜單和標籤的屬性,比如修改Text屬性為中文文字,當然,文化設定並不局限於Text,還可以設定對齊、布局等,儲存後,你會發現在Form表單的cs檔案下又多了一個<Form名稱>.zh-CN.resx檔案。
這時,其實我們已經實現了全球化,讓我們來看看VS.Net都為我們添加了些什麼。首先開啟<Form名稱>.resx檔案,看到大量如下資料:
menuItem4.Text SaveAs
menuItem2.Enabled true
menuItem7.Visible true
...
從這些資料可以發現,VS.net會自動遍曆所有顯示控制項的可修改屬性,根據當前Form表單的Language設定,會把屬性更改儲存在特定語言的.resx檔案中,例如中文(簡體)則儲存到xxx.zh-cn.resx中。
再讓我們看看Form的初始化中的代碼:
System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(Form1));
this.mainMenu1.RightToLeft = ((System.Windows.Forms.RightToLeft)(resources.GetObject("mainMenu1.RightToLeft")));
//
// menuItem1
//
this.menuItem1.Enabled = ((bool)(resources.GetObject("menuItem1.Enabled")));
this.menuItem1.Shortcut = ((System.Windows.Forms.Shortcut)(resources.GetObject("menuItem1.Shortcut")));
this.menuItem1.ShowShortcut = ((bool)(resources.GetObject("menuItem1.ShowShortcut")));
this.menuItem1.Text = resources.GetString("menuItem1.Text");
this.menuItem1.Visible = ((bool)(resources.GetObject("menuItem1.Visible")));
從代碼看,其實使用的方法與 蟈蟈 所用的完全相同,都是用了ResourceManager(System.Type)方法來實現ResourceManager的初始化。另外,其中通過大量 顯示類型轉換 完成控制項屬性設定。大家也可以用這些初始化代碼來做運行時多語言介面切換。
這種方法的確簡單易用,但對於有很多視窗的應用程式來說,並不是很方便,因為對於每個視窗,你需要多少種語言就必須配置多少個資源檔,這些設定檔由於是按每個視窗儲存的,統一管理不是很方便,目前還在繼續研究中。
參考資料:
1. 蟈蟈 的 .NET 多語言解決方案(demo篇)
2. NoteXPad 的 .NET Framework 中多語言支援的實現
3. ceocio(MS MVP) 的 在C#案頭應用使用多語言