[原创].NET应用程序的资源开发 Part 2-实战演练
2006-01-19 11:25
357 查看
本篇主题是续上篇.NET应用程序的资源开发 Part 1-基本概念的。
关于.NET应用程序资源开发的基本概念介绍完了,也该实际演练一下了,接下来就用一个简单的WinForm例子来看一下在.NET中实现资源开发都有哪些技术,项目代码可以在这里下载/Files/tonybain/Globalization.zip。
我们首先建立一个项目,打开你的VS.NET,建立一个新的名称为“Globalization”的C# Windows 应用程序,然后在窗体Form1中添加一个Button控件。
Step 1[/b]-窗体的Language[/b]和Localizable[/b]属性[/b]
我们要为该窗体的资源建立多语言的版本,注意在窗体的属性中,最后两个分别是Language和Localizable:
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[/b]-动态加载资源[/b][/b]
前面所说的,都是资源已经在程序编译之前就已经存在的情况,如果要在程序运行过程中动态地加载资源,比如要在一个弹出的消息框里显示本地化的消息,那又该如何做呢?
首先,我们为项目添加本地化的消息文本资源,在解决方案资源管理器中,鼠标右键点击项目Globalization,添加一个程序集资源文件,命名为String.resx.,然后在里面增加一条资源,资源的Name为“Message”,Value为“Hello,this is a globalization application.”,保存该文件。接下来在项目里复制该文件两次,并把它们的文件名分别改成String.zh-CHS.resx和String.zh-CHT.resx,最后要做的就是分别把前面这两个文件中Name为“Message”的资源的Value值改成“你好,这是一个国际化应用程序。”和“你好,這是一個國際化應用程式。”,这样就为区域性zh-CHS和zh-CHT也做好了消息文本资源,现在项目里的文件看上去应该象下面这样:
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
关于.NET应用程序资源开发的基本概念介绍完了,也该实际演练一下了,接下来就用一个简单的WinForm例子来看一下在.NET中实现资源开发都有哪些技术,项目代码可以在这里下载/Files/tonybain/Globalization.zip。
我们首先建立一个项目,打开你的VS.NET,建立一个新的名称为“Globalization”的C# Windows 应用程序,然后在窗体Form1中添加一个Button控件。
Step 1[/b]-窗体的Language[/b]和Localizable[/b]属性[/b]
我们要为该窗体的资源建立多语言的版本,注意在窗体的属性中,最后两个分别是Language和Localizable:
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[/b]-动态加载资源[/b][/b]
前面所说的,都是资源已经在程序编译之前就已经存在的情况,如果要在程序运行过程中动态地加载资源,比如要在一个弹出的消息框里显示本地化的消息,那又该如何做呢?
首先,我们为项目添加本地化的消息文本资源,在解决方案资源管理器中,鼠标右键点击项目Globalization,添加一个程序集资源文件,命名为String.resx.,然后在里面增加一条资源,资源的Name为“Message”,Value为“Hello,this is a globalization application.”,保存该文件。接下来在项目里复制该文件两次,并把它们的文件名分别改成String.zh-CHS.resx和String.zh-CHT.resx,最后要做的就是分别把前面这两个文件中Name为“Message”的资源的Value值改成“你好,这是一个国际化应用程序。”和“你好,這是一個國際化應用程式。”,这样就为区域性zh-CHS和zh-CHT也做好了消息文本资源,现在项目里的文件看上去应该象下面这样:
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
相关文章推荐
- [原创].NET应用程序的资源开发 Part 1-基本概念(2006.01.19修订)
- [.NET] 在Windows系统中搭建基于.NET的iPhone应用程序虚机开发环境
- [原创].NET 分布式架构开发实战五 Framework改进篇
- ZZ:使用.NET语言开发Silverlight应用程序入门(二):界面和对象模型
- iphone开发返回Documents Tmp 应用程序资源文件夹路径
- 分享15款为开发人员准备的开发移动应用程序必备的新资源和工具
- 基于DDD的.NET开发框架ABP实例,多租户 (Sass)应用程序,采用.NET MVC, Angularjs, EntityFramework-介绍
- 基于DDD的.NET开发框架ABP实例,多租户 (Saas)应用程序,采用.NET MVC, Angularjs, EntityFramework-介绍
- 基于Grove的.NET应用程序开发提示
- .NET应用程序开发标准化
- 使用.net开发Windows应用程序的过程概要
- .Net平台下开发中文语音应用程序[转]
- 收集一些.NET开发资源站点和部分优 秀.NET开源项目 (转)
- 使用.NET语言开发Silverlight应用程序入门(一):了解项目结构
- 基于Grove的.NET应用程序开发提示2
- 收集一些.NET开发资源站点和部分优秀.NET开源项目
- 年底发福利了——分享一下我的.NET软件开发资源
- [原创].NET 分布式架构开发实战五 Framework改进篇
- 精通Silverlight——第11章 使用.NET开发Silverlight应用程序
- ZZ:使用.NET语言开发Silverlight应用程序入门(二):界面和对象模型