以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官方的資源包:
    地址: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的值會由當前線程所設置的CurrentUICulture的值而決定,如果為默認值,它會讀取CustomResource.resx文件,如果為簡體中文就會讀取CustomResource.zh-CN.resx中strError所對應的值。
需要特別注意的是,若代碼中涉及多線程,並且在線程中需要用到語言資源文件,此時需要額外設置創建的線程的CurrentUICulture,否則在線程中調用語言資源文件,返回值都將是默認的語言。

Note:不能將字段存放在控件默認的資源文件里,因為一旦對控件UI進行操作后,它將自動重寫自己的資源文件,原本自己定義的字段都將被抹除。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM