DevExpress控件汉化详解(WebForm)

所有Developer Express .NET产品都有本地化资源,比如按钮属性,控件属性描述,菜单项,确认和错误的信息等等,所有这些资源字符串可以很容易地被翻译成各种语言。

  先看下面汉化前后的图片:

汉化前 汉化后

DevExpress控件汉化详解(WebForm)

DevExpress控件汉化详解(WebForm)

如何实现上述的汉化呢?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(

 

posted @ 2010-01-27 23:25  尤文之鹤  阅读(1553)  评论(1编辑  收藏  举报