以DevExpress開發的WinFrom程式的多語言功能的實現
寫在前面:
多語言切換功能在Winform程式中是經常遇到的需求,尤其是需要給國外客戶使用的情況下,多語言功能是必不可少的。前一段時間我也遇到了這個需求,在實現過程當中也遇到了很多問題。因為這個功能是相對很普遍的的,相信很多人都會遇到,所以我將實現方法梳理了一下,分享給大家!(非DevExpress開發也可以看一看)
需求拆分:
在Winform程式中需要進行多語言設定的欄位主要來自於三個方面:
- 控制元件UI欄位 eg: button.Text \colum.Caption
- 控制元件不可修改的UI欄位 eg:wizardControl的Next,Last,Finish按鈕以及XtraMessageBox提示框的確認按鈕
- 程式碼中自定義的中文字串 eg:提示資訊 XtraMessageBox.Show(“格式錯誤”);
解決方法:
首先,設定當前執行緒、UI的語言的程式碼如下(以簡體中文為例):
string language = "zh-CN";
// Create a new object, representing the German culture.
CultureInfo culture = CultureInfo.CreateSpecificCulture(language);
// The following line provides localization for the application's user interface.
Thread.CurrentThread.CurrentUICulture = culture;
// The following line provides localization for data formats.
Thread.CurrentThread.CurrentCulture = culture;
// Set this culture as the default culture for all threads in this application.
// Note: The following properties are supported in the .NET Framework 4.5+
CultureInfo.DefaultThreadCurrentCulture = culture;
CultureInfo.DefaultThreadCurrentUICulture = culture;
其次,針對以上三種需要進行多語言設定的地方,需要分別進行處理:
-
控制元件UI欄位:切換Form的Language屬性為目標語言,然後可以在頁面上手動修改,儲存後,專案目錄下會自動生成一個Form.zh-CN.resx檔案,開啟便能看到剛剛所修改的欄位。你可以手動修改該檔案,與修改UI欄位的效果是一樣的。你也可以自己新建一個與預設語言資原始檔同名的以zh-CN.resx為字尾的中文資原始檔,在裡面手動新增自己想修改的控制元件欄位,就不用再通過設定Language屬性進行修改了。
-
控制元件不可修改的UI欄位(針對DevExpress):步驟一可以解決大部分控制元件上面顯示的欄位,但是在DevExpress控制元件中,有些地方是不能手動修改的,比如導航控制元件WizardControl的Next按鈕,以及彈出提示框的確認按鈕,此時需要藉助DevExpress官方的資源包:
地址:https://localization.devexpress.com
新增一個Translation,選擇自己使用的版本號以及目標語言後點選下載,對應的語言資原始檔的壓縮包會傳送到郵箱,儲存後解壓到專案執行目錄下對應的語言資原始檔夾就可以了。
-
自定義欄位:在程式碼中不可避免地會遇到自己定義的字串,比如執行結果,報錯提示等等,針對這種情況需要自己用檔案將欄位儲存下來進行讀取,在這裡還是用.resx檔案進行實現,用xml檔案也可以,但是讀取效率不高,也有暴露給使用者的風險。
新建一個預設的資原始檔CustomResource.resx和一個同名的CustomResource.zh-CN.resx在裡面自己定義Key和Value,兩個檔案中對應的Key名稱要一樣且不能出現'.'符號。
想要讀取自己定義的欄位時,可以用以下方式進行讀取:
ComponentResourceManager res = new ComponentResourceManager(typeof(CustomResource));
string str = res.GetString("strError");
str的值會由當前執行緒所設定的Culture的值而決定,如果為預設值,它會讀取CustomResource.resx檔案,如果為簡體中文就會讀取CustomResource.zh-CN.resx中strError所對應的值。
Note:不能將欄位存放在控制元件預設的資原始檔裡,因為一旦對控制元件UI進行操作後,它將自動重寫自己的資原始檔,原本自己定義的欄位都將被抹除。
希望對大家解決問題有所幫助,若內容有誤請指正,有疑問可留言!