在开发能具备多个国家用户访问的应用程序时,需要用到.NET的全球化和本地化。全球化就是指我们的应用程序非特定区域性和非特定语言的,也就是不单一的依赖一个国家或者地区的语言时间格式等区域性信息。在进行全球化的过程中,通常的做法是将和区域性相关的信息放在资源文件里面。本地化是针对应用程序支持的每一个区域性将应用程序的资源翻译为本地化版本(也就是相应区域版本)的过程。.NET框架的System.Globalization命名空间包含定义区域性相关信息的类,这些信息包括语言、国家/地区、使用的日历、日期、货币和数字的格式模式以及字符串的排序顺序。我们可以使用这些类编写全球化(国际化)应用程序。其中首先要了解的就是CultureInfo类。
Culture类:此类保存区域性特定的信息,如关联的语言、子语言、国家/地区、日历和区域性约定。Thread.CurrentThread.CurrentUICulture就是一个CultureInfo类,.NET资源管理器主要是根据这个属性来获取相应的资源文件,我们可以这样设置这个属性Thread.CurrentThread.CurrentUICulture = new CultureInfo("zh-CN"),当这样进行设置时和区域性信息相关的类将自动受影响,比如:CompareInfo, StringInfo, Calendar。通常是通过区域性信息来new一个CultureInfo类。
资源文件:前面提到过在进行全球化的过程中是将和区域性相关的信息放在资源文件里面,如页面上要标识的语言。ASP.NET 中的资源文件具有 .resx 扩展名。在运行时,.resx 文件将编译进一个程序集内,该程序集有时称为附属程序集。与 ASP.NET 网页相同,.resx 文件也是动态编译的,因此无需创建资源程序集。编译过程将多个语言类似的资源文件压缩在同一程序集内。资源文件是 XML 文件,其中包含要转换为不同语言或图像路径的字符串。 资源文件包含键/值对, 每一对都是一个单独的资源。 键名不区分大小写。 例如,资源文件可能包含一项键为 Button1 且值为 Submit 的资源。您需要为每种语言(如英语和法语)或每种语言和区域性(如英语 [英国]、英语 [美国])分别创建一个资源文件。 每个本地化资源文件都有相同的键/值对;本地化资源文件与默认资源文件的唯一区别就是前者所包含的资源可能少于后者。 随后,内置的语言回退过程将处理非特定资源或默认资源的加载。
创建资源文件时,首先应创建基 .resx 文件。 对于每种要支持的语言,请创建一个具有相同文件名的新文件。 但在该名称中,应包括语言或语言和区域性(区域性名称)。 有关区域性名称的列表,例如,您可以创建下列文件:
-
WebResources.resx
基资源文件。 这是默认(回退)资源文件。
-
WebResources.es.resx
西班牙语的资源文件。
-
WebResources.es-mx.resx
专用于西班牙语(墨西哥)的资源文件。
-
WebResources.de.resx
德语的资源文件。
在运行时,ASP.NET 使用与 CurrentUICulture 属性的设置最为匹配的资源文件。 线程的 UI 区域性根据页的 UI 区域性进行设置。 例如,如果当前的 UI 区域性是西班牙语,则 ASP.NET 使用 WebResources.es.resx 文件的已编译版本。 如果当前用户界面区域性没有匹配项,ASP.NET 将使用资源回退。 首先,它将搜索特定区域性的资源。 如果这些资源不可用,它将搜索非特定区域性的资源。 如果仍找不到这些资源,ASP.NET 将加载默认资源文件。 在本例中,默认资源文件是 WebResource.resx。
在 ASP.NET 中,可以创建具有不同范围的资源文件。 可以创建全局资源文件,这意味着可以从位于网站中的任意页或代码读取这些资源文件。 也可以创建本地资源文件,这些文件存储单个 ASP.NET 网页(.aspx 文件)的资源。
全局资源文件
将资源文件放入应用程序根目录的保留文件夹 App_GlobalResources 中,即可创建全局资源文件。 App_GlobalResources 文件夹中的任何 .resx 文件都具有全局范围。 此外,ASP.NET 还会生成一个强类型对象,从而提供了一种以编程方式访问全局资源的简便方法。
本地资源文件
本地资源文件是只应用于一个 ASP.NET 页或用户控件的文件(文件扩展名为 .aspx、.ascx 或 .master 的 ASP.NET 文件)。 本地资源文件所放入的文件夹具有 App_LocalResources 保留名称。 与根 App_GlobalResources 文件夹不同,App_LocalResources 文件夹可以位于应用程序的任意文件夹中。 通过使用资源文件的名称,可以将一组资源文件与特定的网页关联起来。
例如,如果在 App_LocalResources 文件夹中有一个名为 Default.aspx 的页,则可以创建下列文件:
-
Default.aspx.resx。 这是未找到语言匹配项时的默认本地资源文件(回退资源文件)。
-
Default.aspx.es.resx。 这是西班牙语的资源文件,其中不包含区域性信息。
-
Default.aspx.es-mx.resx。 这是专用于西班牙语(墨西哥)的资源文件。
-
Default.aspx.fr.resx。 这是法语的资源文件,其中不包含区域性信息。
文件的基名称与页文件名相同,后跟语言和区域性名称,最后以扩展名 .resx 结尾。
在全局和本地资源文件之间选择
在 Web 应用程序中,可以任意组合使用全局和本地资源文件。 通常情况下,当您希望在各页之间共享资源时,应向全局资源文件添加这些资源。 全局资源文件中的资源还是强类型的,用于以编程方式访问。
但如果将所有本地化资源都存储在全局资源文件中,则这些文件会变得很大。 此外,如果多个开发人员要处理不同的页但在同一个资源文件中工作时,全局资源文件也会更难于管理。
本地资源文件使得单个 ASP.NET 网页的资源比较容易管理, 但您不能在各页之间共享资源。 此外,如果有许多页必须本地化为多种语言,则可能会创建大量本地资源文件。 对于包含大量文件夹和使用多种语言的网站,本地资源可使应用程序域中的程序集数目迅速攀升。
更改本地或全局的默认资源文件时,ASP.NET 将重新编译资源并重新启动 ASP.NET 应用程序。 这会影响网站的整体性能。 添加附属资源文件时,将不会导致重新编译资源,但会重新启动 ASP.NET 应用程序。
Resource相关类:
前面提到过,运行时会根据当前线程的CurrentUICulture来加载合适的资源文件,ResourceManager类就是用来完成这个功能的。通过 ResourceManager 的方法,调用方可使用 GetObject 和 GetString 两种方法访问特定区域性的资源。默认情况下,这些方法返回某区域性的资源,该区域性由执行调用的线程的当前区域性设置决定。
相关链接:http://msdn.microsoft.com/zh-cn/library/kx54z3k7(v=VS.80).aspx (CultureInfo的区域性信息)
http://msdn.microsoft.com/zh-cn/library/c6zyy3s9.aspx (asp.net全球化和本地化)
http://msdn.microsoft.com/zh-cn/library/f45fce5x(v=VS.80).aspx (应用程序中的资源)
http://www.codeproject.com/KB/aspnet/localization_websites.aspx (Createing Multilngual Website)