1. 程式人生 > >DevExpress控制元件漢化詳解

DevExpress控制元件漢化詳解

第一章WinForm漢化
所有Developer Express .NET產品都有本地化資源,比如按鈕屬性,控制元件屬性描述,選單項,確認和錯誤的資訊等等,所有這些資源字串可以很容易地被翻譯成各種語言。
 

如何實現上述的漢化呢?DX漢化總結下來一般分三種形式:一種是利用已經漢化好的資源包;一種是使用本地物件類,利用程式碼漢化;還有就是資源包和程式碼結合。下面我們就這三種情況的實現方法和各自的利弊做一詳細的講解。
一、利用資源包漢化
     一、如何使用資源包進行漢化
首先,您需將所需的漢化資源zh-CHS中國 (簡體) 、zh-CN中國 (中國)、zh-TW 中國 (臺灣)拷貝到執行目錄下。利用CurrentThread.CurrentUICulture載入資源包。參照程式碼如下:
        static void Main()
        {
            System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CHS");
            Application.Run(new Form1());
        }
二、如何修改資源包
資源包有一個跟DX元件同樣的強名金鑰檔案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的情況下重新編譯資源包,那隻能將自己修改好的資原始檔,藉助於商家來幫助重新編譯。
二、使用本地物件漢化
每一個DX元件或者庫都有其相對應的本地化類。其實本地化的過程很簡單,首先建立一個子類繼承相對應的本地化基類(參照下面表),過載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
 
具體程式碼實現:
一、實現上述漢化,您需要在程式碼中新增如下程式碼:
    public class ChEditLocalizer : Localizer
    {   // 過載 GetLocalizedString 方法
        public override string GetLocalizedString(StringId id)
        {   switch (id)
            {   // PictureEdit 選單漢化
                case StringId.PictureEditMenuCut: return "剪下";
                case StringId.PictureEditMenuCopy: return "複製";
                case StringId.PictureEditMenuPaste: return "貼上";
                case StringId.PictureEditMenuDelete: return "刪除";
                case StringId.PictureEditMenuLoad: return "載入";
                case StringId.PictureEditMenuSave: return "儲存";
                // TextEdit 選單漢化
                case StringId.TextEditMenuCut: return "剪下";
                case StringId.TextEditMenuCopy: return "複製";
                case StringId.TextEditMenuPaste: return "貼上";
                case StringId.TextEditMenuDelete: return "刪除";
                case StringId.TextEditMenuSelectAll: return "全選";
                case StringId.TextEditMenuUndo: return "返回";
                // DateEdit 控制元件漢化
                case StringId.DateEditToday: return "今天";
                case StringId.DateEditClear: return "取消";
            }
            return "";
         }
}
 
 
    public class MyTreeListLocalizer : TreeListLocalizer
    {
        public override string GetLocalizedString(TreeListStringId id)
        {
            switch (id)
            {
                //TreeList列選單漢化
                case TreeListStringId.MenuColumnSortAscending: return "升序";
                case TreeListStringId.MenuColumnSortDescending: return "升序";
                case TreeListStringId.MenuColumnBestFit: return "固定列";
                case TreeListStringId.MenuColumnBestFitAllColumns: return "固定所有列";
                case TreeListStringId.MenuColumnColumnCustomization: return "自定義列";
            }
            return "";
        }
    }
二、一旦ChEditLocalizer和MyTreeListLocalizer被建立你能設定對應的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類的成員進行漢化的情況。具體實現可在應用程式初期化時同時追加下面程式碼:
 
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CHS");
Localizer.Active = new ChEditLocalizer();
 
補充:如果你購買了原始碼,並且有自己的StrongKey.snk強名金鑰檔案,那麼直接在對應的控制元件原始碼中修改GetLocalizedString的每一個返回值,使用重新編譯原始碼的Dll檔案來達到直接漢化的目的,但同樣會花費很大的工作量。
 
第二章WebForm漢化
在講Developer Express ASP.NET控制元件漢化前,我先介紹Visual Studio ASP.NET是如何進行顯式本地化的,只有瞭解它,那麼Dev的ASP.NET漢化就可以迎刃而解了。
VS Asp.net本地化
您將手動建立資原始檔,然後使用 ASP.NET 宣告性表示式語法引用這些檔案。這裡資原始檔的基名稱為 Zhy_WebLocalized。對於要本地化的每種語言,都將另外建立一個檔案,並在檔名中包含相應的語言程式碼(有時可能還有區域性程式碼)。例如,對於美國英語,將建立名為 Zhy_WebLocalized.resx 的檔案。對於簡體中文,將建立名為 Zhy_WebLocalized.zh-CHS.resx 的檔案。這兩個檔案都將放在 Web 應用程式的 Resources 目錄下。下面對如何實現做一詳細的講解:
一、建立資原始檔
1.   在解決方案資源管理器中,右擊網站的根目錄,單擊新增 ASP.NET 資料夾中App_GlobalResources。
2.   在App_GlobalResources資料夾中新增資原始檔Zhy_WebLocalized.resx,該檔案將充當回退區域性的資源。
3.   再建立一個 .resx 檔案,並將其命名為 Zhy_WebLocalized.zh-CHS.resx。字串“zh-CHS”將檔案標識為瀏覽器的語言設定為中國(簡體)時使用的資源。
4.   建立第三個 .resx 檔案,並將其命名為 Zhy_WebLocalized. ja-JP..resx。字串 “ja-JP”將檔案標識為瀏覽器的語言設定為日本(日本語)時使用的資原始檔。
5.   開啟 Zhy_WebLocalized.resx 檔案。在“名稱”列的第一行中鍵入 strMsg。在“值”列的第一行中,鍵入 Hello , China。儲存檔案並將其關閉。
6.   開啟 Zhy_WebLocalized.zh-CHS.resx,建立名為 strMsg的資源字串,併為其分配值“你好,中國”。完成之後,儲存並關閉檔案。
7.   開啟 Zhy_WebLocalized.ja-JP.resx,建立名為 strMsg的資源字串,併為其分配值“こんにちは、中國”。完成之後,儲存並關閉檔案。
向page新增 Label 控制元件
1.  將另一個 Label 控制元件拖動到頁上。
2.  單擊Label 控制元件Expressions屬性框中的省略號 (…) 按鈕。出現“Expressions”對話方塊。
3.  在“Bindable Properties”列表中選中為“Text”。
4.  在“Expression Type”列表中選擇“Resources”。
5.  在“Expression Properties”下,將“ClassKey”設定為 Zhy_WebLocalized,並將“ResourceKey”設定為 strMsg。單擊“確定”。
6.  切換到“Source”檢視。標籤的文字屬性現在具有一個顯式表示式,說明將從其中檢索要選擇的資源和鍵的基檔案。程式碼如下:<asp:Label ID="Label1" Runat="server" Text="<%$ Resources: Zhy_WebLocalized, strMsg %>">
再在Web.config的中追加如下程式碼:
<system.web>
             <globalization enableClientBasedCulture="true" culture="auto:zh-CHS" uiCulture="auto:zh-CHS"/>
</system.web>
注:Zhy_WebLocalized屬性不具有語言指示符、區域性指示符或 .resx 副檔名,因為它不是實際的檔名。實際上,Zhy_WebLocalized表示基礎資源類。ASP.NET 將根據瀏覽器傳送的區域性,從檔名中包含相應的語言或區域性程式碼的檔案中選擇資源,檔名可能類似 Zhy_WebLocalized.zh-CHS.resx 和 Zhy_WebLocalized.ja-JP.resx,或者,如果未找到匹配的語言,則為 Zhy_WebLocalized.resx。
完成資原始檔並新增宣告性表示式後,可以開始測試頁。做完最後一個測試後,瀏覽器被設定為將中國(簡體)作為語言首選項進行報告。測試期間,會多次更改瀏覽器的語言。
對page進行測試
1.  按 Ctrl+F5 執行該頁。在資源編輯器中提供的中文(簡體)版文字將顯示為 Label 控制元件的文字。
2.  在 Microsoft Internet Explorer 中,單擊“工具”選單上的“Internet 選項”。單擊“語言”。
3.  在“語言首選項”對話方塊中,將“日本(日本語)[ja-JP]”移動到語言列表的頂部。完成後,單擊“確定”並關閉“Internet 選項”對話方塊。
4.  按 F5 重新整理瀏覽器。此時顯示文字的日語版本。
5.  將語言更改為阿拉伯語,並再次按 F5 重新整理該頁。此時,該文字將以在回退資原始檔中使用的語言顯示。因為沒有建立檔案 LocalizedText.ar-eg.resx,ASP.NET 無法定位與瀏覽器報告的語言和區域性匹配的文字,因此會使用回退資原始檔。
6.  完成對該頁的測試後,將語言再次設定為首選語言。
DEV Asp.net本地化
明白了VS ASP.NET的本地化原理後,那麼本文主要講的Dev Asp.net控制元件的漢化就變得簡單了。Dev所有Developer Express ASP.NET控制元件商家都給出了基礎資源類,預設情況下這些檔案位於“C:/Program Files/Developer Express .NET  vX.Y/Sources/DevExpress.Web.ASPxGlobalResources/”的資料夾下(這裡vX.Y是版本號)。
DevExpress ASP.NET Control    Resource File
ASPxGridView    DevExpress_Web_ASPxGridView_vX_Y.resx
ASPxEditors    DevExpress_Web_ASPxEditors_vX_Y.resx
ASPxScheduler    DevExpress_Web_ASPxScheduler_vX_Y.resx
ASPxperience Suite    DevExpress_Web_vX_Y.resx
ASPxHtmlEditor    DevExpress_Web_ASPxHtmlEditor_vX_Y.resx
ASPxPivotGrid    DevExpress_Web_ASPxPivotGrid_vX_Y.resx
ASPxSpellChecker    DevExpress_Web_ASPxSpellChecker_vX_Y.resx
ASPxTreeList    DevExpress_Web_ASPxTreeList_vX_Y.resx
根據上面的資原始檔列表,拷貝這些檔案到當前解決方案的App_GlobalResources資料夾目錄下,新建本地化資源,其實這裡我們用不著再新建自己的本地化資源,我們只需複製一份基礎資源類,將它的名稱改為本地化名,並對其進行漢化就可以了。(注:這裡必須同時存在基礎資源類檔案和本地化類檔案)
e.g.
DevExpress_Web_ASPxGridView_vX_Y. zh-CHS.resx
DevExpress_Web_ASPxEditors_vX_Y. zh-CHS.resx
DevExpress_Web_ASPxScheduler_vX_Y. zh-CHS.resx
DevExpress_Web_vX_Y. zh-CHS.resx
DevExpress_Web_ASPxHtmlEditor_vX_Y. zh-CHS.resx
DevExpress_Web_ASPxPivotGrid_vX_Y. zh-CHS.resx
DevExpress_Web_ASPxSpellChecker_vX_Y. zh-CHS.resx
DevExpress_Web_ASPxTreeList_vX_Y. zh-CHS.resx
再在Web.config的中追加如下程式碼:
<system.web>
             <globalization enableClientBasedCulture="true" culture="auto:zh-CHS" uiCulture="auto:zh-CHS"/>
     </system.web>