所有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 的漢化。