以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的值會由當前線程所設置的CurrentUICulture的值而決定,如果為默認值,它會讀取CustomResource.resx文件,如果為簡體中文就會讀取CustomResource.zh-CN.resx中strError所對應的值。
需要特別注意的是,若代碼中涉及多線程,並且在線程中需要用到語言資源文件,此時需要額外設置創建的線程的CurrentUICulture,否則在線程中調用語言資源文件,返回值都將是默認的語言。
Note:不能將字段存放在控件默認的資源文件里,因為一旦對控件UI進行操作后,它將自動重寫自己的資源文件,原本自己定義的字段都將被抹除。
希望對大家解決問題有所幫助,若內容有誤請指正,有疑問可留言!