CurrentCulture
这个属性用来表示和改变使用者要使用的“地区属性”,地区属性改变后,数字、日期时间等表示格式也随之改变。
注意:一定是“地区属性”,如"zh-cn"、"en-US"等等。
CurrentUICulture
顾名思义,该属性表示使用者所使用的界面语言,可以是“语言属性”,如"zh"、"en"等等。
比如说,用户登录windows后,界面可以是英文的(CurrentUICulture),但数字以及日期的显示方式可以是*的(CurrentCulture)。
使用Windows控制面板中的“区域和语言”选项,用户就可以改变CurrentCulture的默认设置。使用这个配置,还可以改变文化的默认数字、时间和日期格式。CurrentUICulture不依赖于这个配置,而依赖于操作系统的语言。
在做多语言项目时,往往需要编程动态改变当前应用程序的文化,这是最主要的是必须改变CurrentUICulture,在改变CurrentCulture时需要慎重,因为这种改变将会导致各种转换格式的改变,从而造成配置文件读写转换失败。
VS2005彻底改变了开发软件多语言版本费时费力的现状,现在用VS2005可以方便地实现一个针对世界上所有语言的地方版本。
1.
文化和区域
世界分为若干个文化和区域,应用程序必须知道这些文化和区域的区别。文化是基于用户的语言和文化习惯的一组特性。RFC
1766定义了文化的名称,这些名称根据语言和国家或区域的不同在世界各地使用。例如en-AU、en-CA、en-GB和en-US分别用于表示澳大利亚、加拿大、英国和美国的英语。
2.
CurrentCulture和CurrentUICulture
应用程序中的文化分为两种类型:用户界面的文化和数字及日期格式的文化。文化与线程相关,有了这两种文化类型,就可以把两个文化设置应用于线程。用线程设置文化时,Thread类提供了属性CurrentCulture和CurrentUICulture。属性CurrentCulture用于设置与格式化和排序选项一起使用的文化,而属性CurrentUICulture用于设置用户界面的语言。
使用Windows控制面板中的“区域和语言”选项,用户就可以改变CurrentCulture的默认设置。使用这个配置,还可以改变文化的默认数字、时间和日期格式。CurrentUICulture不依赖于这个配置,而依赖于操作系统的语言。
3.
应用程序加载的过程
对于一个本地化的软件,.Net应用程序都有CurrentCulture和CurrentUICulture两个属性,当它加载时,这两个属性默认为操作系统中预定义的值。.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主要体现在对一些函数,尤其是Format、ToString函数的使用上,很多函数同string、date类一样,提供在格式化为本地格式的重载函数,这些函数一般带有IFormatProvider参数,允许用编程的方式提供不同文化的格式化的结果。例如:下面的代码生成了法语法国地区的数字与日期的格式化字符串。
int
val =12345678;
val.ToString("N",
new CultureInfo("fr-FR")
DateTime
d =new DateTime(2003, 08, 09);
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;
using System;
using System.Collections.Generic;
using
System.Globalization;
using System.Linq;
using
System.Security.Permissions;
using System.Text;
using
System.Threading;
[assembly:
SecurityPermission(SecurityAction.RequestMinimum, ControlThread =
true)]
namespace SamplesCultureInfo
{
class
SamplesCultureInfo
{
public static void Main()
{
// Displays the name of the CurrentCulture of the current
thread.
Console.WriteLine("CurrentCulture is {0}.",
CultureInfo.CurrentCulture.Name);
// Changes the CurrentCulture of the current thread to th-TH.
Thread.CurrentThread.CurrentCulture = new CultureInfo("th-TH",
false);
Console.WriteLine("CurrentCulture is now {0}.",
CultureInfo.CurrentCulture.Name);
// Displays the name of the CurrentUICulture of the current
thread.
Console.WriteLine("CurrentUICulture is {0}.",
CultureInfo.CurrentUICulture.Name);
// Changes the CurrentUICulture of the current thread to
ja-JP.
Thread.CurrentThread.CurrentUICulture = new
CultureInfo("ja-JP",false);
Console.WriteLine("CurrentUICulture
is now {0}.", CultureInfo.CurrentUICulture.Name);
Console.ReadKey();
}
}
}