自己学会汉化DevExpress控件[转]
1. 文档导读
本文档以颜色区分内容的重要性和不同性,阅读本文档时请注意以下事项:
1. 红色部分表示需要注意的重点内容;(加粗的尤甚)
2. 蓝色部分表示相应于前版本新增的内容;
3. 紫色部分表示跟前版本不同的内容;
本文档的变动历史都记录在“修改记录说明”一节。本文通过用到英文单词的地方,也是本人理解不是很深刻的地方,如果有什么好的建议,欢迎指正。不胜感激!我的email:sendreams@hotmail.com。
2. 基础知识
2.1. Net Framework知识
在Visual Studio .NET里面,本地化资源,比如字符串、图片之类的,都是跟culture(语言文化)有关,这些东西都是存储在单独的文件中并且根据相应的culture设定进行加载,如果要了解怎样加载你自己的本地化资源,那就需要了解资源文件的组织结构关系:
1. .Net在加载资源文件的时候,它选取资源文件的方式,可以说是按照自下而上的方式,写过程序的都知道继承的概念,有父类之类之说,可以说父类就是上层建筑,也就是那些伟大的领导们,而子类就是广大百姓了,呵呵,这个比喻不是很恰当,纯粹娱乐。Framework里面,父类就对应english,也是唯一的一种没有自身资源文件的,其实也并不是没有,而是存在main assembly里面。
2. 在父类之下,可以有多种多样的culture的资源,我们说的culture是指语言文化并不是指windows控制面板中的区域,比如,法国(French简写为“fr”)就是一个culture。其实english简写成“en”也是一个culture,只不过它比较特别,没办法,谁让现在的it世界是在老外统治着呢。
3. 在这些culture之下,又有一些特定区域的culture,这些特定区域的culture,它有两点属性,不仅包含语言文化,还加上区域特色,就好比中国有中国的文化,而福建还有它自身的区域性文化。偶们的官方语言是普通话,而我们福建还有N多种方言,鄙人不才,也就只会一种咱们家乡的本地话,在同事们听来,有点外星人嫌疑。老美也有老美的文化,有美式英语和英式英语区分,今天刚看了“姨妈的后现代生活”,就是因为她只会英式英语而不追逐美式英语这个大潮流而被解聘了。
在一个程序试图加载一个资源的时候,好比一个字符串,并且还没有找到,它就会沿着上面所说的层次结构一层一层的往上爬,直到找到为止。如果仕途有这么顺利那就好了,呵呵。
在进行本地话的过程中,最好的方法是建立相对通用的资源文件,也就是上文中第2条中的而不是第3条中,就好比我们在汉化的过程中,一般汉化成普通话,而不是汉化成福建话,或者是台湾话。也就是越通用越好,假设你有一个French Belgian ("fr-BE")的资源文件,而且它的直接上级就立马到了最高级english,那么当你的区域设置改变成French Canadian,系统降会寻找对应的"fr-CA"资源,而此时已经无法找到,就会选用处于main assambly中的资源,也就是英文。下图显示的就是你不想看到的场景。
如果你愿意,你可以为"fr" culture放置尽可能多的资源文件,这样French Canadian的用户虽然无法看见"fr-BE"的资源文件,但是它至少可以获得French的资源文件,以下图片就是推荐的方式。
以上我们说的资源文件,还有另一种比较高雅的叫法,叫Satellite Assemblies,翻译成中文可以叫做卫星配件,还真有点卫星绕地球的感觉。需要注意的是这些资源配件的strong name必须跟main assembly的相一致,如果它们不匹配的话,也就无法加载了。
2.2. 本地化WinForm
VS提供了较丰富的本地化方法,通过VS开发环境实现本地化有两种方法,第一种是用系统工具为各种UI元素生成资源文件,然后把这些资源文件编译到卫星配件中去;第二种方法是添加一个资源文件模版然后使用内置的XML Designer进行编辑;第二种方法的好处是还可以本地化messagebox种出现的文本。
下面我们用一个工程简单演示一下这两种本地化步骤:
2.2.1. 用VS生成资源文件
1. 创建一个工程,我的工程名叫:WindowsApplication2;
2. 设置窗体的Localizable为true;此时Language属性已经被设置成了“(Default)”;
3. 往窗体上拉一个Text控件,还是老规矩,设置它的值为“Hello World”;
4. 设置窗体的Language属性为“German (Germany)”;
5. 重新设置Text控件的值为“Hallo Welt”;
6. 设置窗体的Language属性为“French (France)”;
7. 再设置Text控件的值为“Bonjour le Monde”;
8. 保存并编译工程文件。
这时VS为我们生成的文件如上图所示。
9. 按F5执行程序。
生成的文件如上图所示,两个子目录下分别包含资源配件。如“de-DE”目录下包含的“WindowsApplication2.resources.dll”。
10. 简单吧,需要做的工作已经完成了,你已经拥有了一个拥有德文和法文的应用程序了,不过具体显示什么就取决于你操作系统的区域配置了。当然你也可以在程序中指定要显示的语言。下面将通过代码的方式详细说明。
这是需要的命名空间:
// C#
using System.Globalization;
using System.Threading;
// C#
// Sets the UI culture to French (France)
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr-FR");
Application.Run(new Form1());
经过以上处理,我们现在看到的就是法语了,嘎嘎,太简单了,似乎没什么挑战性。不过这种硬编码的方式并不推荐,可以通过用户喜好设定或者是程序设定来更改界面。
2.2.2. 添加资源模版并编辑

添加Resource File类型文件,这里命名为:WinFormStrings,然后编辑文件如下:
法文和德文的添加方法类似,不过需要变动一下文件名,参看下图:
大致修改的情况如下所示:
resource file name
name
Value
Comment
WinFormStrings.de-DE.resx
strMessage
Hallo Welt
WinFormStrings.fr-FR.resx
strMessage
Bonjour le Monde
资源文件是添加好了,下面讲述如何访问这些资源文件:
1. 添加命名空间:using System.Resources;
2. 为主窗口添加一个button,不过此时需要注意的是把窗体的Localizable属性设置为False,否则将无法添加。(我这里懒得用新项目,还是前文提到的那个项目)
3. 为这个button的Click事件编写代码如下,需要注意的是ResourceManager的参数。且默认的ResourceManager是大小写敏感的,虽然也可以设置忽略大小写,不会有造成性能上的损失。
// C#
// Declare a Resource Manager instance
ResourceManager LocRM = new ResourceManager("WindowsApplication1.WinFormStrings"
,typeof(Form1).Assembly);
// Assign the string for the "strMessage" key to a messagebox
MessageBox.Show(LocRM.GetString("strMessage"));
4. 编译并执行即可显示效果。
这时如果要更改显示语言的话,还是使用
Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr-FR");
这种方式进行更改。
3. 本地化DevExprss
通过以上知识的了解,我们是时候开始进行DevExpress的汉化工作了J。
通常有两种做法,其一是使用Localizer, 不过这种方法还是要编写一点代码,觉得还不是很爽,且这种方法的灵活性不够,只能本地化为一种语言。另一种方法是使用前文说到的卫星配件的方式,这种方式 无需编写任何代码,只需本地化资源文件之后,编译成资源配件,并把这些配件放在程序的启动目录下即可,就可以改变相应的界面语言,并且可以放置多种语言的 配件。这样的好处是你可以任意的控制你的界面显示了,想英文就英文,想中文就中文。真是好处多多啊,那我们快开始吧。
DevExpress公司已经为我们准备好了很多东西,官方网站上已经提供了较多语言的资源文件的下载,最新版本的Dev控件,截至2007-3-25该控件的本版是7.1.1,中文的资源文件已经包含如下几个:
剩下的工作就是按各自的需要自己汉化了。
3.1. 使用Localizer
下面我们以一个简单的例子描述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;
}
}
运行程序,我们可以看到如下的效果:
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。
目前为止我们就完成了需要做的大部分工作了,剩下的就是大家想到什么然后给我提提意见或建议,我再进行改进,初次执笔,感觉举笔维艰,写的挺生硬的,将就着看吧,呵呵
自己学会汉化DevExpress控件[转]的更多相关文章
- DevExpress控件库 开发使用经验总结2 DevExpress汉化之WinForm开发模式汉化
2015-01-24 DevExpress控件库默认安装后,使用的本地资源为英文.Developer Express .NET产品都有本地化资源,比如按钮属性,控件属性描述,菜单项,确认和错误的信息等 ...
- 汉化DotNetBar中控件的系统文本
作者:ComponentCN 出处:www.componentcn.com 2011年11月02日 阅读: DotNetBar很多子控件的系统文本.提示信息等都是可以本地化的,可以转化为多种语言,控件 ...
- DevExpress控件安装、汉化使用教程
前言 DevExpress是一个庞大的控件库,也很是好用(没用过,听说),但是要收费. 网上关于DevExpress的教程满天飞,我找了一下午也没找到正确的安装.简单实用教程,还是自己摸索吧. 自己动 ...
- DevExpress控件安装破解和汉化使用教程
这段时间因公司业务需要.net开发且需要用到DevExpress控件,我自己研究学习了一下,用的是visual studio(2013)和DevExpress(V14.1.4),VS2013的下载安装 ...
- DevExpress 控件汉化方法
Ø 简介 本文介绍下 DevExpress 控件的汉化方法,对于英文不怎么好的同学来说,还是非常有必要的.DevExpress 汉化分为运行时汉化,和设计时汉化. 1. 运行时汉化 1) 首 ...
- 【转】DevExpress控件安装
原文链接: DevExpress控件安装.汉化使用教程 - 田园里的蟋蟀 学习网址: 1.DevExpress控件中文网 2.DevExpress控件中文网使用教程 3.DevExpress控件使用经 ...
- Winform DevExpress控件库(一) DevExpress控件库的安装与新建第一个DevExpress项目
前言:因为这段时间要接触到DevExpress控件库,而我本身甚至对winform的控件都了解甚少,所以处在学习中,写下博客主要是为了方便后期的回顾,当然也可以给一些新人第一次接触时做为学习的参考,以 ...
- DevExpress控件库 开发使用经验总结1 DevExpress简介、安装、使用
2015-01-24 最近公司开发的WinForm客户端图书行业ERP管理系统,界面端采用了DevExpress控件库.界面效果非常绚丽,类似于Office2007.2010的界面风格. 其中的控件功 ...
- DevExpress控件的GridControl控件小结
DevExpress控件的GridControl控件小结 (由于开始使用DevExpress控件了,所以要点滴的记录一下) 1.DevExpress控件组中的GridControl控件不能使横向滚动条 ...
随机推荐
- UVa 120 Stacks of Flapjacks【构造法】
题意:给出n张煎饼,从上到下输入,每张煎饼上面都有一个数字,厨师每次可以选择第k张煎饼,进行翻转操作,设计一种方法使得所有煎饼按照从小到大排序(最上面的煎饼最小) 首先是这个翻转的操作,如下图 如图所 ...
- OK335xS psplash 进度条工作原理 hacking
#!/bin/sh # # rc This file is responsible for starting/stopping # services when the runlevel changes ...
- Tomcat 7.0配置SSL的问题及解决办法
http://dong-shuai22-126-com.iteye.com/blog/1830209 以前一直在用Tomcat 6.0.29版本,今下载了apache-tomcat-7.0.33- ...
- 系统性能监控之vmstat和iostat命令
这篇文章主要介绍一些Linux性能检测相关的命令. vmstat和iostat的两个命令可以运行在主流的Linux/Unix操作系统上. 如果vmstat和iostat命令不能再你的电脑上运行,请安装 ...
- java之URL类
Java的网络类可以让你通过网络或者远程连接来实现应用.而且,这个平台现在已经可 以对国际互联网以及URL资源进行访问了.Java的URL类可以让访问网络资源就像是访问你本地的文件夹一样方便快捷.我们 ...
- 一天一个Java基础——数组
一天一个变成了几天一个,最近接受的新东西太多.太快,有好多需要blog的但没有时间,这些基础知识应该是要深挖并好好研究的,不应该每次都草草了事,只看个皮毛. 数组: JVM将数组存储在一个称为堆(he ...
- TCP/IP详解学习笔记(12)-TCP的超时与重传
超时重传是TCP协议保证数据可靠性的另一个重要机制,其原理是在发送某一个数据以后就开启一个计时器,在一定时间内如果没有得到发送的数据报的ACK报文,那么就重新发送数据,直到发送成功为止. 1.超时 超 ...
- Please ensure that adb is correctly located at……问题解决方案
启动android模拟器时.有时会报The connection to adb is down, and a severe error has occured.的错误.在网友说在任务管理器上把所有ad ...
- hadoop2.0中无法启动datanode的问题
问题描述:在启动datanode进程时,能成功的启动:但用jps查看进程时,发现进程不存在,下面是在datanode日记文件的错误信息 如下图的截屏所示: 主要原因:发生错误的原因:由于把data放在 ...
- 转载:C语言的谜题
转载:http://coolshell.cn/articles/945.html 这几天,本站推出了几篇关于C语言的很多文章如下所示: 语言的歧义 [酷壳链接] [CSDN链接] 谁说C语言很简单? ...