未标明原创的文章皆为转载~

(转)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>

posted @ 2009-09-03 17:24  CodeYu  阅读(1168)  评论(0编辑  收藏  举报