根据语言环境不同而显示不同的资源本地化ASP.NET 网页

本例实现如下效果:

建立一个网站 并包含一个aspx页Default.aspx

该Default.aspx页 有一个Label

在不同的语言选择下 Label的Text显示不一样

例如:在zh-CN时 显示 “姓名”

在en时 显示“Name”

也就是资源本地化 ASP.NET 网页

具体步骤如下:

a).建立Default.aspx

1.建立一个网站 并包含一个aspx页Default.aspx

2.在Default.aspx页 添加一个Label

b).创建和编辑资源文件

3.右键单击该网站项目文件

选择“添加ASP.NET文件夹”下的

“App_LocalResources”

4.在App_LocalResources文件夹下 添加如下三个资源文件

Default.aspx.en.resx

Default.aspx.zh-CN.resx

Default.aspx.resx

5.双击Default.aspx.zh-CN.resx

打开对该XML文件进行编辑的编辑器

6.在类似于Table的编辑器界面中

加入如下内容:

名称 值 注释

lbl_Name.Text 姓名 Label在中文环境下名称显示

lbl_Name.BackColor Gold Label的底色

并保存和关闭

7.如6所述在Default.aspx.en.resx加入如下内容:

名称 值 注释

lbl_Name.Text Name Label在英文环境下名称显示

lbl_Name.BackColor Red Label的底色

8.如6所述在Default.aspx.resx加入如下内容:

名称 值 注释

lbl_Name.Text (姓名) Label在非中英文环境下的名称显示

lbl_Name.BackColor Red Label的底色

c).使用资源文件

9.修改Default.aspx页

<%@ Page UICulture="en" ...%>

10.修改Label为

<asp:Label runat="server" meta:resourcekey="lbl_Name" />

d).运行 查看效果

为了更好的看到效果

可以将<%@ Page UICulture="en" ...%>

英文环境下->Default.aspx.en.resx

显示为 Name

依次修改为<%@ Page UICulture="es" ...%>

西班牙语 非中英环境下->Default.aspx.resx

显示为 (姓名)

以及<%@ Page ...%> 即 去掉对UICulture属性的设置

中文环境下->Default.aspx.zh-CN.resx

显示为 姓名

-------------相关理论---------------

本地化是为给定的区域性和区域设置自定义应用程序的过程。

本地化主要涉及翻译用户界面。

如果您创建的网页将由使用不同语言的用户阅读,

则必须为这些读者提供用他们自己的语言查看网页的方法。

一种方法是分别用各语言重新创建页面,

但这种方法可能需要大量工作量、容易出错并且在更改原始页时很难维护。

ASP.NET 为您提供了一种方法,

使用这种方法创建的页可以根据浏览器的首选语言设置

或用户显式选择的语言获取内容和其他数据。

内容和其他数据指的就是资源,此类数据可以存储在资源文件或其他源中。

在 ASP.NET 网页中,可以将控件配置为从资源获取其属性值。

在运行时,资源表达式将被相应资源文件中的资源替换。

资源文件

--------

资源文件是 XML 文件,

其中包含要转换为不同语言或图像路径的字符串。

资源文件包含键/值对,每一对都是一个单独的资源。

键名不区分大小写

您需要为每种语言(如英语和法语)

或每种语言和区域性(如英语 [英国]、英语 [美国])

分别创建一个资源文件。

每个本地化资源文件都有相同的键/值对;

本地化资源文件与默认资源文件的唯一区别就是前者所包含的资源可能少于后者。

ASP.NET 中的资源文件具有 .resx 扩展名。

在运行时,.resx 文件将编译进一个程序集内,

该程序集有时称为附属程序集。

由于 .resx 文件是用与 ASP.NET 网页相同的方式动态编译的,

因此不必创建资源程序集。

编译过程将多个语言类似的资源文件压缩在同一程序集内。

在创建资源文件时,首先开始创建基文件 .resx。

对于要支持的每种语言,分别创建一个新文件,

该文件具有同一基本文件名但包含语言或语言及区域性(区域性名称)。

有关区域性名称的列表,请参见 CultureInfo。

例如,您可以创建下列文件:

WebResources.resx

基资源文件。该文件是默认或后备资源文件。

WebResources.zh-CN.resx

汉语的资源文件。

WebResources.en.resx

英语的资源文件。

在运行时,ASP.NET 使用与 CurrentUICulture 属性的设置最为匹配的资源文件。

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

--------------------------

在 ASP.NET 中,可以创建具有不同范围的资源文件。

可以创建全局资源文件,这意味着可以从位于网站中的任意页或代码读取这些资源文件。

也可以创建本地资源文件,这些文件存储单个 ASP.NET 网页(.aspx 文件)的资源。

全局资源文件

将资源文件放入应用程序根目录的保留文件夹 App_GlobalResources 中,即可创建全局资源文件。

App_GlobalResources 文件夹中的任何 .resx 文件都具有全局范围。

此外,ASP.NET 还生成了一个强类型对象,这为开发人员提供了一种以编程方式访问全局资源的简单方法。

本地资源文件

本地资源文件是只应用于一个 ASP.NET 页的文件(带有 .aspx、.ascx、.master 等扩展名的 ASP.NET 页)。

本地资源文件所放入的文件夹具有 App_LocalResources 保留名称。

App_LocalResources 文件夹可以存在于应用程序的任何文件夹中,这与 App_GlobalResources 根文件夹不同。

通过资源文件名将一组资源文件与特定的网页相关联。

例如,如果在 App_LocalResources 文件夹中有一个名为 Default.aspx 的页,则可以创建下列文件:

Default.aspx.resx

默认的本地资源文件,如果找不到语言匹配项,则该文件为后备资源文件。

Default.aspx.en.resx

英语的资源文件,不包含区域性信息。

Default.aspx.es-mx.resx

专用于西班牙语(墨西哥)的资源文件。

文件的基名称与页文件名相同,后跟语言和区域性名称,最后以扩展名 .resx 结尾。

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

----------------------------

在 Web 应用程序中,可以任意组合使用全局和本地资源文件。

通常情况下,当您希望在各页之间共享资源时,应向全局资源文件添加这些资源。

全局资源文件中的资源还是强类型的,用于以编程方式访问。

但如果将所有本地化资源都存储在全局资源文件中,则这些文件会变得很大。

此外,如果多个开发人员要处理不同的页但在同一个资源文件中工作时,全局资源文件也会更难于管理。

本地资源文件使得单个 ASP.NET 网页的资源比较容易管理,但您不能在各页之间共享资源。

此外,如果有许多页必须本地化为多种语言,则可能会创建大量本地资源文件。

如果站点是具有许多文件夹和使用多种语言的大型站点,

则使用本地资源可能快速地在应用程序域中扩展程序集的数量。

在对默认资源文件进行更改时,无论它是本地资源文件还是全局资源文件,

ASP.NET 都重新编译资源并重新启动 ASP.NET 应用程序,这可能会影响站点的整体性能。

添加附属资源文件将不会导致重新编译资源,但 ASP.NET 应用程序仍将重新启动。

在网页中使用资源

----------------

创建资源文件后,即可在 ASP.NET 网页中使用这些文件。

通常使用资源来填充页上各控件的属性值。

例如,可以使用资源设置 Button 控件的 Text 属性,而不必将该属性硬编码为特定的字符串。

若要使用资源设置控件属性值,可以使用隐式本地化或显式本地化,如下所示:

隐式本地化使用的是本地资源,并允许您将控件属性自动设置为匹配的资源。

显式本地化使您可以使用资源表达式将控件属性设置为本地或全局资源文件中的特定资源。

使用本地资源的隐式本地化

------------------------

如果您已为特定页创建了本地资源文件,

则可以使用隐式本地化从该资源文件中为控件填充属性值。

使用隐式本地化时,ASP.NET 读取资源文件并将资源与属性值相匹配。

若要使用隐式本地化,必须对本地资源文件中的资源使用命名约定,

命名约定采用以下模式:Key . Property

例如,若要为名为 Button1 的 Button 控件创建资源,可以在本地资源文件中创建以下键/值对:

Button1.Text

Button1.BackColor

Label1.Text

可以对 Key 使用任意名称,但 Property 必须与要本地化的控件的属性相匹配。

在页上,对该控件的标记使用特殊的 meta 属性可指定隐式本地化。

不必显式指定要本地化的属性。

配置为使用隐式本地化的 Button 控件看起来可能类似于下面的形式:

<asp:Button runat="server" Text="DefaultText"

meta:resourcekey="Button1" />

resourcekey 值与相应资源文件中的键相匹配。

在运行时,ASP.NET 通过将控件标签用作 resourcekey 将资源与控件属性相匹配。

如果在资源文件中定义了某个属性值,则 ASP.NET 会用资源值替换该属性。

显式本地化

----------

此外,也可以使用显式本地化,此时将使用资源表达式。

与隐式本地化不同,必须为要设置的每个属性分别使用一个资源表达式。

配置为从全局资源文件设置 Text 属性的 Button 控件看起来可能类似于下面这样:

<asp:Button runat="server"

Text="<%$ Resources:WebResources, Button1Caption %>" />

该资源表达式采用以下形式,

<%$ Resources: Class , ResourceID %>

其中 Class 是可选的(除非资源是全局资源),而 ResourceID 是必需的

Class 值标识要在使用全局资源时使用的资源文件。

在编译 .resx 文件时,将不带扩展名的基文件名显式用作所得程序集的类名。

若要使用本地资源文件(与当前页名匹配的文件)中的资源,

则不必提供类名,因为 ASP.NET 将该页类与资源类相匹配。

ResourceID 值是要读取的资源的标识符。

在前面的示例中,从全局资源文件 WebResources.resx(或相应的本地化版本)读取按钮的 Text 属性。

在该文件中,ASP.NET 将该值用于带有标识符 Button1Caption 的资源及页本身。

若要设置页属性,可以在 @ Page 指令中使用资源表达式。

本地化静态文本

---------------

如果页面包含静态文本,则可以使用 ASP.NET 本地化,

方法是将该本地化包含在 Localize 控件中,

然后使用显式本地化设置该静态文本。

Localize 控件不呈现标记;

它的唯一功能就是充当本地化文本的占位符。

Localize 控件不仅可以在属性网格中编辑,还可以在“设计”视图中编辑。

在运行时,ASP.NET 将 Localize 控件视为 Literal 控件。

例如,页面可能包含下面的代码:

<h1>

<asp:Localize runat=server

Text="Welcome!" meta:resourcekey="LiteralResource1" />

</h1>

<br />

<br />

<asp:Localize runat="server"

Text="Name: " meta:resourcekey="LiteralResource2" />

<asp:TextBox runat="server"

meta:resourcekey="TextBox1Resource1" />

为不同的语言选择资源文件

------------------------

当正在运行某页并且 ASP.NET 正在从资源管理器中检索值时,

ASP.NET 为该页选择与当前 UICulture 设置匹配程度最高的资源文件版本,

或者使用资源后备获取资源。

例如,如果正在运行 Default.aspx 页并且当前的 UICulture 属性设置为 es(西班牙语),

则 ASP.NET 使用本地资源文件 Default.aspx.es.resx 的已编译版本。

(

UICulture 属性是 CurrentThread 属性的快捷方式。

区域性是当前执行线程的属性

在 .aspx 文件的 @ Page 指令中设置 UICulture 属性。

请求该页时,动态生成的类将设置此属性的值。

此外,还可以在 Web.config 文件的 全球化元素 中显式设置 UICulture 属性的值。

)

ASP.NET 可以将该页的 UICulture 和 Culture 属性设置为浏览器所传递的语言和区域性值。

或者,可以以声明方式或通过使用代码显式设置 UICulture 和 Culture 属性。

还可以在 Web.config 文件中以声明方式设置这些值。

有关详细信息,请参见如何:为 ASP.NET 网页全球化设置区域性和 UI 区域性。

注意

不应唯一依赖浏览器设置来设置语言和区域性信息,

因为用户使用的可能不是自己计算机上的浏览器。

此外,浏览器经常只传送语言,而不传送特定的区域性。

在这种情况下,服务器必须推导数据格式设置的特定区域性。

一个好的策略就是让用户显式选择语言。

以编程方式使用资源

------------------

除了使用资源表达式在标记中设置资源值外,还可以用编程方式检索资源值。

如果在设计时资源值未知或者要根据运行时条件设置资源值,您可能会这样做。

有关详细信息,请参见如何:以编程方式检索资源值。