DevExpress 開發經驗總結2 DevExpress漢化之WinForm開發模式漢化

  • 2019 年 10 月 4 日
  • 筆記

  DevExpress控制項庫默認安裝後,使用的本地資源為英文。Developer Express .NET產品都有本地化資源,比如按鈕屬性,控制項屬性描述,菜單項,確認和錯誤的資訊等等,所有這些資源字元串可以很容易地被翻譯成各種語言。對於要求使用中文漢字資源的項目來說,首要任務就是處理漢化。

  在WinForm開發模式下,處理漢化相對簡單。有以下幾種方法。

方法一:使用已經製作完成的漢化資源DLL

  對於早期的DevExpress版本,已經有製作好的漢化資源DLL,例如:基於v13.1的漢化文件「Dxper.LocalizationCHS.Win.v13.1.5.dll」,使用起來非常方便,將其複製到項目中使用即可。

  使用方法:引用 Dxper.LocalizationCHS.Win.v13.1.5.dll文件,並在窗體Form_Load事件中添加以下程式碼。僅適用於WinForm。

 1 DevExpress.XtraGrid.Localization.GridResLocalizer.Active = new   2 Dxper.LocalizationCHS.Win.XtraGridCHS();   3   4 DevExpress.XtraEditors.Controls.Localizer.Active = new   5 Dxper.LocalizationCHS.Win.XtraEditorsCHS();   6   7 DevExpress.XtraCharts.Localization.ChartResLocalizer.Active = new Dxper.LocalizationCHS.Win.XtraChartsCHS();   8   9 DevExpress.XtraBars.Localization.BarLocalizer.Active = new  10 Dxper.LocalizationCHS.Win.XtraBars();  11  12 DevExpress.XtraLayout.Localization.LayoutLocalizer.Active = new Dxper.LocalizationCHS.Win.XtraLayoutCHS();  13  14 DevExpress.XtraPrinting.Localization.PreviewLocalizer.Active = new Dxper.LocalizationCHS.Win.XtraPrintingCHS();  15  16 DevExpress.XtraTreeList.Localization.TreeListResLocalizer.Active = new Dxper.LocalizationCHS.Win.XtraTreeListCHS();  17  18 DevExpress.Office.Localization.OfficeResLocalizer.Active = new  19 Dxper.LocalizationCHS.Win.OfficeCHS();  20  21 DevExpress.XtraSpreadsheet.Localization.XtraSpreadsheetLocalizer.Active = new Dxper.LocalizationCHS.Win.XtraSpreadsheetCHS();

然而此類漢化包同步更新速度較慢,當使用高版本DevExpress時就無法使用了。

方法二:使用DevExpress官方漢化資源DLL

  使用高版本的DevExpress後,需要使用官方的漢化資源文件。到官方下載漢化包後,打開目錄,看到漢化文件是一系列的獨立資源類,它對應著不同的控制項漢化內容

以上是DevExpress控制項庫的全部漢化資源,我們不需要全部複製,根據項目的實際使用的控制項,找到對應控制項的漢化資源,按需複製。

紅色框內即為項目中實際使用的控制項(可能有更多其他引用),找到對應控制項的漢化資源,將其拷貝到DevExpress安裝目錄D:Program Files (x86)DevExpress 14.1ComponentsBinFramework(視具體安裝路徑)

以上操作完成後,在程式入口函數中,註冊該資源文件:

Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-cn"); //載入漢化語言包

當項目安裝部署,製作安裝包時,同樣需要以上漢化資源(後續文章會詳細講解基於DevExpress控制項庫開發項目的安裝包製作過程)。如果是直接拷貝項目到其他機器上運行,需要把zh-cn目錄拷貝到項目中才能正常運行。

  即使做了以上漢化,有些資源還是顯示為英文

此消息提示框是按照方法二漢化後,在程式中運行的實際效果。其中按鈕的顯示文字漢化不成功,仍然為英文。

為了解決該問題,請參考方法三。

方法三:使用本地對象漢化,自定義漢化資源內容

每一個DevExpress組件或者庫都有其相對應的本地化類。步驟為:

  1、創建一個子類繼承相對應的本地化基類;

  2、重載GetLocalizedString方法,這方法應該返回字元串的具體字元串資源標識符;

  3、調用該類,實例化對應類的靜態Active屬性。

以XtraTreeList控制項為例說明:

 1 /// <summary>   2     ///     自定義DevExpress漢化資源,漢化XtraTreeList控制項   3     /// </summary>   4     public class CustomLocalizedXtraTreeList : TreeListLocalizer   5     {   6         /// <summary>   7         /// 重寫GetLocalizedString方法   8         /// </summary>   9         /// <param name="id">StringId</param>  10         /// <returns></returns>  11         public override string GetLocalizedString(TreeListStringId id)  12         {  13             switch (id)  14             {  15                 case TreeListStringId.MenuColumnBestFit:  16                     return "最佳匹配";  17                 case TreeListStringId.PrintDesignerHeader:  18                     return "列印設置";  19                 case TreeListStringId.ColumnCustomizationText:  20                     return "自定義";  21                 case TreeListStringId.MenuFooterMin:  22                     return "最小值";  23                 case TreeListStringId.MenuFooterMax:  24                     return "最大值";  25                 case TreeListStringId.MenuFooterSum:  26                     return "和";  27                 case TreeListStringId.MenuFooterAllNodes:  28                     return "所有節點";  29                 case TreeListStringId.MenuFooterCount:  30                     return "計數";  31                 case TreeListStringId.MenuColumnSortAscending:  32                     return "升序排列";  33                 case TreeListStringId.MenuFooterNone:  34                     return "無";  35                 case TreeListStringId.MenuColumnSortDescending:  36                     return "降序排列";  37                 case TreeListStringId.PrintDesignerDescription:  38                     return "為當前的樹狀列表設置不同的列印選項";  39                 case TreeListStringId.MenuColumnBestFitAllColumns:  40                     return "最佳匹配 (所有列)";  41                 case TreeListStringId.MenuFooterAverageFormat:  42                     return "平均值={0:#.##}";  43                 case TreeListStringId.ColumnNamePrefix:  44                     return "列";  45                 case TreeListStringId.MenuFooterMinFormat:  46                     return "最小值={0}";  47                 case TreeListStringId.MenuFooterCountFormat:  48                     return "{0}";  49                 case TreeListStringId.MenuColumnColumnCustomization:  50                     return "列選擇";  51                 case TreeListStringId.MenuFooterMaxFormat:  52                     return "最大值={0}";  53                 case TreeListStringId.MenuFooterSumFormat:  54                     return "和={0:#.##}";  55                 case TreeListStringId.MultiSelectMethodNotSupported:  56                     return "OptionsBehavior.MultiSelect未激活時,指定方法不能工作.";  57                 case TreeListStringId.InvalidNodeExceptionText:  58                     return " 要修正當前值嗎?";  59                 case TreeListStringId.MenuFooterAverage:  60                     return "平均值";  61             }  62  63             return base.GetLocalizedString(id);  64         }  65     }

其他控制項的自定義漢化方式與以上相同,我自己漢化了XtraBar控制項、XtraEditor控制項、XtraGrid控制項、XtraLayout控制項、XtraNavBar控制項、XtraTreeList控制項、XtraVerticalGrid控制項,如下圖:

為了統一調用,封裝了一個方法

  最後在項目的入口函數或者窗體的Load事件中調用一次:

CustomDevExpressLocalizationCHS.SetSimpleChinese();方法即可實現自定義的漢化資源。

在項目中引用自定義漢化資源後,消息提示框如下:

按鈕上的文字顯示為漢字了,此時才算是真正的漢化。

由於無法上傳附件,需要自定義漢化程式碼的朋友請加入.Net技術交流與分享群427789286,自行下載文件《DotNetLib.DevExpress.rar》。

Tags: