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》。