所有Developer Express .NET產品都有本地化資源,比如按鈕屬性,控件屬性描述,菜單項,確認和錯誤的信息等等,所有這些資源字符串可以很容易地被翻譯成各種語言。
先看下面漢化前後的圖片:
漢化前 漢化後

如何實現上述的漢化呢?Dev漢化總結下來一般分三種形式:一種是利用已經漢化好的資源包;一種是使用本地對象類,利用代碼漢化;還有就是資源包和代碼結合。下面我們就這三種情況的實現方法和各自的利弊做一詳細的講解。
一、利用資源包漢化
一、如何使用資源包進行漢化
首先,您需下載現有的資源包(資源包漢化由慧都科技提供,下載鏈接地址www.devexpress.com/kb=A421)將所需的漢化的資源zh-CHS中國 (簡體) 、zh-CN中國 (中國)、zh-TW 中國 (台灣)拷貝到執行目錄下。利用CurrentThread.CurrentUICulture加載資源包。參照代碼如下:
Code
1static void Main()
2{
3 System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CHS");
4 Application.Run(new Form1());
5}
6
二、如何修改資源包
資源包有一個跟Dev組件同樣的強名密鑰文件StrongKey.snk。如果你想編譯資源文件,你可以做到這一點,只要你擁有組件完整的源代碼,重新指定強名密鑰文件,獲得自己的StrongKey.snk。具體實現可查閱MSDN Library。
1、拷貝StrongKey.snk從安裝的源代碼的目錄"Program Files"Developer Express .NET vX.Y"Sources"DevExpress.Key" 到當前資源包的DevExpress.Key目錄。(vX.Y為當前安裝版本號)
2、打開資源包Localization.sln工程,根據下面提及的使用本地化方法找出要漢化的屬性,當然如果你購買了源代碼也可以查看源代碼Localization類裡面的本地化方法列出的變量來實現你需要的漢化。
3、重新生成資源文件,這時對應的Dll將在DevExpress.DLL文件夾中。
注:利用現有資源包漢化使用簡單,運用也最普遍,但因目前漢化的資源不全,往往會修改資源包。然而StrongKey.snk強名密鑰文件商家不可能提供,因為那是他們的簽名。如果在沒有自己StrongKey.snk的情況下重新編譯資源包,那只能將自己修改好的資源文件,借助於商家來幫助重新編譯。
二、使用本地對象漢化
每一個Dev組件或者庫都有其相對應的本地化類。其實本地化的過程很簡單,首先創建一個子類繼承相對應的本地化基類(參照下面表),重載GetLocalizedString方法,這方法應該返回字符串的具體字符串資源標識符。其次,就是調用該類,實例化對應類的靜態Active屬性。
Control Class XtraBars DevExpress.XtraBars.Localization.BarLocalizer XtraCharts DevExpress.XtraCharts.Localization.ChartLocalizer XtraEditors Library DevExpress.XtraEditors.Controls.Localizer XtraGrid DevExpress.XtraGrid.Localization.GridLocalizer XtraLayout DevExpress.XtraLayout.Localization.LayoutLocalizer XtraNavBar DevExpress.XtraNavBar.NavBarLocalizer XtraPrinting Library DevExpress.XtraPrinting.Localization.PreviewLocalizer XtraPivotGrid DevExpress.XtraPivotGrid.Localization.PivotGridLocalizer XtraReports DevExpress.XtraReports.Localization.ReportLocalizer XtraScheduler DevExpress.XtraScheduler.Localization.SchedulerLocalizer XtraSpellChecker DevExpress.XtraSpellChecker.Localization.SpellCheckerLocalizer XtraTreeList DevExpress.XtraTreeList.Localization.TreeListLocalizer XtraVerticalGrid DevExpress.XtraVerticalGrid.Localization.VGridLocalizer具體代碼實現:
一、實現上述漢化,您需要在代碼中添加如下代碼:
代碼漢化
1 public class ChEditLocalizer : Localizer
2 { // 重載 GetLocalizedString 方法
3 public override string GetLocalizedString(StringId id)
4 { switch (id)
5 { // PictureEdit 菜單漢化
6 case StringId.PictureEditMenuCut: return "剪切";
7 case StringId.PictureEditMenuCopy: return "復制";
8 case StringId.PictureEditMenuPaste: return "粘貼";
9 case StringId.PictureEditMenuDelete: return "刪除";
10 case StringId.PictureEditMenuLoad: return "加載";
11 case StringId.PictureEditMenuSave: return "保存";
12 // TextEdit 菜單漢化
13 case StringId.TextEditMenuCut: return "剪切";
14 case StringId.TextEditMenuCopy: return "復制";
15 case StringId.TextEditMenuPaste: return "粘貼";
16 case StringId.TextEditMenuDelete: return "刪除";
17 case StringId.TextEditMenuSelectAll: return "全選";
18 case StringId.TextEditMenuUndo: return "返回";
19 // DateEdit 控件漢化
20 case StringId.DateEditToday: return "今天";
21 case StringId.DateEditClear: return "取消";
22 }
23 return "";
24 }
25}
26
27 public class MyTreeListLocalizer : TreeListLocalizer
28 {
29 public override string GetLocalizedString(TreeListStringId id)
30 {
31 switch (id)
32 {
33 //TreeList列菜單漢化
34 case TreeListStringId.MenuColumnSortAscending: return "升序";
35 case TreeListStringId.MenuColumnSortDescending: return "升序";
36 case TreeListStringId.MenuColumnBestFit: return "固定列";
37 case TreeListStringId.MenuColumnBestFitAllColumns: return "固定所有列";
38 case TreeListStringId.MenuColumnColumnCustomization: return "自定義列";
39 }
40 return "";
41 }
42 }
43
二、一旦ChEditLocalizer和MyTreeListLocalizer被創建你能設定對應的Active,實現方法參照如下:
Active
private void Form1_Load(object sender, EventArgs e)
{
Localizer.Active = new ChEditLocalizer();
TreeListLocalizer.Active = new MyTreeListLocalizer();
}
注:代碼漢化可以讓用戶自定漢化內容,但一旦重載GetLocalizedString方法,就必須對整個對象類漢化,代碼量較大。當然,如果您只想對局部屬性進行漢化,其他的保留英語,你可以在返回為空的代碼:
return "";修改為return base.GetLocalizedString(id);
三、資源包與代碼結合
這種方法介於上述兩種方法之間,既使用了資源包,減少了代碼漢化的工作量,又在資源包沒有滿足漢化的基礎上修改追加漢化,但仍然存在比如XtraEditors資源包中有復制與粘貼漢化調換了,就必須對整個Localizer類的成員進行漢化的情況。具體實現可在應用程序初期化時同時追加下面代碼:
Code
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CHS");
Localizer.Active = new ChEditLocalizer();
補充:如果你購買了源代碼,並且有自己的StrongKey.snk強名密鑰文件,那麼直接在對應的控件源代碼中修改GetLocalizedString的每一個返回值,使用重新編譯源代碼的Dll文件來達到直接漢化的目的,但同樣會花費很大的工作量。
與網上其它關於 DevExpress 漢化的文章不同,本文提供了DevExpress WinForm 漢化和 WebForm(ASPxControls) 漢化的最簡單最實用的方法,能讓你快速實現對DevExpress 的漢化。同時也說明了使用原始 .resx 文件實現漢化的方法。
WebForm(ASPxControls) 漢化效果圖

WinForm 漢化效果圖

如何實現上述的漢化呢?DevExpress 漢化總結下來一般分三種形式:
一、利用已經漢化好的資源包;
二、使用本地對象類,利用代碼漢化;
三、資源包和代碼結合。
本文只講述用漢化好的資源包進行漢化的方法,因為此種方法最簡單實用。
1. WebForm(ASPxControls)漢化
第一步:
在你的項目中添加一個資源文件夾"App_GlobalResources"

第二步:
找到本地化資源文件,將其全部復制到 App_GlobalResources
所有的 ASP.NET Controls 都有本地化資源文件, 默認情況下這些文件放在以下目錄:
C:\Program Files\Developer Express .NET vX.Y\Sources\DevExpress.Web.ASPxGlobalResources\
第三步:
直接到DevExpress網站下載相應版本的 中文資源文件 ,若沒有對應版本的資源,也沒有關系。將先前復制到 App_GlobalResources 目錄下的文件在復制一份,用 visual studio 直接對其編輯,自己漢化。例如:
將 DevExpress_Web_ASPxEditors_vX_Y.resx 重命為 DevExpress_Web_ASPxEditors_vX_Y.zh-CHS.resx , 打開文件對其進行漢化。
做好之後的效果圖如下:

下面還要修改 web.config 文件, 在 system.web 下加入
<globalization uiCulture="zh-CHS"/>
至此,完成了對 WebForm 的漢化。
2. WinForm漢化
其實相對於 WebForm 漢化來說,WinForm 的漢化要更簡單一些。在 DevExpress 的安裝目錄下找到已有的漢化資源包 zh-CHS
默認位置為:C:\Program Files\DevExpress X.Y\Components\Sources\DevExpress.DLL 。
如果沒有也沒關系,可以到DevExpress的官網下載對應版本的 中文資源包,將所需的漢化的資源zh-CHS中國 (簡體) 、zh-CN中國 (中國)、zh-TW 中國 (台灣)拷貝到執行目錄下。利用 CurrentThread.CurrentUICulture 加載資源包。參照代碼如下 :
static void Main()
{
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CHS");
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
當然,要是你所用的操作系統的語言就是對應的資源包的語言,那 System.Threading.Thread.CurrentThread.CurrentUICulture 也可省略不寫。
資源圖:


至此,完成了對 WinForm 的漢化。