­

以DevExpress開發的WinFrom程式的多語言功能的實現

以DevExpress開發的WinFrom程式的多語言功能的實現

寫在前面:
多語言切換功能在Winform程式中是經常遇到的需求,尤其是需要給國外客戶使用的情況下,多語言功能是必不可少的。前一段時間我也遇到了這個需求,在實現過程當中也遇到了很多問題。因為這個功能是相對很普遍的的,相信很多人都會遇到,所以我將實現方法梳理了一下,分享給大家!(非DevExpress開發也可以看一看)

需求拆分:
在Winform程式中需要進行多語言設置的欄位主要來自於三個方面:

  1. 控制項UI欄位 eg: button.Text \colum.Caption
  2. 控制項不可修改的UI欄位 eg:wizardControl的Next,Last,Finish按鈕以及XtraMessageBox提示框的確認按鈕
  3. 程式碼中自定義的中文字元串 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;

其次,針對以上三種需要進行多語言設置的地方,需要分別進行處理:

  1. 控制項UI欄位:切換Form的Language屬性為目標語言,然後可以在頁面上手動修改,保存後,項目目錄下會自動生成一個Form.zh-CN.resx文件,打開便能看到剛剛所修改的欄位。你可以手動修改該文件,與修改UI欄位的效果是一樣的。你也可以自己新建一個與默認語言資源文件同名的以zh-CN.resx為後綴的中文資源文件,在裡面手動添加自己想修改的控制項欄位,就不用再通過設置Language屬性進行修改了。

  2. 控制項不可修改的UI欄位(針對DevExpress):步驟一可以解決大部分控制項上面顯示的欄位,但是在DevExpress控制項中,有些地方是不能手動修改的,比如導航控制項WizardControl的Next按鈕,以及彈出提示框的確認按鈕,此時需要藉助DevExpress官方的資源包:
    地址://localization.devexpress.com
    添加一個Translation,選擇自己使用的版本號以及目標語言後點擊下載,對應的語言資源文件的壓縮包會發送到郵箱,保存後解壓到項目運行目錄下對應的語言資源文件夾就可以了。

  3. 自定義欄位:在程式碼中不可避免地會遇到自己定義的字元串,比如運行結果,報錯提示等等,針對這種情況需要自己用文件將欄位保存下來進行讀取,在這裡還是用.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進行操作後,它將自動重寫自己的資源文件,原本自己定義的欄位都將被抹除。

希望對大家解決問題有所幫助,若內容有誤請指正,有疑問可留言!