ASP.NET Lab

The Best Web, The Best Future

博客园 首页 新随笔 订阅 管理

如果你要创建能够被不同语言的读者所阅读的 Web 页面,那么你就必须为读者提供一种方式来以它们自己的语言来查看页面。有一种方法就是重建不同语言的页面。但是,这种方法是比较费事的,并且难以维护原始页面的变化。

ASP.NET 为你提供了一种方式来创建能够获取内容和其他基于浏览器首选语言设定或者用户明确选择的语言的数据的页面。并且被内容和其他数据引用成资源的数据还能够被存储在资源文件中或者其他源中。

在 ASP.NET Web 页面中,你可以配置控件从资源中获取它们的属性值。并且在运行时,资源表达式还会被替换成适当的资源文件中的资源。

资源文件

资源文件就是包含了字符串的 XML 文件,包含了你需要翻译成的不同语言或者图片路径。资源文件中包含了 key/value 数据对。每个数据对都是一个单独的资源。另外,关键字的名称对于字母大小写是不敏感的。例如,一个资源文件可能包含了一个 Button1 关键字和 Submit 值的资源。

你可以为每种语言分别创建一个单独的资源文件(例如,英语和法语)或者为一种语言和文化(例如 英语[U.K.],英语[U.S.])。并且每个本地化的资源文件都拥有相同的 key/value 数据对;唯一的区别就是本地化的资源文件所能够包含的资源要少于默认的资源文件。然后语言依赖会处理中立资源或者默认资源的载入。

ASP.NET 中资源文件的扩展名是 .resx。在运行时,.resx 文件被编译进一个汇编集,有时候还会被引用成一个辅助汇编集。因为 .resx 文件是动态被编译的,类似于 ASP.NET Web 页面相同的方式,你不需要创建资源汇编集。另外在编译的时候还会把几个类似的语言资源文件精简到相同的汇编集中。

在你创建资源文件的时候,需要先从创建一个基本的 .resx 文件开始。如果你需要提供每种语言的支持,那么就可以创建一个新的拥有相同基本文件名称的文件,但是以一种语言或者语言和文化(文化名称)来作为它的一部分。关于文化名称的列表,请参考:[CultureInfo]。例如,你可能需要创建下列文件:

  • WebResources.resx

    基本的资源文件。这是默认的,或者也可以是回退的资源文件。

  • WebResources.es.resx

    西班牙语资源文件。

  • WebResources.es-mx.resx

    特定的西班牙语(墨西哥)资源文件。

  • WebResources.de.resx

    德语资源文件。

在运行时,ASP.NET 会为 CurrentUICulture 属性使用最匹配的资源文件。线程的 UI 文化还被设置成与页面的 UI 文化相符合。例如,如果当前的 UI 文化是西班牙语,那么 ASP.NET 就会使用 WebResources.es.resx 文件的编译版本。如果无法与当前的 UI 文化相匹配,那么 ASP.NET 就会使用资源回退;开始于特定的文化资源,然后是中立的文化,最后才是默认的资源文件。在这个范例中,默认的资源文件就是 WebResource.resx。

创建 ASP.NET 网站的资源文件

在 ASP.NET 中,你能够创建拥有不同作用范围的资源文件。你也能够创建全局的资源文件,来表示你能够从网站的任何页面或者代码中读取资源文件。你同样可以创建局部资源文件来存储单个 ASP.NET Web 页面资源(.aspx 文件)。

全局资源文件

你可以把文件存放到位于应用程序根目录的保留目录 App_GlobalResources 中来创建全局资源文件。App_GlobalResources 目录中的任何 .resx 文件都是属于全局范围的。另外,ASP.NET 还会产生一个强类型对象,从而给予开发者一个简单的方式来编程访问全局资源。

本地资源文件

本地资源文件只适用于 ASP.NET 页面(扩展名是 .aspx、.ascx、.master,等等的 ASP.NET 页面)。你可以把本地资源文件存放到拥有保留名称 App_LocalResources 的目录中。与根 App_GlobalResources 目录不同的是,App_LocalResources 目录能够存在于应用程序的任何目录中。你还可以使用资源文件的名称把一些资源文件关联到特定的 Web 页面。

例如,如果你在 App_LocalResources 目录中拥有一个名为 Default.aspx 的页面,那么你就可能需要创建下列文件:

  • Default.aspx.resx

    默认的本地资源文件,也就是回退资源文件,如果没有找到相匹配的语言的话。

  • Default.aspx.es.resx

    西班牙语资源文件,不包括文化信息。

  • Default.aspx.es-mx.resx

    特定的西班牙语(墨西哥)资源文件。

  • Default.aspx.de.resx

    德语资源文件,不包括文化信息。

资源文件名称的组成是:与页面文件名称相匹配的基本文件名称,并且遵循语言名称和文化名称,并且以 .resx 作为扩展名。关于文化名称的列表,请参考:[CultrueInfo]。

全局资源文件和本地资源文件之间的选择

你可以在 Web 应用程序中使用全局资源文件和本地资源文件的任何联合。通常,你需要在页面之间共享资源的时候把资源添加到一个全局资源文件中。另外,全局资源文件中的资源同样在你需要通过编程来访问文件的时候而被强类型化。

不论如何,全局资源文件都能够变得非常庞大,如果你在其中存储所有本地化资源的话。那么全局资源文件同样能够变得更加难以管理,如果多个开发者在一个单独的资源文件中操作不同的页面的话。

本地资源文件使得一个单独的 ASP.NET Web 页面中的资源管理变得更加容易。但是你不能在页面之间共享资源。另外,你可能需要创建大量的资源文件,如果你拥有许多必须本地化成多种语言的页面。如果庞大的网站需要使用许多目录和语言,就可以在应用程序域中使用能够快速扩张汇编集数量的本地资源。

在你改变默认资源文件的时候,不管是本地还是全局,ASP.NET 都会重新编译资源并且重启 ASP.NET 应用程序,因此能够影响你的网站性能。虽然添加辅助资源文件并不会导致资源的重新编译,但是 ASP.NET 应用程序还是会重新启动。

提示:连接的资源只在全局资源文件中才会被提供。

在 Web 页面中操作资源

在你创建资源文件之后,你就可以在 ASP.NET Web 页面中使用它们。你通常使用资源来填充页面中控件的属性值。例如,你可能使用资源来设置 Button 控件的 Text 属性,来替代把这个属性硬编码成特定的字符串。

要使用资源来设置控件属性值,你就可以使用隐式的本地化或者明确的本地化,如下所示:

  • 隐式的本地化与本地资源一起运作并且让你把控件的属性自动设置成相匹配的资源。
  • 明确的本地化允许你使用资源表达式把控件属性设置成本地资源文件或者全局资源文件中的特定资源。
使用本地资源的隐式本地化

如果你已经创建了特定页面的本地资源文件,那么你就可以使用隐式的本地化从资源文件中填充控件的属性值。在隐式的本地化中,ASP.NET 会读取资源文件并且把资源匹配到属性值。

要使用隐式的本地化,你就必须在使用下列模式的本地资源文件中为资源使用命名约定:

Key.Property

例如,如果你创建了名为 Button1 的 Button 控件的资源,那么你可能需要在本地资源文件中创建下列 key/value 数据对:

Button1.Text
Button1.BackColor
Label1.Text

你可以为 Key 使用任何名称,但是 Property 则必须与需要本地化的控件属性相匹配。

在页面中,你可以在标记中为控件使用特殊的元特性来指定隐式的本地化。你不需要明确地指定需要本地化的具体属性。被配置成隐式本地化的 Button 控件可能如下所示:

<asp:Button ID="Button1" runat="server" Text="DefaultText" 
    meta:resourcekey="Button1" />

特性 resourcekey 的值与相应的资源文件中的关键字相匹配。在运行时,ASP.NET 会把控件的标签当成 resourcekey 并且把资源匹配到控件的属性。如果属性值被定义在资源文件中,那么 ASP.NET 就会把这个属性的值替换资源值。

明确的本地化

另外,你可以使用明确的本地化,在你使用资源表达式的时候。与隐式的本地化不同,你必须为每个需要被设置的属性而使用资源表达式。

一个被配置成从全局资源文件中设置 Text 属性的 Button 控件看起来应该是这样:

<asp:Button ID="Button1" runat="server" 
    Text="<%$ Resources:WebResources, Button1Caption %>" />

资源表达式可以获取下列表单,并且 Class 还是可选的(除非资源是全局的),另外 ResourceID 也是必需的:

<%$ Resources:Class, ResourceID %>

Class 值在你使用全局资源的时候用来识别并使用资源文件。在 .resx 文件已编译的时候,基文件的名称(不包括扩展名在内),都会被明确地用作结果汇编集中的类名称。如果你需要使用本地资源文件中的资源(与当前页面名称相匹配),那么你不可以包括一个类名,因为 ASP.NET 会把页面类匹配成资源类。

ResourceID 值就是要读取的资源标识符。在前面的范例中,按钮的 Text 属性会从全局资源文件 WebResources.resx 中读取(或者是适当的本地化版本)。在这个文件中,ASP.NET 使用了标识符是 Button1Caption 的资源值和页面本身。如果要设置页面的属性,那么你就可以在 @ 页面指令中使用资源表达式。

本地化静态文本

如果你的页面包括静态文本,那么你可以通过把它包括进一个 Localize 控件中的方式来使用 ASP.NET 本地化,然后使用明确的本地化来设置静态文本。Localize 控件并没有呈现任何标记;它只扮演了一个本地化文本的占位符。Localize 控件能够在设计视图中被编辑,而不仅仅只在属性网格中。在运行时,ASP.NET 会把 Localize 控件视为一个 Literal 控件。例如,你的页面可能包括下列代码:

<h1>
    <asp:Localize runat=server 
      ID="WelcomeMessage" 
      Text="Welcome!" meta:resourcekey="LiteralResource1" />
</h1>
<br />
<br />
<asp:Localize runat="server"
    ID="NameCaption"
    Text="Name: " meta:resourcekey="LiteralResource2" />
<asp:TextBox runat="server" ID="TextBox1" 
    meta:resourcekey="TextBox1Resource1" />

选择不同语言的资源文件

在页面开始运行并且 ASP.NET 从资源管理器中获取值的时候,ASP.NET 会选择最接近匹配于当前页面或者使用资源回退来获取资源的 UICultrue 设定的资源文件版本。例如,如果你运行 Default.aspx 页面并且当前的 UICultrue 属性被设置成 es(西班牙语),那么 ASP.NET 会使用编译后的本地资源文件 Default.aspx.es.resx。

ASP.NET 能够把页面的 UICultrue 和 Cultrue 属性设置成通过浏览器而被传递的语言值和文化值。另外,你还可以明确地设置 UICultrue 属性和 Cultrue 属性(也可以在代码中进行声明)。你同样可以在 Web.config 文件中设置声明值。关于详细的信息,请参考:[实践:设置 ASP.NET 全局 Web 页面的 Cultrue 和 UICultrue]。

提示:你应该专门依赖浏览器的设置来设定语言和文化信息,因为用户能够使用其他计算机中的浏览器。同样,浏览器只应该频繁地与语言进行通信,而不是特定的文化。在这种情况下,服务器已经缩小了一个特定的文化数据格式。一个好的策略就是让用户明确地选择语言。

资源的可编程操作

与在标记中使用资源表达式来设定资源值相比较而言,你也可以通过编程来获取资源。你可能会这样做,如果资源值在设计时是不可知的或者如果你需要基于运行时的条件来设置资源值。关于详细信息,请参考:[实践:通过编程来获取资源值]。

posted on 2007-02-23 14:32  Laeb  阅读(614)  评论(0编辑  收藏  举报