假如你计划在你的应用程序中包括对使用各种语言的用户的支持,那么开发它的代价不会比开发只支持英语的版本要高很多。但是假如你需要翻新一个已有应用程序,那么其代价和重新开发它差不了多少。
.NET框架在它的System.Globalization名字空间中提供了对全球化(globalization,指得是支持多种语言)的支持,这样你就可以在你的应用程序中实现多语种支持了。这个名字空间包括了若干类,用来处理许多重要的全球化问题,如文明识别字符串比较、日期和时间格式、数字格式和支持阳历和其它历法的日历。你首先需要知道的一个要害的类就是CultureInfo类。(译者注:这里的文明即culture,主要指得是语种,也包括记录时间日期的习惯等等)
使用CultureInfo类
CultureInfo类提供了文明参数选择的支持以及可以在每个线程(per-thread)基础上的控制。CurrentCulture合适的处数据和数字格式、字符串比较和大小写。CurrentUICulture属性由开发者来设置,CLR用它来为用户界面装载适当的资源。你可以用CultureInfo类来为当前线程设置CurrentCulture和CurrentUICulture,如下所示:
Thread.CurrentThread.CurrentUICulture = new CultureInfo("ja")
Thread.CurrentThread.CurrentCulture = new CultureInfo("ja-JP")
还有一些API函数可以用CultureInfo类来控制输出:
Str = DateTime.Now.ToString(cultureInfo);
所有与文明有关的(culture-aware)类都是默认为文明敏感的(culture-sensitive),因此你只要简单的设置当前线程的文明就可以自动给System.Globalization名字空间中的类(如CompareInfo、StringInfo和Calendar)以及核心系统类(如Resources、DataTime和String)提供针对特定文明的支持。
为了可以支持更多的文明种数,你还需要在你的应用程序中全部使用符合统一字符编码标准的字符串(Unicode string)。尽管.NET框架提供了对Unicode字符串的完全支持,不过你仍需要在编写代码的时候意识到所有的字符串都写成Unicode格式。而且你还需要清楚许多依靠操作系统的操作(包括对文件系统的访问和某些控制)并不支持Unicode格式的字符串,因此你还必须在执行这些操作之前进行显式格式转换。
规划本地化
全球化将某些要害的数据以我们熟悉的国际通用(international)格式保存,但是假如你希望让你的用户得到专门为他们的文明而开发的应用程序,你就需要本地化你的应用程序。本地化包括了为特定文明创建特定资源然后再写你的应用程序,这样它针对程序所设定或者检测出来的某种文明而装载合适的资源。让我们具体看看资源模型。
资源模型
.NET框架的资源模型包括了对任何可串行化对象(serializable object)的支持,它还可以扩展以支持新的格式。这就意味着除了提示符、标签以及其它用户界面元素上的针对特定文明的字符串之外,你还可以把声音、图像和其它二进制数据当作资源使用。Asp.Net(包括.NET Compact Framwork,它在设备的运行时间和内存的大小上有限制)和Windows Form支持该资源模型。
为了本地化应用程序,你需要识别特定文明资源(你需要用它们来展开程序),然后把它们放置到一个资源文件中。简单的应用程序只需要字符串资源(字符串中保存“名字——值”对),你可以创建特定文明的文本文件。尽管自己演示一番很有趣,但你应该用微软ResX格式来创建资源文件。Visual Studio中有一个工具支持创建.resx文件(它包括了用XML格式对资源的描述)和.resources文件(它包括了二进制已编译文件)。你即可以把这些文件随同你的程序一同发布,也可以把它们编译到一个附属汇编(satellite assembly)中去。
在命名和保存你的资源文件时,你应该保持一致性。微软建议在命名.resources文件时,文件名应该嵌入文明名(例如,..resources),一个资源文件对应于你支持的一种文明。附属资源汇编应该以项目名称命名(如,.resources.dll),然后把它们放到不同的子目录下(每个子目录对应一种文明)。
在运行时使用资源文件
一旦创立了资源文件,你就可以用资源治理器(resource manager)来在运行时载入字符串和对象。资源即可以根据CurrentThread中的CurrentUICulture设置来载入(例如:RM.GetObject("Button1.Cursor")),你也可以在载入某个资源时指明文明(例如:RM.GetString("mystring", new CultureInfo("en-NZ"))。
ASP.NET、.NET Compact Framework以及Windows Forms应用程序中都有资源治理器。而且Windows Forms引擎提供了额外的本地化支持。每个form都有一个可以设置的本地化属性。当设置为“真”时,项目系统会自动跟踪form的不同语言版本并把不同语言的form编译到附属汇编中去。
只要你在你的原设计中考虑到本地化,那么建立international应用程序并不建立支持单一文明的应用程序难很多。在建议一个假定只支持英语用户界面的应用程序之前,.NET体系应该询问针对其它文明所期望提供支持的特定问题。