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