Winform 多国语言窗体的设计以及.NET中资源文件的使用
Winform中多国语言窗体的设计以及.NET中资源文件的使用
![](http://bookpic.newbooks.com.cn/pic/200705/123873/20070502010514467.png)
最近在做一些多国语言的软件,就学习了一下.NET中的多国语言相应知识,受益不少,下面我就简单介绍一下winform中关于多国语言的实现方法。分为七个部分来讲:资源文件概述、资源文件的分类、资源文件的创建、利用IDE来制作多国语言版本、利用资源文件来做多国语言版本、常用.NET资源文件生成器的使用和总结这七个部分。前两个部分都是一些理论性的东西,如果大家不感兴趣可以跳过,直接看三、四、五这三个部分。
第一部分:资源文件概述
资源文件顾名思义就是存放资源的文件。资源文件在程序设计中有着自身独特的优势,他独立于源程序,这样资源文件就可以被多个程序使用。同时在程序设计的时候,有时出于安全或者其它方面因素的考虑,把重要东西存放在资源文件中,也可以达到保密、安全的效果。
资源文件中一般存三种类型的数据:byte流(byte[])、对象(object)和字符串(string)。对于一些纯文件的信息可以用string类型来保存,对于图片(Image)、图标(Icon)等用object来保存,其它的可以用byte流来保存。
System.Resources命名空间中有大量的类和方法来处理资源文件,我将在下面的篇章中进行介绍。
第二部分:资源文件的分类
资源文件可以分为两类,一类是以.resx为后缀名的文件,一类是以.resources为后缀名的文件。二者的区别在于:
1. resx虽然是以resx结尾的文件,但是它却是XML格式的文件,你可以用记事本等工具直接打开它修改里面的东西;而resources是二进制的文件,相对来说安全性更好一些。
2. resources作为内嵌资源,在指定路径正确的前提下,可以在程序中直接引用;而resx虽然也是内嵌资源,但它却是要依附于.CS文件存在的。也就是说它是作为winform窗体的一个描述性资源存在的,要想在程序中直接使用它,在解决方案中必须有与它同名(只是名字相同,后缀名不同)的.CS文件存在(见图一)。这一点我会在下面的示例中作详细说明。
3. 我们可以利用CSC命令把resx文件转换成resources文件。
RESGEN.EXE LitwareStrings.resx LitwareStrings.resources
注意变量环境为framework1.1。
第三部分:资源文件的创建
这里我介绍两种资源文件的创建方法,一个是利用System.Resources下的ResourceWriter类,另一个是利用资源文件生成器。本节重点讲利用ResourceWriter类来创建资源文件的方法,第二个方法请详见第六部分。
首先要实例化一个ResourceWriter类型的变量:
ResourceWriter rw = new ResourceWriter ( "My.resources" ) ;其中My.resources就是你要生成的文件名。其次要在磁盘上产生这个文件:调用rw.Generate ( ) ;就可以了。
接下来就要为这个资源文件来增加内容了。在ResourceWriter类中提供了一个AddResource ( )方法,这个方法的作用就是往资源文件中添加资源的。在C#中对不同的资源有着不同的加入方式。
1.加入字节数组,语法格式为:
public void AddResource ( string , byte [ ] ) ; |
注释:其中string是在使用资源文件的时候,此字节数组在程序中的的唯一标识符
2. 加入对象,语法格式为:
public void AddResource ( string , object ); |
注释:其中string是在使用资源文件的时候,此对象在程序中的唯一标识符
在本文程序中,我们利用这种调用方式来加入图标和图象,具体如下:
Icon ico = new Icon ( "main.ico" ) ;
Image Turnoff = Image.FromFile ("Turn-off.png") ; Image Turnon = Image.FromFile ( " Turn -on.png" ) ; rw.AddResource ( " main.ico" , ico ) ;//在资源文件中加入图标 //以下是在资源文件中加入图象 rw.AddResource ( " Turn -off.png" , Turnoff ) ; rw.AddResource ( " Turn -on.png" , Turnlon ) ; |
3. 加入字符串,具体语法如下:
public void AddResource ( string1 , string2) ;
public void AddResource ( string1 , string2) ;
注释:其中string1是在使用资源文件的时候,此字符串在程序中的唯一标识符在本文的程序中,是如此使用的:
rw.AddResource ( "MyStr" , "从资源文件中读取字符串" ); |
至此我们已经创建了一个资源文件,并且在资源文件中加入了若干个资源,当然在这之后,还应该注意,保存此资源文件,并关闭资源文件,具体如下:
rw.Close ( ) ; |
以上我介绍了用ResourceWrite类来创建resources文件的方法,对于resx文件,我们可以在vs2003的IDE中在解决方案管理中点右键->添加新项目中->控件资源档来添加。
第四部分:利用IDE来制作多国语言版本
终于进入主题了,但是这一节的内容和前几节关系不大,因为我主要讲如何使用VS的IDE来制作多国语言版本。每一个Form1.cs文件都有一或多个相应的resx文件作为附属资源。他们的命名规则为Form1.cs的资源文件为Form1.resx,Form1.zh-CHS.resx,Form1.zh-CHT.resx等,其中Form1.resx是缺省的窗体资源文档,其它是在不同语言环境要使用的资源文档,其中Form1.zh-CHS.resx是中文简体系统,Form1.zh-CHT.resx是中文繁体系统(如下图一)。关于命名可不是随便起的,可以参见msdn中关于不同地区的命名规则。
(图一)
![](http://bookpic.newbooks.com.cn/pic/200705/123873/20070502010514340.png)
每一个窗体都有Localizable和Language这两个属性,其缺省值如下图:
(图二)
![](http://bookpic.newbooks.com.cn/pic/200705/123873/20070502010514135.png)
Localizable表示是否使用本地化资源,当其为true时,可以在Language中选择一种语种,例如选繁体中文,如下图:
(图三)
![](http://bookpic.newbooks.com.cn/pic/200705/123873/20070502010514769.png)
这时,窗体的布局会发现变化,你要重新布局窗体上的控件位置、大小、内容等等。布局好以后,你可以继续选择其它的语种来布局。不用担心,它们之间不会有冲突,因为所有不同语种之间的布局差别都被保存到相应的resx文件中了,如图一。最后保存、编译。
为了测试结果,我们可以改变机器的语言环境,方法有二:一是在控件面板中的更改语言选项。另一个是用程序来改。下面我介绍一下第二种方法,用程序来改变当前进程的语言环境。
在程序运行时,会自动检测当前的系统语言环境,我们可以通过修改System.Threading.Thread.CurrentThread.CurrentUICulture这个属性来改变当前UI运行的语言环境,代码如下:
static void Main()
{
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo( "zh-CHS" );
Application.Run(new Form1());
}
效果图如下:
(图四)
![](http://bookpic.newbooks.com.cn/pic/200705/123873/20070502010514334.png)
更改System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo( "zh-CHT" );后,效果如下:
(图五)
![](http://bookpic.newbooks.com.cn/pic/200705/123873/20070502010514152.png)
第五部分:利用资源文件来做多国语言版本
在第三节我们已经说过如何利用ResourceWriter类来创建资源文件,本节就讲讲怎么来使用这些资源文件。利用第三节介绍的方法分别建立三个文件MyResource.resources、MyResourceZH_TW.resources和MyResourceEn.resources分别对应缺省、繁体和英文三个系统。每个文件中有两个string和一个object对象,分别对应button,textbox和Icon。
图四、图五中的language的菜单栏对应代码如下:
private void English_Click(object sender, System.EventArgs e)
{
ResourceManager rm = new ResourceManager( "EmbedResource.MyResourceEn" , Assembly.GetExecutingAssembly() );
textBox1.Text = rm.GetString( "TextBoxValue" );
button1.Text = rm.GetString( "ButtonValue" );
this.Icon = (Icon)rm.GetObject( "Demo.ico" );
}
private void ChineseTraditional_Click(object sender, System.EventArgs e)
{
ResourceManager rm = new ResourceManager( "EmbedResource.MyResourceZH_TW" , Assembly.GetExecutingAssembly() );
textBox1.Text = rm.GetString( "TextBoxValue" );
button1.Text = rm.GetString( "ButtonValue" );
this.Icon = (Icon)rm.GetObject( "Demo.ico" );
}
效果图如下:
![](http://bookpic.newbooks.com.cn/pic/200705/123873/20070502010514467.png)
![](http://bookpic.newbooks.com.cn/pic/200705/123873/20070502010514670.png)
在第二部分中,我说过resx和resources调用的方法不同,下面我再说说resx文件如何来调用。由于resx是cs文件的附属文文件,所以项目中一定要有同名的cs文件存在。如图一。
调用resx使用如下代码:
ResourceManager rm = new ResourceManager( "EmbedResource.Form1" , Assembly.GetAssembly(typeof(EmbedResource.Form1)));
textBox1.Text = rm.GetObject( "textBox1.Visible" ).ToString();
其中EmbedResource是namespace,Form1为资源文件名(不包含后缀名),第二个参数Assembly.GetAssembly(typeof(EmbedResource.Form1))中EmbedResource是namespace,而Form1是resx附属的cs文件的名称。注意区分。
第六部分:常用.NET资源文件生成器的使用
在网上相关的软件已经很多了,我给大家介绍一个Resourcer.exe,它是开源的,可以在http://www.aisto.com/roeder/dotnet/ 中下载。其运行界面如下:
![](http://bookpic.newbooks.com.cn/pic/200705/123873/20070502010514804.png)
该软件可以自动保存成text、resx和resources三种格式的文件。前面的资源可以很方便的使用此软件来创建。大家可以自己下载下来试试。我在这里就不多说了。
第七部分:总结
通过上面的介绍我们已经具备了制作多国语言的基础,当然这只是对多国语言制作的初步介绍。有什么不妥的地方,请在评论中指正,我会尽快改过来的。