ASP.NET 网页资源概述

本文介绍ASP.NET中实现多语言支持的方法,包括使用资源文件、隐式与显式本地化等技术,帮助开发者轻松实现网站内容的多语言切换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果您创建的网页将由使用不同语言的用户阅读,则必须为这些读者提供用他们自己的语言查看网页的方法。一种方法是分别用各语言重新创建页面,但这种方法可能需要大量工作量、容易出错并且在更改原始页时很难维护。

ASP.NET 为您提供了一种方法,使用这种方法创建的页可以根据浏览器的首选语言设置或用户显式选择的语言获取内容和其他数据。内容和其他数据指的就是资源,此类数据可以存储在资源文件或其他源中。

在 ASP.NET 网页中,可以将控件配置为从资源获取其属性值。在运行时,资源表达式将被相应资源文件中的资源替换。

资源文件

资源文件是 XML 文件,其中包含要转换为不同语言或图像路径的字符串。资源文件包含键/值对,每一对都是一个单独的资源。键名不区分大小写。例如,资源文件可能包含带有 Button1 键和 Submit 值的资源。

您需要为每种语言(如英语和法语)或每种语言和区域性(如英语 [英国]、英语 [美国])分别创建一个资源文件。每个本地化资源文件都有相同的键/值对;本地化资源文件与默认资源文件的唯一区别就是前者所包含的资源可能少于后者。然后,语言回退处理非特定资源或默认资源的加载。

ASP.NET 中的资源文件具有 .resx 扩展名。在运行时,.resx 文件将编译进一个程序集内,该程序集有时称为附属程序集。由于 .resx 文件是用与 ASP.NET 网页相同的方式动态编译的,因此不必创建资源程序集。编译过程将多个语言类似的资源文件压缩在同一程序集内。

在创建资源文件时,首先开始创建基文件 .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 网页(.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.es.resx

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

  • Default.aspx.es-mx.resx

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

  • Default.aspx.de.resx

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

文件的基名称与页文件名相同,后跟语言和区域性名称,最后以扩展名 .resx 结尾。有关区域性名称的列表,请参见 CultureInfo

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

在 Web 应用程序中,可以任意组合使用全局和本地资源文件。通常情况下,当您希望在各页之间共享资源时,应向全局资源文件添加这些资源。全局资源文件中的资源还是强类型的,用于以编程方式访问。

但如果将所有本地化资源都存储在全局资源文件中,则这些文件会变得很大。此外,如果多个开发人员要处理不同的页但在同一个资源文件中工作时,全局资源文件也会更难于管理。

本地资源文件使得单个 ASP.NET 网页的资源比较容易管理,但您不能在各页之间共享资源。此外,如果有许多页必须本地化为多种语言,则可能会创建大量本地资源文件。如果站点是具有许多文件夹和使用多种语言的大型站点,则使用本地资源可能快速地在应用程序域中扩展程序集的数量。

在对默认资源文件进行更改时,无论它是本地资源文件还是全局资源文件,ASP.NET 都重新编译资源并重新启动 ASP.NET 应用程序,这可能会影响站点的整体性能。添加附属资源文件将不会导致重新编译资源,但 ASP.NET 应用程序仍将重新启动。

Note注意

只有全局资源文件支持链接资源。

在网页中使用资源

创建资源文件后,即可在 ASP.NET 网页中使用这些文件。通常使用资源来填充页上各控件的属性值。例如,可以使用资源设置 Button 控件的 Text 属性,而不必将该属性硬编码为特定的字符串。

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

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

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

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

如果您已为特定页创建了本地资源文件,则可以使用隐式本地化从该资源文件中为控件填充属性值。使用隐式本地化时,ASP.NET 读取资源文件并将资源与属性值相匹配。

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

Key . Property

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

Button1.Text
Button1.BackColor
Label1.Text

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

在页上,对该控件的标记使用特殊的 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 ="<%___FCKpd___2nbsp;Resources:WebResources, Button1Caption %>"   />

该资源表达式采用以下形式,其中 Class 是可选的(除非资源是全局资源),而 ResourceID 是必需的:

<%$ Resources: 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 
      
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 为该页选择与当前 UICulture 设置匹配程度最高的资源文件版本,或者使用资源后备获取资源。例如,如果正在运行 Default.aspx 页并且当前的 UICulture 属性设置为 es(西班牙语),则 ASP.NET 使用本地资源文件 Default.aspx.es.resx 的已编译版本。

ASP.NET 可以将该页的 UICultureCulture 属性设置为浏览器所传递的语言和区域性值。或者,可以以声明方式或通过使用代码显式设置 UICultureCulture 属性。还可以在 Web.config 文件中以声明方式设置这些值。有关详细信息,请参见如何:为 ASP.NET 网页全球化设置区域性和 UI 区域性

Note注意

不应唯一依赖浏览器设置来设置语言和区域性信息,因为用户使用的可能不是自己计算机上的浏览器。此外,浏览器经常只传送语言,而不传送特定的区域性。在这种情况下,服务器必须推导数据格式设置的特定区域性。一个好的策略就是让用户显式选择语言。

以编程方式使用资源

除了使用资源表达式在标记中设置资源值外,还可以用编程方式检索资源值。如果在设计时资源值未知或者要根据运行时条件设置资源值,您可能会这样做。有关详细信息,请参见如何:以编程方式检索资源值

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值