- 第20章 多语言本地化应用程序
第20章 多语言本地化应用程序
在软件开发中,开发出全球通用的应用程序一直以来都是开发者的追求目标之一,当然,这也是国际化软件公司所要解决的一个重要的问题。对于这个问题,.NET Framework提供了很好的支持,它建议在开发全球通用的应用程序时可以将此过程分为三个步骤进行:全球化、本地化分析和本地化。
在全球化过程中,将编写应用程序的可执行代码,而一个真正的全球化应用程序应该是非特定区域性和非特定语言的。因此,应该集中精力去创建能够支持适用于所有用户的本地化用户界面和区域数据的应用程序。但这里需要说明的是,尽管全球化应用程序具有这种灵活性,但全球化过程本身并不涉及用户界面的翻译。相反,开发者应致力于使创建的应用程序具有对来自应用程序所支持的所有区域性和地区的用户均有效的功能。
本地化分析是一个中间过程,用于验证全球化应用程序是否已准备好进行本地化。如果应用程序的可执行代码已经同应用程序的可本地化资源明显分开,则此应用程序就可以开始进行本地化。公共语言运行时的附属程序集资源模型完全支持这种代码同资源的分离,可执行代码位于应用程序的主程序集中,只有资源位于应用程序的资源文件中。可以说,执行本地化分析检查有助于确保本地化过程不会将任何功能上的缺陷引入应用程序。
本地化是针对应用程序支持的每一个区域性将应用程序的资源翻译为本地化版本的过程。可以开始进行本地化的应用程序分为两个概念块:一个是包含所有用户界面元素的块,它仅包含非特定区域性的可本地化用户界面元素,如字符串、错误信息、对话框、菜单、嵌入的对象资源等;另一个是包含可执行代码的块,它仅包含由所有支持的区域性使用的应用程序代码。正如上面所讲,公共语言运行时支持一个附属程序集资源模型,该模型将应用程序的可执行代码同其资源分开。
20.1 ASP.NET网页资源
如果你的应用程序需要支持多语言功能,那么你的首要工作就是需要为每种语言(如英语和法语)或每种语言和区域性(如英语[英国]、英语[美国])分别创建一个资源文件。这样,就可以在ASP.NET网页中将控件配置为从资源获取其属性值。在运行时,资源表达式将被相应资源文件中的资源替换。
那么,什么是资源文件呢?其实,资源文件就是一个XML文件,它包含了要转换为不同语言或图像路径的字符串。其中,资源文件使用键/值对来表示单独的资源,即每一对键/值对都是一个单独的资源。键名不区分大小写。
在ASP.NET中,资源文件是具有.resx扩展名的文件,如MyResources.resx。其创建方法很简单,首先需要创建相关的资源文件夹,也就是资源文件类型[全局资源((Ap_Global Resources)或者本地资源((Ap_Local Resources),本节将详细介绍它们之间的区别]。然后在资源文件夹里面创建相关的资源文件。图20-1创建了一个名为MyResources.resx的资源文件。
图 20-1 创建资源文件
这里需要特别注意的是,对于每种要支持的语言,需要创建一个具有相同文件名称的新资源文件。但在这些资源文件名称中,应包括语言或语言和区域性名称,如图20-2所示。
其中:
1)MyResources. resx是基资源文件,它也是默认(回退)的资源文件。
2)MyResources. es.resx是西班牙语的资源文件,其中不包含区域性信息。
3)MyResources. es-mx.resx是专用于西班牙语(墨西哥)的资源文件。
4)MyResources. de.resx是德语的资源文件,其中不包含区域性信息。
在运行时,这些.resx资源文件将编译进一个程序集内,该程序集也被称为附属程序集。与ASP.NET网页相同,.resx资源文件也是动态编译的,因此无须创建资源程序集。编译过程将多个语言类似的资源文件压缩在同一程序集内。
创建好.resx资源文件之后,就可以对资源文件进行编辑了,如图20-3所示。
图 20-2 资源文件
图 20-3 编辑资源文件
如图20-3所示,可以在资源文件里添加图片、字符串文本、Text文本文件等资源。但这里需要注意的是,每个本地化资源文件都有相同的键/值对。而本地化资源文件与默认资源文件的唯一区别就是前者所包含的资源可能少于后者。随后,内置的语言回退过程将处理非特定资源或默认资源的加载。
在运行时,ASP.NET将使用与CurrentUICulture属性(该属性将在本章的后面详细阐述)的设置最为匹配的资源文件。线程的UI区域性根据页的UI区域性进行设置。例如,如果当前的UI区域性是西班牙语,则ASP.NET使用MyResources.es.resx文件的已编译版本。如果当前用户界面区域性没有匹配项,则ASP.NET将使用资源回退。首先,它将搜索特定区域性的资源。如果这些资源不可用,它将搜索非特定区域性的资源;如果仍找不到这些资源,ASP.NET将加载默认资源文件,即MyResources.resx。
最后,解释一下区域性概念。简单地讲,可以把区域性通常分为三个集合:即固定区域性、非特定区域性和特定区域性。
1)固定区域性不区分区域性,应用程序可通过标识符或使用空字符串("")的名称来指定固定区域性。
2)非特定区域性是与某种语言关联但不与国家/地区关联的区域性。
3)特定区域性是与某种语言和某个国家/地区关联的区域性。例如,fr是法语区域性的中性名称,fr-FR是指定法语(法国)区域性的名称。但这里需要注意的是,“简体中文”和“繁体中文”均为非特定区域性。
20.1.1 全局资源文件
如果需要创建全局资源文件,那么必须创建一个名为App_GlobalResources的文件夹。其创建方法很简单,执行“Add|Add ASP.NET Folder|App_GlobalResources”选项就可以了。需要特别注意的是:一个应用程序中只能有一个App_GlobalResources文件夹,且它必须位于应用程序的根目录下。
在App_GlobalResources文件夹中,只能添加.xml、.txt与.resx三种格式的文件。其一般的名称格式为:
名称.resx
名称.语言.resx
名称.语言-区域性.resx
App_GlobalResources文件夹中的任何.resx文件都具有全局范围。除此之外,ASP.NET还会生成一个强类型对象,从而提供了一种以编程方式访问全局资源的简便方法。
20.1.2 本地资源文件
如果在应用程序中需要创建本地资源文件(也可以称为局部资源文件),那么必须创建一个名为App_LocalResources的文件夹。其创建方法与创建App_GlobalResources文件夹相似,执行“Add|Add ASP.NET Folder|App_LocalResources”选项就可以了。
与全局资源文件不同,本地资源文件只能够应用于一个ASP.NET页或用户控件的文件,即扩展名为.aspx、.ascx或.master的ASP.NET文件。与此同时,App_LocalResources文件夹可以位于应用程序的任意文件夹中,即应用程序中可以有任意多个App_LocalResources文件夹,且它们可以位于应用程序的任意一级目录中。通过使用资源文件的名称,可以将一组资源文件与特定的网页关联起来。
例如,如果在App_LocalResources文件夹中有一个名为Default.aspx的页,则可以创建下列文件:
1)Default. aspx.resx是未找到语言匹配项时的默认本地资源文件,即回退资源文件。
2)Default. aspx.es.resx是西班牙语的资源文件,其中不包含区域性信息。
3)Default. aspx.es-mx.resx是专用于西班牙语(墨西哥)的资源文件。
4)Default. aspx.de.resx是德语的资源文件,其中不包含区域性信息。
如上面的示例所示,本地资源文件的基名称与页文件名相同,后跟语言和区域性名称,最后以扩展名.resx结尾。其一般的名称格式为:
页面或控件名称.扩展名.resx
页面或控件名称.扩展名.语言.resx
页面或控件名称.扩展名.语言-区域性.resx
20.1.3 全局与本地资源文件使用建议
在ASP.NET应用程序中,可以使用全局和本地资源文件,并任意组合它们。通常情况下,当希望在整个应用程序的各页之间共享资源时,应该向全局资源文件添加这些资源。全局资源文件中的资源还是强类型的,用于以编程方式访问。并且,只有全局资源文件才支持链接资源。
但如果将所有本地化资源都存储在全局资源文件中,则这些全局资源文件将会变得很大。此外,如果多个开发人员要处理不同的页但在同一个资源文件中工作时,全局资源文件也会更难于管理。
而本地资源文件使得单个ASP.NET网页的资源比较容易管理,但它却不能在各页之间共享资源。此外,如果有许多页必须本地化为多种语言,则可能会创建大量本地资源文件。对于包含大量文件夹和使用多种语言的网站,本地资源可使应用程序域中的程序集数目迅速攀升。
此外,更改本地或全局的默认资源文件时,ASP.NET将重新编译资源并重新启动ASP.NET应用程序,这会影响网站的整体性能。添加附属资源文件时,将不会导致重新编译资源,但会重新启动ASP.NET应用程序。
鉴于上面这些原因,建议将一些整个应用程序通用的、共享的资源放入全局资源文件中;而将那些个性化的、不需要共享的资源放入本地资源文件中,并且尽量能够适当地利用全局资源文件来缩减本地资源文件的数量,而不要因为过于追求单个ASP.NET网页单个本地资源文件,从而造成本地资源文件泛滥,难于维护与管理。