ASP.NET 网页资源概述
更新:2007 年 11 月
如果您创建的网页将由使用不同语言的用户阅读,则必须为这些读者提供用他们自己的语言查看网页的方法。一种方法是分别用各语言重新创建页面,但这种方法可能需要大量工作量、容易出错并且在更改原始页时很难维护。
利用 ASP.NET,可以使创建的页面基于浏览器的首选语言设置或用户显式选择的语言获取内容和其他数据。内容和其他数据指的就是资源,此类数据可以存储在资源文件或其他源中。
在 ASP.NET 网页中,可以将控件配置为从资源获取其属性值。在运行时,资源表达式将被相应资源文件中的资源替换。
资源文件
资源文件是 XML 文件,其中包含要转换为不同语言或图像路径的字符串。资源文件包含键/值对,每一对都是一个单独的资源。键名不区分大小写。例如,资源文件可能包含一项键为 Button1 且值为 Submit 的资源。
您需要为每种语言(如英语和法语)或每种语言和区域性(如英语 [英国]、英语 [美国])分别创建一个资源文件。每个本地化资源文件都有相同的键/值对;本地化资源文件与默认资源文件的唯一区别就是前者所包含的资源可能少于后者。随后,内置的语言回退过程将处理非特定资源或默认资源的加载。
ASP.NET 中的资源文件具有 .resx 扩展名。在运行时,.resx 文件将编译进一个程序集内,该程序集有时称为附属程序集。与 ASP.NET 网页相同,.resx 文件也是动态编译的,因此无需创建资源程序集。编译过程将多个语言类似的资源文件压缩在同一程序集内。
创建资源文件时,首先应创建基 .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 文件的已编译版本。如果当前用户界面区域性没有匹配项,ASP.NET 将使用资源回退。首先,它将搜索特定区域性的资源。如果这些资源不可用,它将搜索非特定区域性的资源。如果仍找不到这些资源,ASP.NET 将加载默认资源文件。在本例中,默认资源文件是 WebResource.resx。
为 ASP.NET 网站创建资源文件
在 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 结尾。有关区域性名称的列表,请参见 CultureInfo。
本地化客户端脚本资源
ASP.NET AJAX 客户端脚本的本地化支持是在 ASP.NET 2.0 本地化模型的基础上构建的。在该模型中,脚本文件和本地化的脚本资源都嵌入在采用轮辐式组织结构的程序集(附属程序集)中。这样,您可以针对特定的语言和区域,有选择性地使用这些嵌入式客户端脚本和资源。利用该模型,可通过一个代码库支持多种区域性。此外,它还支持磁盘上以 .js 文件形式提供的本地化脚本文件。ASP.NET 可以自动针对特定的语言和区域提供本地化的客户端脚本和资源。
有关更多信息,请参见下列主题:
在全局和本地资源文件之间选择
在 Web 应用程序中,可以任意组合使用全局和本地资源文件。通常情况下,当您希望在各页之间共享资源时,应向全局资源文件添加这些资源。全局资源文件中的资源还是强类型的,用于以编程方式访问。
但如果将所有本地化资源都存储在全局资源文件中,则这些文件会变得很大。此外,如果多个开发人员要处理不同的页但在同一个资源文件中工作时,全局资源文件也会更难于管理。
本地资源文件使得单个 ASP.NET 网页的资源比较容易管理,但您不能在各页之间共享资源。此外,如果有许多页必须本地化为多种语言,则可能会创建大量本地资源文件。对于包含大量文件夹和使用多种语言的网站,本地资源可使应用程序域中的程序集数目迅速攀升。
更改本地或全局的默认资源文件时,ASP.NET 将重新编译资源并重新启动 ASP.NET 应用程序。这会影响网站的整体性能。添加附属资源文件时,将不会导致重新编译资源,但会重新启动 ASP.NET 应用程序。
说明: |
---|
只有全局资源文件支持链接资源。 |
在网页中使用资源
创建资源文件后,即可在 ASP.NET 网页中使用这些文件。通常使用资源来填充页上各控件的属性值。例如,可以使用资源设置 Button 控件的 Text 属性,而不必将该属性硬编码为特定的字符串。
若要使用资源设置控件属性值,可以使用隐式本地化或显式本地化,如下所示:
隐式本地化使用的是本地资源,并允许您将控件属性自动设置为匹配的资源。
显式本地化使您可以使用资源表达式将控件属性设置为本地或全局资源文件中的特定资源。
使用本地资源的隐式本地化
如果您已为特定页创建了本地资源文件,则可以使用隐式本地化从该资源文件中为控件填充属性值。使用隐式本地化时,ASP.NET 读取资源文件并将资源与属性值相匹配。
若要使用隐式本地化,必须对本地资源文件中的资源使用命名约定,命名约定采用以下模式:
键.属性
例如,若要为名为 Button1 的 Button 控件创建资源,可以在本地资源文件中创建以下键/值对:
Button1.Text
Button1.BackColor
Label1.Text
键可以使用任意名称,但属性必须与要本地化的控件的某个属性名匹配。
在页上,对该控件的标记使用特殊的 meta 属性可指定隐式本地化。不必显式指定要本地化的属性。配置为采用隐式本地化的 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 %>" />
该资源表达式采用以下形式,其中类是可选的(除非资源是全局资源),而资源 ID 是必需的:
<%$Resources:类,资源 ID%>
类值标识要在使用全局资源时使用的资源文件。在编译 .resx 文件时,将不带扩展名的基文件名显式用作所得程序集的类名。如果要使用本地资源文件(与当前页面名称匹配)中的资源,则无需包括类名。这是因为,ASP.NET 会将页类与资源类进行匹配。
资源 ID 值是要读取的资源的标识符。在上一示例中,按钮的 Text 属性应从全局资源文件 WebResources.resx(或相应的本地化版本)中读取。在该文件中,ASP.NET 将该值用于带有标识符 Button1Caption 的资源及页本身。若要设置页属性,可以在 @ Page 指令中使用资源表达式。
可以为控件指定显式资源表达式或隐式资源表达式,但不能同时指定这两种表达式。如果对 Button 控件使用下面的声明性语法,将导致分析错误:
<asp:Button ID="Button1"
runat="server"
meta:resourcekey="Button1Resource1"
Text="<%$ Resources:WebResources, Button1Caption %>" />
此示例指定了一个隐式本地资源文件(与当前页名称匹配的文件),以及一个名为 WebResources 的显式资源文件。若要防止发生针对此控件的分析器错误,请移除其中一个资源表达式。
本地化静态文本
如果页面包含静态文本,则可以使用 ASP.NET 本地化,方法是将该本地化包含在 Localize 控件中,然后使用显式本地化设置该静态文本。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 网页验证用户输入是否不包括脚本或 HTML 元素。有关更多信息,请参见脚本侵入概述。 |
模板中的隐式本地化
在模板化控件(例如 DataList、GridView 和 Wizard 控件)中,可以通过父控件的隐式资源表达式来访问模板样式属性,从而本地化这些属性。不能对模板本身使用隐式资源表达式。
若要本地化模板属性 (Property) 的值,请使用该模板所属控件的 meta 属性 (Attribute) 和一个资源键。随后在资源文件中使用 Property.Subproperty 语法或 Property-Subproperty 语法。例如,下面的声明性语法对 Wizard 控件是有效的:
<asp:Wizard ID="Wizard1"
runat="server"
meta:resourcekey="Wizard1Resource1">
<NavigationStyle
BorderWidth="<%$ resources:navBorderWidth %>"/>
<WizardSteps>
<asp:WizardStep ID="WizardStep1"
runat="server"
Title="Step 1"
meta:resourcekey="WizardStep1Resource1">
</asp:WizardStep>
</WizardSteps>
</asp:Wizard>
对于上一示例,可以在本地资源文件中使用下列键/值对:
Wizard1Resource1.NavigationStyle.BackColor, Red
navborderWidth, 5
也可以使用下列键/值对:
Wizard1Resource1.NavigationStyle-BackColor, Red
navborderWidth, 5
在上一示例中,可以对 Wizard 控件的 NavigationStyle 属性使用显式资源表达式。显式资源表达式将省略 Class 名称,以便使用本地资源文件中的资源。
有关模板化服务器控件的更多信息,请参见 ASP.NET Web 服务器控件模板。
为不同的语言选择资源文件
当页面运行时,ASP.NET 会选择与页面的当前 UICulture 设置最匹配的资源文件版本。如果没有匹配项,ASP.NET 将使用资源回退获取资源。例如,如果正在运行 Default.aspx 页并且当前的 UICulture 属性设置为 es(西班牙语),则 ASP.NET 使用本地资源文件 Default.aspx.es.resx 的已编译版本。
ASP.NET 可以将该页的 UICulture 和 Culture 属性设置为浏览器所传递的语言和区域性值。或者,可以以声明方式或通过使用代码显式设置 UICulture 和 Culture 属性。还可以在 Web.config 文件中以声明方式设置这些值。有关详细信息,请参见如何:为 ASP.NET 网页全球化设置区域性和 UI 区域性。
说明: |
---|
不应唯一依赖浏览器设置来设置语言和区域性信息,因为用户使用的可能不是自己计算机上的浏览器。另外,浏览器还会经常进行仅包含语言信息而没有特定区域性设置的通信。在这种情况下,服务器必须推导数据格式设置的特定区域性。一个好的策略就是让用户显式选择语言。 |
以编程方式使用资源
除了使用资源表达式在标记中设置资源值外,还可以用编程方式检索资源值。如果资源值在设计时未知,或者需要将资源值设置为在运行时获取的值,则可能需要这样做。有关更多信息,请参见 如何:以编程方式检索资源值。