C# winForm資源文件實現多語言切換
這是我目前看到過最簡單的多語言切換了
操作步驟
界面上的多語
Step1.將界面Form的屬性的Localizable屬性設為True

Step2.切換界面From的Language屬性為欲使用的語系

設完后會在分頁標簽上看到目前設定的語系

Step3.設定界面上欲顯示的字樣並適當的調整版面


到此,用資源檔做的多語系程序就完成了。
我們可以到檔案總管看一下,可看到Visual Studio自己幫我們產生了對應的資源檔。

因此,在實作界面上的多語時,我們並不需自己手動加入資源檔。

信息的多語
上面的示例帶出了界面上支持多語的寫法,但卻不適用於信息上,若要在信息上也支持多語。請依下列步驟:
Step1.加入資源檔
資源檔依照“資源文件名.文化特性.resx”格式命名,如“Resources.zh-tw.resx”。

Step2.設定資源檔內的信息內容
在資源檔上連點兩下

設定對應的語系字串

Step3.使用資源檔內的信息內容
這邊只要透過My.Resources去取出資源檔內的值即可,內部OR Mapping轉換都幫你做好好,可以用強型別的方式直接取用,能避免掉許多不必要的低級錯誤。
MsgBox(My.Resources.Resource1.String1)
其實個人習慣是命名為“Resources.文化特性.resx”,因為項目里已偷放了一個Resources.resx資源檔,因此只需加入非預設語系的資源檔即可
在使用上也會變得較為簡短
MsgBox(My.Resources.String1)
切換語系
依上面步驟操作完后,其實已具多語支持能力。當程序開啟時,會自動依照當前語系去顯示界面畫面。因此我們開啟時應該是顯示中文而不是本來的英文。若要自己切換語系可利用Threading.Thread.CurrentThread.CurrentUICulture。
Threading.Thread.CurrentThread.CurrentUICulture = New CultureInfo(“en”)
值得注意的是,這樣的寫法是不會影響已開啟的視窗的。只有后來開啟的視窗會被切換語系。
那是否已開啟的視窗就無法切換了呢?那倒也不是。可以透過使用ResourceManager.GetString去取得對應的字串,把取出的字串再設到界面上即可。但是這也不是很好的方法,個人傾向使用ComponentResourceManager配合遞回去把界面上的字串換成對應語系的字串。有興趣的可以參考Form.Designer.vb檔的代碼。


注意事項
在用多國語言資源檔時,建議最后在弄其它語系的設定。因為當我們設定多語系時,Visual Studio會自動幫我們產生資源檔,且內含預設的設定值。若太早讓Visual Studi產生資源檔,則預設的設定值將只有少少的幾個,后面的設定值都需手動的設定,且每個語系的資源檔都要設定。

調用
SetLang("語言標識", this, typeof(窗體));
public static class JapanHelper { /// <summary> /// 設置當前程序的界面語言 /// </summary> /// <param name="lang">language:zh-CN, en-US</param> /// <param name="form">窗體實例</param> /// <param name="formType">窗體類型</param> public static void SetLang(string lang, Form form) { System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang); if (form != null) { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(form.GetType()); resources.ApplyResources(form, "$this"); AppLang(form, resources); } } /// <summary> /// 遍歷窗體所有控件,針對其設置當前界面語言 /// </summary> /// <param name="control"></param> /// <param name="resources"></param> private static void AppLang(Control control, System.ComponentModel.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) { //調用 遍歷菜單 設置語言 AppLang(c, resources); } } } foreach (Control c in control.Controls) { resources.ApplyResources(c, c.Name); AppLang(c, resources); } } /// <summary> /// 遍歷菜單 /// </summary> /// <param name="item"></param> /// <param name="resources"></param> private static void AppLang(ToolStripMenuItem item, System.ComponentModel.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) { //if (tsmi != ToolStripSeparator) //{ } AppLang(c, resources); } } } } }
