创建本地化网页的一种有效方式,是根据用户的语言和区域性选择用于网页文本和控件的资源。通过使用资源对象中的属性,ASP.NET 可在运行时根据用户的语言和区域性选择正确的属性。此过程比较直接:
-
资源文件 (.resx) 存储值。
-
在页中,您可以指示控件应将资源用于控件的属性值。
-
在运行时,控件的属性值派生自资源文件。
注意 实际上,您可以将值存储在自定义资源对象中,如数据库。不过在此演练中,您将使用一个 .resx 文件存储值。
Visual Web Developer 允许在不编写任何代码的情况下为控件、控件属性和控件的 HTML 生成资源。
本演练中阐释的任务包括:
-
启用 ASP.NET 页的本地化。
-
生成一个资源文件,并将其值与应用程序中的控件隐式关联。
-
创建本地化资源文件,并通过使用声明性表达式在页中显式引用这些文件。
如果已经在 Visual Web Developer 中创建了网站(参见演练:在 Visual Web Developer 中创建基本网页),则可以使用该网站并转到下一部分“通过 ASP.NET 进行隐式本地化”。否则,请按照下面过程中介绍的步骤创建新的网站和网页。
创建文件系统网站
-
打开 Visual Web Developer。
-
在“文件”菜单上单击“新建网站”。
出现“新建网站”对话框。
-
在“Visual Studio 已安装的模板”之下单击“ASP.NET 网站”。
-
在“位置”框中输入要保存网站页面的文件夹的名称。
例如,键入文件夹名“C:\WebSites”。
-
在“语言”列表中,单击您想使用的编程语言。
-
单击“确定”。
Visual Web Developer 创建该文件夹和一个名为 Default.aspx 的新页。
在本部分中,您将使用隐式本地化。在隐式本地化中,指定应从资源文件中自动读取控件属性,但无需显式指定本地化哪些属性。接着,需创建为特定属性提供本地化值的资源文件。运行时,ASP.NET 会检查页上的控件。如果控件被标记为使用隐式本地化,则 ASP.NET 会为页在资源文件中进行查找。如果找到已标记控件的属性设置,则 ASP.NET 会使用资源文件中的值替换控件中的值。
在本隐式本地化示例中,将结合使用设计器和资源编辑器生成一个默认资源文件,您可以将该文件用作涉及两种语言的本地化的起点。Visual Web Developer 将仅根据页上的控件生成资源文件。因此,建议您在完成页的控件布局(包括按钮、标签和文本框等简单控件)之后再生成资源文件。
在页上放置控件
-
在解决方案资源管理器中,右击 Default.aspx,再单击“重命名”,然后键入 Sample.aspx。
这样做可帮助避免在演练的其他部分因默认资源文件而产生混淆,因为隐式资源文件的名称使用页的名称。
-
打开 Sample.aspx,然后切换到“设计”视图。
-
在“工具箱”中,从“标准”区域中将一个 Button、一个 Label 和一个 TextBox 控件拖动到页上。
-
将上述控件的“Text”分别设置为 English Button、English Label 和 English TextBox。
创建页并添加控件后,可使用 Visual Web Developer 命令为此页生成本地资源文件。该本地资源文件将包含页上各个控件的资源字符串。Visual Web Developer 为在控件内部指定为可本地化的每个属性生成一个资源字符串。为每个控件指定的可本地化的属性可能不同,但大多数基于文本的属性已标记为可本地化。
自动生成资源文件
-
单击设计器图面或控件。
-
在“工具”菜单中单击“生成本地资源”。
Visual Web Developer 创建一个名为 App_LocalResources 的新文件夹,并在文件夹 App_LocalResources 中创建一个名为 Sample.aspx.resx 的新文件。如果将页命名为 Sample.aspx 之外的其他名称,.resx 文件将会反映您选择的任何名称。使用隐式本地化时,资源文件名取决于各个页的名称。
-
切换到“源”视图以查看对控件声明的更改。
Visual Web Developer 已向控件添加了一个属性,以从新创建的资源文件检索其值。例如,Button 控件的标记具有新的 meta:resourcekey 属性。
<asp:Button ID="Button1" Runat="server" meta:resourcekey="ButtonResource1" Text="English Button" />
当浏览器向 Web 服务器发送请求时,该请求可包含有关当前语言和区域性的信息。例如,一个浏览器可能会发送字符串 "en-us" 以指示它已设置为使用美国英语;而另一个浏览器可能发送字符串 "en-gb" 以指示它已设置为使用英国英语。
注意 |
---|
浏览器请求中的语言和区域性设置并不是检测用户首选语言的完全可靠的方式。这些设置只是指示已将浏览器设置为发送何种内容,或者浏览器已从基础操作系统继承何种内容。在本演练中,您可以依赖语言和区域性设置,但在成品应用程序中,还应该为用户提供一种手动选择语言和区域性的方式。 |
该资源文件用作所有请求的默认资源文件。(它是回退区域性的资源文件。)如果浏览器未指定任何区域性,或者浏览器请求包含不支持的语言或区域性,则会从此默认文件提取资源值。
现在已创建了资源文件,您可以使用资源编辑器将本地化后的文本放入该文件中。
使用资源编辑器编辑资源文件
-
在解决方案资源管理器中打开 Sample.aspx.resx。
在资源编辑器的“值”下,列出了页中放置的每个控件的“Text”属性。在此处更改值会导致更改默认区域性的值。
-
将“ButtonResource1.Text”设置为 Edited English Text。
-
保存该文件。
现在可以测试该页。
对页进行测试
-
按 Ctrl+F5 运行该页。
在资源编辑器中提供的文本显示为 Button1 的标签。使用隐式本地化时,资源文件中的语法属性会自行重写在页中指定的属性。
每种语言和区域性的组合均需要有唯一的资源文件。若要添加其他区域性,可以使用默认文件作为起点。可以为不同的区域性和区域设置创建资源文件,方法是创建新的资源文件,并在文件名中包含 ISO 语言代码(如 en-us、fr-ca 和 en-gb)。这些 ISO 代码位于页名和 .resx 文件扩展名之间,如 Sample.aspx.en-us.resx。若要指定非区域性特定的语言,则应删除国家/地区代码,例如指定法语时应使用文件名 Sample.aspx.fr.resx。
注意 |
---|
使用隐式本地化语法时,必须为每个页创建一系列单独的资源文件。 |
创建非区域性特定的法语文件
-
在解决方案资源管理器中,右击 Sample.aspx.resx 文件,并单击“复制”。
-
右击 App_LocalResources 文件夹,然后单击“粘贴”。
Visual Web Developer 创建一个名为“副本 Sample.aspx.resx”的文件。
-
右击“副本 Sample.aspx.resx”文件,单击“重命名”,然后键入“Sample.aspx.fr.resx”。
Sample.aspx.fr.resx 指示用于非区域性特定的法语文本的文件。
-
打开 Sample.aspx.fr.resx。
-
将 Button、Label 和 TextBox 控件的“Text”分别设置为 French Button、French Label 和 French TextBox。
-
保存该文件。
用备用语言设置进行测试
若要查看 ASP.NET 是否在使用这个新的资源文件,必须先将浏览器设置更改为请求所需的区域性。
更改浏览器的语言设置
-
在 Microsoft Internet Explorer 中,单击“工具”菜单上的“Internet 选项”。
-
单击“语言”。
-
在“语言首选项”对话框中单击“添加”。
-
在“添加语言”对话框的“语言”下,单击“法语(法国)[fr]”,然后单击“确定”。
-
单击“添加”,然后将“西班牙语(墨西哥)[es-mx]”添加到语言列表中。
-
单击“添加”,然后将“阿拉伯语(埃及)[ar-eg]”添加到语言列表中。
在本演练的后面部分,您将使用西班牙语和阿拉伯语进行测试。
-
在“语言首选项”对话框的“语言”下,单击“法语(法国)[fr]”,单击“上移”,再单击“确定”。
Internet Explorer 现在设置为将 fr 作为所有请求的语言设置传递。在 Sample.aspx 页中将区域性设置为 auto 时,ASP.NET 会试图根据语言和区域性首选项定位资源文件及其相应值以生成页。
对页进行测试
-
在 Visual Web Developer 中,按 Ctrl+F5 运行页。
该页使用本地化后的法语文件而不是英语版本中的值进行刷新。
注意 在 Internet Explorer 中,通过返回到“语言首选项”对话框并在列表中上移所选语言,可重置语言设置。
在此演练的第一部分,您已通过使用 ASP.NET 隐式本地化让控件显示本地化的文本。您生成了一个包含属性 (Property) 值的资源文件,并且在该过程中为每个控件添加了一个属性 (Attribute),该属性 (Attribute) 指示控件从资源文件填充其属性 (Property) 值(如果有)。隐式本地化自动工作,也就是说,您不需要逐个指定每个属性从资源文件读取信息的方式。
但是,有时可能需要对属性的设置方式进行更直接的控制。要达到这个目的,不应使用隐式本地化,而应使用显式本地化。通过显式本地化,可以使用指向资源文件的表达式设置属性值。运行页时,会对表达式进行计算,从指定的资源文件中读取该值,然后使用该值设置属性。
如果除了控件和标签外还需要本地化大量的文本或自定义消息,则显式本地化十分有用。例如,您可以为电子商务网站开发一系列本地化的欢迎消息和感谢消息,然后使用显式声明性表达式将此文本放置在页上。此外,显式本地化允许维护一个本地化的资源文件集,而不是为每个页单独维护一个文件集。
在本部分中,您将手动创建资源文件,然后使用 ASP.NET 声明性表达式语法引用这些文件。您将为一个简单的感谢消息创建一个资源文件。与使用设计器时不同,此时不需要为每个 ASP.NET 页创建一个单独的资源文件。
资源文件的基名称为 LocalizedText。对于要本地化的每种语言,都将另外创建一个文件,并在文件名中包含相应的语言代码(有时可能还有区域性代码)。例如,对于美国英语,将创建名为 LocalizedText.resx 的文件。对于加拿大法语,将创建名为 LocalizedText.fr-ca.resx 的文件。这两个文件都将放在 Web 应用程序的 Resources 目录下。与前面介绍的隐式示例不同,您无需为每个 .aspx 页维护一个资源文件;相反,您可为支持的每种语言或区域性维护一系列文件。
创建资源文件
-
在解决方案资源管理器中,右击网站的根目录,单击“添加 ASP.NET 文件夹”,然后单击“App_GlobalResources”。
-
右击“App_GlobalResources”文件夹,然后单击“添加新项”。
-
在“Visual Studio 已安装的模板”之下单击“资源文件”。
-
在“名称”框中,键入 LocalizedText.resx,然后单击“添加”。
LocalizedText.resx 文件将充当回退区域性的资源。
-
再创建一个 .resx 文件,并将其命名为 LocalizedText.fr.resx。
字符串 "fr" 将文件标识为浏览器的语言设置为法语(无论区域性如何)时使用的资源。
-
创建第三个 .resx 文件,并将其命名为 LocalizedText.es-mx.resx。
字符串 "es-mx" 将文件标识为浏览器的语言设置为西班牙语(墨西哥)时使用的资源文件。
-
打开 LocalizedText.resx 文件。
-
在“名称”列的第一行中键入 Msg1。
-
在“值”列的第一行中,键入 Hello。
-
保存文件并将其关闭。
-
打开 LocalizedText.fr.resx,创建名为 Msg1 的资源字符串,并为其分配值 Bon jour。完成之后,保存并关闭文件。
-
打开 LocalizedText.es-mx.resx,创建名为 Msg1 的资源字符串,并为其分配值 Buenos días。完成之后,保存并关闭文件。
注意 若要插入带锐音符(如 í)的字母,请在打开数字锁定的同时使用数字键盘键入 Alt+0237。
现在已经为名为 Msg1 的资源创建了三个值。ASP.NET 将根据浏览器设置的语言从相应的资源文件中读取值。
现在已创建资源文件,您可以返回到页,并添加引用该资源的控件。
向页添加 Label 控件
-
切换到 Sample.aspx,然后切换到“设计”视图。
-
将另一个 Label 控件拖动到页上。
-
右击该 Label 控件,单击“属性”,然后单击“表达式”框中的省略号 (…) 按钮。
出现“表达式”对话框。
-
在“可绑定属性”列表中单击“文本”。
-
在“表达式类型”列表中选择“资源”。
-
在“表达式属性”下,将“ClassKey”设置为 LocalizedText,并将“ResourceKey”设置为 Msg1。
-
单击“确定”。
-
切换到“源”视图。
标签的文本属性现在具有一个显式表达式,说明将从其中检索要选择的资源和键的基文件。
<asp:Label ID="Label2" Runat="server" Text="<%$ Resources:LocalizedText, Msg1 %>">
注意 LocalizedText 属性不具有语言指示符、区域性指示符或 .resx 扩展名,因为它不是实际的文件名。实际上,LocalizedText 表示基资源类。ASP.NET 将根据浏览器发送的区域性,从文件名中包含相应的语言或区域性代码的文件中选择资源,文件名可能类似 LocalizedText.fr.resx 和 LocalizedText.es-mx.resx,或者,如果未找到匹配的语言,则为 LocalizedText.resx。
完成资源文件并添加声明性表达式后,可以开始测试页。做完最后一个测试后,浏览器被设置为将法语作为语言首选项进行报告。测试期间,会多次更改浏览器的语言。
对页进行测试
-
按 Ctrl+F5 运行该页。
在资源编辑器中提供的法语版文本将显示为 Label 控件的文本。
-
在 Microsoft Internet Explorer 中,单击“工具”菜单上的“Internet 选项”。
-
单击“语言”。
-
在“语言首选项”对话框中,将“西班牙语(墨西哥)[es-mx]”移动到语言列表的顶部。完成后,单击“确定”并关闭“Internet 选项”对话框。
-
按 F5 刷新浏览器。
此时显示文本的西班牙语版本。
-
将语言更改为阿拉伯语,并再次按 F5 刷新该页。
此时,该文本将以在回退资源文件中使用的语言显示。因为没有创建文件 LocalizedText.ar-eg.resx,ASP.NET 无法定位与浏览器报告的语言和区域性匹配的文本,因此会使用回退资源文件。
-
完成对该页的测试后,将语言再次设置为首选语言
-
http://msdn.microsoft.com/zh-cn/library/fw69ke6f(VS.80).aspx
-
((全球化)注:如果要不按照浏览器设置的首选语言显示,也可在web.config中设置以某一语言及区域的形式显示等: <globalization culture ="es-mx" uiCulture="fr" /> ,其中culture是设置语言(如中文(中国)[zh-cn]),uiCulture是用于设置确定要应用的App_GlobalResources中的资源项.如:LocalizedText.fr.resx即写成uiCulture="fr")