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>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章