现在的位置: 首页 > 综合 > 正文

用VS2005实现软件多语言版本的迅捷开发(转载)

2013年04月28日 ⁄ 综合 ⁄ 共 1974字 ⁄ 字号 评论关闭

VS2005彻底改变了开发软件多语言版本费时费力的现状,现在用VS2005可以方便地实现一个针对世界上所有语言的地方版本。

1. 文化和区域
世界分为若干个文化和区域,应用程序必须知道这些文化和区域的区别。文化是基于用户的语言和文化习惯的一组特性。RFC 1766定义了文化的名称,这些名称根据语言和国家或区域的不同在世界各地使用。例如en-AU、en-CA、en-GB和en-US分别用于表示澳大利亚、加拿大、英国和美国的英语。

2. CurrentCulture和CurrentUICulture
应用程序中的文化分为两种类型:用户界面的文化和数字及日期格式的文化。文化与线程相关,有了这两种文化类型,就可以把两个文化设置应用于线程。用线程设置文化时,Thread类提供了属性CurrentCultureCurrentUICulture。属性CurrentCulture用于设置与格式化和排序选项一起使用的文化,而属性CurrentUICulture用于设置用户界面的语言。

使用Windows控制面板中的“区域和语言”选项,用户就可以改变CurrentCulture的默认设置。使用这个配置,还可以改变文化的默认数字、时间和日期格式。CurrentUICulture不依赖于这个配置,而依赖于操作系统的语言。

3. 应用程序加载的过程
对于一个本地化的软件,.Net应用程序都有CurrentCultureCurrentUICulture两个属性,当它加载时,这两个属性默认为操作系统中预定义的值。.Net应用程序会去程序目录下寻找有文化名称为名字的目录,以及寻找相对应的语言包(附属资源程序集),文件名为assemblyname.resources.dll,如果找到就会加载,如果找不到就会去用默认的(不变的)文化语言包,如果这个语言包也找不到——程序当然会报错。

4. 多语言版CurrentUICulture
每个窗体都有一个可以设置为 true 或 false 的 Localizable 属性。将该属性设置为 true,就创建了该窗体的多语言版本,Visual Studio 2005 将在幕后为您创建和维护一组已本地化的资源文件。接着,将窗体的Language 属性更改为特定语言(如"中文 (简体)"),则 Visual Studio 会新建一个本地化资源文件,编译后将自动生成该语言的语言包。因此您需要作的就是,更改Language 属性后,直接用该种语言编辑窗体.您可以修改该窗体上的字符串、控件的大小以及位置、甚至替换图片。这样的特性,可以允许您的软件的中文版和英文风格炯异。
图:

5. 不在窗体上的本地化资源
无需将所有的需本地化资源放置到窗体上,程序中使用的字符串、图片、xml文件等等需要本地化的资源还可以装入到资源文件中。VS2005在项目属性设置中预置了一个资源文件。
图:

您可以将程序中需要本地化的东西都放在这个资源文件中,在C#程序中您可以以assemblyName.Properties.Resource.resourcename的方式直接引用它。
那项目资源文件中的资源怎样本地化呢?你只需要复制该文件,用新的名称命名,如Resources.zh-CHS.resx,注意到新的名称新增加的部分必须是文化名。接着你在IDE中本地化这个新的资源文件就可以了,剩下的事情,VS2005都帮我们去作了。

6. 多语言版CurrentCulture
多语言版CurrentCulture主要体现在对一些函数,尤其是FormatToString函数的使用上,很多函数同string、date类一样,提供在格式化为本地格式的重载函数,这些函数一般带有IFormatProvider参数,允许用编程的方式提供不同文化的格式化的结果。例如:下面的代码生成了法语法国地区的数字与日期的格式化字符串。

int val = 12345678;
val.ToString(
"N"new CultureInfo("fr-FR")

DateTime d 
= new DateTime(20030809);
d.ToString(
"D"new CultureInfo("fr-FR"));

7. 编程改变当前CurrentUICulture和CurrentCulture
对于许多大型的项目,会产生编程动态改变当前应用程序的文化的需求,在.Net中,这似乎也简单:

      // set culture for formatting
      Thread.CurrentThread.CurrentCulture = ci;

      
// set culture for resources
      Thread.CurrentThread.CurrentUICulture = ci;

参考文献:

抱歉!评论已关闭.