c#

位置:IT落伍者 >> c# >> 浏览文章

用.NET的System.Globalization来创建多语言应用程序


发布日期:2022年12月07日
 
用.NET的System.Globalization来创建多语言应用程序

如果你计划在你的应用程序中包括对使用各种语言的用户的支持那么开发它的代价不会比开发只支持英语的版本要高很多但是如果你需要翻新一个已有应用程序那么其代价和重新开发它差不了多少

NET框架在它的SystemGlobalization名字空间中提供了对全球化(globalization指得是支持多种语言)的支持这样你就可以在你的应用程序中实现多语种支持了这个名字空间包括了若干类用来处理许多重要的全球化问题如文明识别字符串比较日期和时间格式数字格式和支持阳历和其它历法的日历你首先需要知道的一个关键的类就是CultureInfo类(译者注这里的文明即culture主要指得是语种也包括记录时间日期的习惯等等)

使用CultureInfo类

CultureInfo类提供了文明参数选择的支持以及可以在每个线程(perthread)基础上的控制CurrentCulture合适的处数据和数字格式字符串比较和大小写CurrentUICulture属性由开发者来设置CLR用它来为用户界面装载适当的资源你可以用CultureInfo类来为当前线程设置CurrentCulture和CurrentUICulture如下所示

ThreadCurrentThreadCurrentUICulture = new CultureInfo(ja)

ThreadCurrentThreadCurrentCulture = new CultureInfo(jaJP)

还有一些API函数可以用CultureInfo类来控制输出

Str = DateTimeNowToString(cultureInfo);

所有与文明有关的(cultureaware)类都是默认为文明敏感的(culturesensitive)因此你只要简单的设置当前线程的文明就可以自动给SystemGlobalization名字空间中的类(如CompareInfoStringInfo和Calendar)以及核心系统类(如ResourcesDataTime和String)提供针对特定文明的支持

为了可以支持更多的文明种数你还需要在你的应用程序中全部使用符合统一字符编码标准的字符串(Unicode string)尽管NET框架提供了对Unicode字符串的完全支持不过你仍需要在编写代码的时候意识到所有的字符串都写成Unicode格式而且你还需要清楚许多依靠操作系统的操作(包括对文件系统的访问和某些控制)并不支持Unicode格式的字符串因此你还必须在执行这些操作之前进行显式格式转换

规划本地化

全球化将某些关键的数据以我们熟悉的国际通用(international)格式保存但是如果你希望让你的用户得到专门为他们的文明而开发的应用程序你就需要本地化你的应用程序本地化包括了为特定文明创建特定资源然后再写你的应用程序这样它针对程序所设定或者检测出来的某种文明而装载合适的资源让我们详细看看资源模型

资源模型

NET框架的资源模型包括了对任何可串行化对象(serializable object)的支持它还可以扩展以支持新的格式这就意味着除了提示符标签以及其它用户界面元素上的针对特定文明的字符串之外你还可以把声音图像和其它二进制数据当作资源使用ASPNET(包括NET Compact Framwork它在设备的运行时间和内存的大小上有限制)和Windows Form支持该资源模型

为了本地化应用程序你需要识别特定文明资源(你需要用它们来展开程序)然后把它们放置到一个资源文件中简单的应用程序只需要字符串资源(字符串中保存名字——值对)你可以创建特定文明的文本文件尽管自己演示一番很有趣但你应该用微软ResX格式来创建资源文件Visual Studio中有一个工具支持创建resx文件(它包括了用XML格式对资源的描述)和resources文件(它包括了二进制已编译文件)你即可以把这些文件随同你的程序一同发布也可以把它们编译到一个附属汇编(satellite assembly)中去

在命名和保存你的资源文件时你应该保持一致性微软建议在命名resources文件时文件名应该嵌入文明名(例如resources)一个资源文件对应于你支持的一种文明附属资源汇编应该以项目名称命名(如resourcesdll)然后把它们放到不同的子目录下(每个子目录对应一种文明)

在运行时使用资源文件

一旦创立了资源文件你就可以用资源管理器(resource manager)来在运行时载入字符串和对象资源即可以根据CurrentThread中的CurrentUICulture设置来载入(例如RMGetObject(ButtonCursor))你也可以在载入某个资源时指明文明(例如RMGetString(mystring new CultureInfo(enNZ))

ASPNETNET Compact Framework以及Windows Forms应用程序中都有资源管理器而且Windows Forms引擎提供了额外的本地化支持每个form都有一个可以设置的本地化属性当设置为项目系统会自动跟蹤form的不同语言版本并把不同语言的form编译到附属汇编中去

只要你在你的原设计中考虑到本地化那么建立international应用程序并不建立支持单一文明的应用程序难很多在建议一个假定只支持英语用户界面的应用程序之前NET体系应该询问针对其它文明所期望提供支持的特定问题

上一篇:使用Web服务和Ja.NET来实现互用性

下一篇:剖析.Net下的数据访问层技术(4)