DevExpres汉化s

参考链接

Visual Studio .NET里面,本地化资源,比如字符串、图片之类的,都是跟culture(语言文化)有关,这些东西都是存储在单独的文件中并且根据相应的culture设定进行加载,如果要了解怎样加载你自己的本地化资源,那就需要了解资源文件的组织结构关系:

1.         .Net在加载资源文件的时候,是按照自下而上的方式。Framework里面,父类对应english,是唯一的一种没有自身资源文件的,其实也并不是没有,而是存在main assembly里面。

2.         在父类之下,可以有多种多样的culture的资源,我们说的culture是指语言文化并不是指windows控制面板中的区域,比如,法国(French简写为“fr”)就是一个cultureenglish简写成“en”也是一个culture

3.         在这些culture之下,又有一些特定区域的culture,这些特定区域的culture,它有两点属性,不仅包含语言文化,还加上区域特色,就好比中国有中国的文化,而福建还有它自身的区域性文化。

在一个程序试图加载一个资源的时候,好比一个字符串,并且还没有找到,它就会沿着上面所说的层次结构一层一层的往上爬,直到找到为止。


在进行本地话的过程中,最好的方法是建立相对通用的资源文件,也就是上文中第2条中的而不是第3条中,就好比我们在汉化的过程中,一般汉化成普通话,而不是汉化成福建话,或者是台湾话。也就是越通用越好,假设你有一个French Belgian ("fr-BE")的资源文件,而且它的直接上级就立马到了最高级english,那么当你的区域设置改变成French Canadian,系统降会寻找对应的"fr-CA"资源,而此时已经无法找到,就会选用处于main assambly中的资源,也就是英文。下图显示的就是你不想看到的场景。

如果你愿意,你可以为"fr" culture放置尽可能多的资源文件,这样French Canadian的用户虽然无法看见"fr-BE"的资源文件,但是它至少可以获得French的资源文件,以下图片就是推荐的方式。

以上我们说的资源文件,还有另一种比较高雅的叫法,叫Satellite Assemblies,翻译成中文可以叫做卫星程序集。需要注意的是这些资源程序集的强名必须跟主程序集的相一致,如果它们不匹配的话,也就无法加载了。

2.2. 本地化WinForm

VS提供了较丰富的本地化方法,通过VS开发环境实现本地化有两种方法:

第一种是用系统工具为各种UI元素生成资源文件,然后把这些资源文件编译到卫星程序集中去;

第二种方法是添加一个资源文件模版然后使用内置的XML Designer进行编辑;第二种方法的好处是还可以本地化messagebox中出现的文本。

下面我们用一个工程简单演示一下这两种本地化步骤:

2.2.1.    VS生成资源文件

1.         创建一个工程,我的工程名叫:WindowsApplication2

2.         设置窗体的Localizabletrue(确定是否将为此对象生成可本地化的代码)

此时Language属性已经被设置成了“(Default)”;

3.         往窗体上拉一个Text控件,还是老规矩,设置它的值为“Hello World”;

4.         设置窗体的Language属性为“German (Germany)”;

5.         重新设置Text控件的值为“Hallo Welt”;

6.         设置窗体的Language属性为“French (France)”;控件值会自动改为Hello World

7.         再设置Text控件的值为“Bonjour le Monde”;

8.         保存并编译工程文件。

这时VS为我们生成的文件如上图所示。

9.         F5执行程序。


生成的文件如上图所示,两个子目录下分别包含资源程序集。如“de-DE”目录下包含的“汉化示例.resources.dll”。

10.     你已经拥有了一个拥有德文和法文的应用程序了,不过具体显示什么就取决于你操作系统的区域配置了。当然你也可以在程序中指定要显示的语言。下面将通过代码的方式详细说明。

 在Program.cs程序入口Main中加入如下代码

这是需要的命名空间:

// C#

using System.Globalization;

using System.Threading;

      

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace 汉化示例
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            System.Threading.Thread.CurrentThread.CurrentUICulture=new System.Globalization.CultureInfo("fr-FR");
            Application.Run(new Form1());
        }
    }
}
只加了下面这句

System.Threading.Thread.CurrentThread.CurrentUICulture=new System.Globalization.CultureInfo("fr-FR");

经过以上处理,我们现在看到的就是法语了。不过这种硬编码的方式并不推荐,这种方式不能通过用户喜好设定或者是程序设定来更改界面。


2.2.2.    添加资源模版并编辑(右键工程添加新建项)

添加Resource File类型文件,这里命名为:WinFormStrings,然后编辑文件如下:

法文和德文的添加方法类似,不过需要变动一下文件名

大致修改的情况如下所示:

resource file name

name

Value

Comment

WinFormStrings.de.resx

strMessage

Hallo Welt

 

WinFormStrings.fr-FR.resx

strMessage

Bonjour le Monde

 

资源文件是添加好了,下面讲述如何访问这些资源文件:

1.         添加命名空间:using System.Resources

2.         为主窗口添加一个button,不过此时需要注意的是把窗体的Localizable属性设置为False,否则将无法添加。(我这里懒得用新项目,还是前文提到的那个项目)

3.         为这个buttonClick事件编写代码如下,需要注意的是ResourceManager的参数。且默认的ResourceManager是大小写敏感的,虽然也可以设置忽略大小写,不会有造成性能上的损失。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace 汉化示例
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            System.Resources.ResourceManager localResxManager = new System.Resources.ResourceManager("汉化示例.WinFormStrings",typeof(Form1).Assembly);
            MessageBox.Show(localResxManager.GetString("strMessage"));
        }
    }
}

4.         编译并执行即可显示效果。

这时如果要更改显示语言的话,还是使用

Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr-FR");

这种方式进行更改。


 private void button2_Click(object sender, EventArgs e)
        {
            System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("fr-FR");
        }




3.   本地化DevExprss

通常有两种做法,其一是使用Localizer,需要编写一点代码,且这种方法的灵活性不够,只能本地化为一种语言。

另一种方法是使用前文说到的卫星程序集的方式,这种方式无需编写任何代码,只需本地化资源文件之后,编译成资源程序集,并把这些程序集放在程序的启动目录下即可,并且可以放置多种语言的配件。


DevExpress公司已经为我们准备好了很多东西,官方网站上已经提供了较多语言的资源文件的下载,最新版本的Dev控件,截至2007-3-25该控件的本版是7.1.1,中文的资源文件已经包含如下几个:
   

剩下的工作就是按各自的需要自己汉化了。

3.1. 使用Localizer(Archie觉得此方法不错)

下面我们以一个简单的例子描述XtraGrid中的比较符的本地化。代码如下所示:

private void Form1_Load(object sender, System.EventArgs e) {
   GridLocalizer.Active = new MyGridLocalizer();
}
 
public class MyGridLocalizer : GridLocalizer {
   public override string GetLocalizedString(GridStringId id) {
      string ret = "";
      switch(id) {
         // ...
         case GridStringId.CustomFilterDialogConditionEQU : return "=";
         case GridStringId.CustomFilterDialogConditionNEQ : return "<>";
         case GridStringId.CustomFilterDialogConditionGT : return ">";
         case GridStringId.CustomFilterDialogConditionGTE : return ">=";
         case GridStringId.CustomFilterDialogConditionLT : return "<";
         case GridStringId.CustomFilterDialogConditionLTE : return "<=";
         // ...
         default:
            ret = "";
            break;
      }
      return ret;
   }
}


运行程序,我们可以看到如下的效果:


   

private void Form1_Load(object sender, EventArgs e)
        {
            DevExpress.XtraGrid.Localization.GridLocalizer.Active = new MyGridLocalizer();
        }

        public class MyGridLocalizer : GridLocalizer
        {
            public override string GetLocalizedString(GridStringId id)
            {
                string ret = "";
                switch (id)
                {
                    // ...
                    case GridStringId.GridGroupPanelText:
                        return "拖动到此列";
                   
                    default:
                        ret = "";
                        break;
                }
                return ret;
            }
        }


3.2. 创建卫星程序集

为了本地化窗体资源,.Net Framework已经为我们提供了相应的工具——WinRes.exe。要了解它的具体使用方法,你查看相应的MSDN相关文档。

我们先以一个Library来描述它的本地化步骤,就用XtraEditors吧,如果你有Dev的源代码,你会发现Dev已经把各种资源放在了一个叫做LocalizationRes.resx的资源文件里面。

1.         LocalizationRes.resx文件拷贝一份到你自己的某个目录下,重命名为你需要的culture,比如要本地化为德文的话,就更名为"LocalizationRes.de.resx",当然我们需要的是中文,于是把它更名为LocalizationRes.zh-CHS.resx。窗体或用户控件也都用一个resx文件,同样可以使用这种方式汉化。

2.         现在我们可以借助VS开发环境对这个文件进行汉化了,如下图所示:

3.         现在我们需要借助Resgen.exe把这个文件转化为一个resources文件。

resgen LocalizationRes.zh-CHS.resx LocalizationRes.zh-CHS.resources

4.         把这个资源文件打包到卫星配件中去,仍然使用VS提供的一个小工具——Al.exe。下面的命令行就是把LocalizationRes.zh-CHS.resources文件打包成卫星配件了。

al /out:DevExpress.XtraEditors.Resources.Dll /v:0.0.0.0 /culture: zh-CHS /embed:LocalizationRes.zh-CHS.resources,DevExpress.XtraEditors.LocalizationRes.zh-CHS.resources /keyfile:strongkey.snk

       上面各种参数一目了然吧,就不赘述了。需要注意的是keyfile对应的strongkey必须跟DevExpress相应组件指定的strongkey一致。通过al命令也可以把多个resources文件打包成一个单一的配件。如下面这条命令把多种资源打包成配件。

%al% /out:../zh-CHS/DevExpress.XtraPrinting.%VER_DLL%.Resources.dll /v:%VER_PSYS% /culture:zh-CHS /embed:ComponentEditorForm.zh-CHS.resources,DevExpress.XtraPrinting.ComponentEditorForm.zh-CHS.resources

/embed:LocalizationRes.zh-CHS.resources,LocalizationRes.zh-CHS.resources /embed:HeaderFooterForm.zh-CHS.resources,DevExpress.XtraPrinting.Native.WinControls.HeaderFooterForm.zh-CHS.resources /embed:WatermarkEditorForm.zh-CHS.resources,DevExpress.XtraPrinting.Native.WinControls.WatermarkEditorForm.zh-CHS.resources

/keyfile:%KEYFILE%

       通过这里大家可以看出,已经把几个窗体的资源也打进来了,不过需要注意的是/embed里的第二个参数要加上窗体或控件所在的命名空间。

现在卫星配件已经制作出来了,现在需要把它配置到一个地方以便Framework能够找到它。通常有两种方法,一种是直接把它放到GAC中,方便省事;另一种是把它们放到具体的程序目录下。

要放到GAC里面,简单的方法就是直接把卫星配件拖放到“Windows/assembly”目录下,如果非要显得自己专业一点的话,也可以使用Microsoft提供的工具gacutil,使用如下命令:

gacutil /i:LocalizerRes.zh-CHS.resources.dll

如果不放到GAC中,那就放在你的程序的所在目录下,放置的时候也有一点学问,下面的这个图显示的是逻辑目录结构:

其实很简单,看另一个图可能直观点:

       以下的代码用于设置所选用的资源:

static void Main()

{

    System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("de");

    Application.Run(new Form1());

}

       还是这么简单,事实上只要把资源配件放到目录下即可,无需进行硬编码即可完成本地化工作,那是因为我们一般默认的CurrentUICulture就是zh-CHS

目前为止我们就完成了需要做的大部分工作了,剩下的就是大家想到什么然后给我提提意见或建议,我再进行改进,初次执笔,感觉举笔维艰,写的挺生硬的,将就着看吧,呵呵,,  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值