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

暴走的鍋巴發表於2021-12-03

以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官方的資源包:
    地址:https://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進行操作後,它將自動重寫自己的資原始檔,原本自己定義的欄位都將被抹除。

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

相關文章