[原创].NET应用程序的资源开发 Part 2-实战演练

 本篇主题是续上篇.NET应用程序的资源开发 Part 1-基本概念的。

 关于.NET应用程序资源开发的基本概念介绍完了,也该实际演练一下了,接下来就用一个简单的WinForm例子来看一下在.NET中实现资源开发都有哪些技术,项目代码可以在这里下载/Files/tonybain/Globalization.zip

 我们首先建立一个项目,打开你的VS.NET,建立一个新的名称为“Globalization”的C# Windows 应用程序,然后在窗体Form1中添加一个Button控件。

 Step 1-窗体的LanguageLocalizable属性

我们要为该窗体的资源建立多语言的版本,注意在窗体的属性中,最后两个分别是LanguageLocalizable

 

如果你的应用程序中的窗体要实现本地化,Localizable属性就必须设成true,而通过Language属性则可以为窗体资源添加不同的区域性,你可以看到,现在Language属性的默认值为(Default),这是什么意思呢?记得前面说过,每个主程序集可以有个默认区域性,Language属性现在的默认值就指明了当前建立的窗体资源就是默认区域性的资源。
我们就让这个默认区域性为英语吧,现在把ButtonText属性改为“Test”,窗体的标题改为“Globalization Test Form”,现在我们的窗体看上去应该类似下面这样:

 

接着我们把Language属性值改为“中文(简体)”,然后分别将ButtonForm1Text属性改为“测试”和“国际化测试窗体”。如法炮制,再把Language属性值改为“中文(繁体)”,然后分别将ButtonForm1Text属性改为“測試”和“國際化測試表單”,最后保存项目,编译运行。
你看到了什么?如果你的系统是中文简体版的,看到的应该是中文简体的界面,这是因为.NET运行库会把你的系统默认UI语言作为当前的线程文化使用,并加载符合该文化区域性的资源,这也就是说,如果你的系统默认UI语言是中文繁体的,显示出来的就应该是中文繁体的界面,接下来我们可以来证实这一点。

 Step 2-改变线程的UI语言

回到项目中,先在Form1.cs中添加两个个名字空间的引用:

using System.Globalization;
using System.Threading;

然后在Form1类的构造方法的第一行位置添加下面的代码:

Thread.CurrentThread.CurrentUICulture = new CultureInfo("zh-CHT");

编译运行,怎么样中文繁体的界面出来了吧。其实上面代码的作用就是把当前线程的UI语言设置成了区域性zh-CHT(中文繁体),然后,后面的代码都将工作在这个区域性之中,你可以把当前线程的UI语言设置成任何你想要的区域性,前提是你为窗体建立了该区域性的资源。
你也许会问,那要是设置了一个不存在资源的区域性会发生什么事?我门可以做个小实验,我们把当前线程的UI语言设置成法语-法国:

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

你可能已经看到了,这次出来的是英语的界面,原因很简单,按照运行库定位资源的顺序,它找不到指定区域性的资源,就会使用默认区域性,而我们在前面已经把窗体默认区域性资源做成了英语的。这就又给我们一个启发:默认区域性可以(也应该)作为应用程序的后备区域性来使用,它是在用户的区域性不可预见的情况下,为用户提供的一个缺省区域性。顺便再提一句,如果不是在VS.NET中,你也可以使用.NET Framework提供的Winres.exe工具来本地化窗体,具体的使用方法可以参考MSDN
好了,休息一下,后面还有更有趣的内容等着你呢。

 Step 3-动态加载资源

前面所说的,都是资源已经在程序编译之前就已经存在的情况,如果要在程序运行过程中动态地加载资源,比如要在一个弹出的消息框里显示本地化的消息,那又该如何做呢?
首先,我们为项目添加本地化的消息文本资源,在解决方案资源管理器中,鼠标右键点击项目Globalization,添加一个程序集资源文件,命名为String.resx.,然后在里面增加一条资源,资源的Name为“Message”,Value为“Hello,this is a globalization application.”,保存该文件。接下来在项目里复制该文件两次,并把它们的文件名分别改成String.zh-CHS.resxString.zh-CHT.resx,最后要做的就是分别把前面这两个文件中Name为“Message”的资源的Value值改成“你好,这是一个国际化应用程序。”和“你好,這是一個國際化應用程式。”,这样就为区域性zh-CHSzh-CHT也做好了消息文本资源,现在项目里的文件看上去应该象下面这样:

 

接着,在Form1.cs中,再添加两个名字空间的引用:

using System.Resources;
using System.Reflection;

还要为Button1添加Click事件处理代码:

private void button1_Click(object sender, System.EventArgs e) {

ResourceManager rm 
=new ResourceManager("Globalization.String",Assembly.GetAssembly(typeof(Form1)));
    
string msg = rm.GetString("Message");
    MessageBox.Show(msg);
}

上面的代码先建立了一个ResourceManager的实例,它要求在初始化时提供一个根名参数和一个Assembly参数,表明它是使用给定的Assembly从指定的根名导出的。然后使用该ResourceManager的实例从当前区域性资源附属程序集中提取名称为“Message”的文本资源,最后在消息框中显示该文本。
编译运行项目,点击窗体上的按钮,消息框里会显示出我们添加的消息文本,你还可以把当前线程的UI语言设置成zh-CHT再试试,会发现,消息文本根据当前区域性的不同而不同。当然你还可以往项目里添加其它区域性的资源,只要资源文件的名称符合下面的格式:
       <BaseName>.<Language-Country/Region>.resx

然后记住当前线程的UI语言设置成你想要的区域性。程序集资源文件里还可以包含图像、图标等其它类型的资源,对于它,同样有个Framework工具可以使用,那就是Reseditor.exe程序,用它可以方便地编辑程序集资源文件。 

好了,基本的资源开发技术也介绍完了,本主题也要告一段落了,祝你好运!

参考文档:
1、Microsoft MSDN

posted on 2006-01-19 11:25  I.AM.Wright  阅读(1716)  评论(3编辑  收藏  举报

导航