了解 ASP.NET AJAX 本地化

作者 :Scott Cate

本地化是设计对特定语言和区域性的支持并将其集成到应用程序或应用程序组件的过程。 Microsoft ASP.NET 平台通过集成标准 .NET 本地化模型,为标准 ASP.NET 应用程序的本地化提供广泛的支持;Microsoft AJAX 框架利用集成模型来支持可以执行本地化的各种方案。

简介

Microsoft 的 ASP.NET 技术带来了面向对象的事件驱动的编程模型,并将其与编译代码的优势结合在一起。 但是,其服务器端处理模型在技术中存在一些固有的缺点,其中许多缺点可以通过 System.Web.Extensions 命名空间中包含的新功能来解决,后者封装了.NET Framework 3.5 中的 Microsoft AJAX 服务。 这些扩展支持许多丰富的客户端功能,以前作为 ASP.NET 2.0 AJAX 扩展的一部分提供,但现在是框架基类库的一部分。 此命名空间中的控件和功能包括无需整页刷新的部分页面呈现、通过客户端脚本访问 Web 服务的功能 (包括 ASP.NET 分析 API) ,以及旨在镜像 ASP.NET 服务器端控件集中的许多控制方案的广泛客户端 API。

本白皮书探讨 Microsoft AJAX 框架和 Microsoft AJAX 脚本库中存在的本地化功能,了解业务需要本地化支持,并查看.NET Framework提供的 Web 应用程序中已集成的本地化支持。 Microsoft AJAX 脚本库利用 .NET 应用程序已使用的 .resx 文件格式,提供集成的 IDE 支持和可共享的资源类型。

本白皮书基于 Microsoft Visual Studio 2008 的 Beta 版 2。 本白皮书还假定你将使用 Visual Studio 2008,而不是 Visual Web Developer Express,并将根据 Visual Studio 的用户界面提供演练。 某些代码示例将使用 Visual Web Developer Express 中可能不可用的项目模板。

本地化的需要

特别是对于企业应用程序开发人员和组件开发人员,创建能够了解区域性和语言差异的工具的能力越来越必要。 设计能够适应客户端区域设置的组件可以提高开发人员的工作效率,并减少组件适应全球运行所需的工作量。

本地化是设计对特定语言和区域性的支持并将其集成到应用程序或应用程序组件的过程。 Microsoft ASP.NET 平台通过集成标准 .NET 本地化模型,为标准 ASP.NET 应用程序的本地化提供广泛的支持;Microsoft AJAX 框架利用集成模型来支持可以执行本地化的各种方案。 借助 Microsoft AJAX 框架,脚本可以通过部署到附属程序集或利用静态文件系统结构进行本地化。

使用附属程序集嵌入脚本

与标准.NET Framework本地化策略一致,资源可以包含在附属程序集中。 与二进制文件中的传统资源包含在一起,附属程序集具有多种优势 - 任何给定的本地化都可以在不更新较大的映像的情况下进行更新,只需将附属程序集安装到项目文件夹即可部署其他本地化,并且无需重新加载main项目程序集即可部署附属程序集。 特别是在 ASP.NET 项目中,这是有益的,因为它可以显著减少增量更新所使用的系统资源量,并尽量减少对生产网站的使用造成干扰。

脚本通过将脚本包含在托管的 .resx (或编译的 .resources) 文件(在编译时包含在程序集中)中,将其嵌入到程序集中。 然后,通过 AJAX 运行时生成的代码,通过程序集级属性向脚本应用程序提供其资源

嵌入式脚本文件的命名约定

Microsoft AJAX 框架脚本管理支持用于部署和测试脚本的各种选项,并提供指南来促进这些选项。

为了方便调试::

发布 (生产) 脚本不应在 .debug 文件名中包含限定符。 用于调试的脚本应包含在 .debug 文件名中。

促进本地化:

中性区域性脚本不应在文件名中包含任何区域性标识符。 对于包含本地化资源的脚本,应在文件名中指定 ISO 语言代码。 例如, es-CO 代表西班牙语、哥伦比亚。

下表通过示例总结了文件命名约定:

文件名 含义
Script.js 版本区域性无关的脚本。
Script.debug.js 与区域性无关的调试版本脚本。
Script.en-US.js 发布版本英语,美国脚本。
Script.debug.es-CO.js 调试版西班牙语、哥伦比亚脚本。

演练:创建本地化的嵌入式脚本

请注意:本演练需要使用 Visual Studio 2008,因为 Visual Web Developer Express 不包含类库项目的项目模板。

  1. 创建集成了 ASP.NET AJAX 扩展的新网站项目。 在名为 LocalizingResources 的解决方案中创建另一个项目(类库项目)。
  2. 将名为 VerifyDeletion.js 的 Jscript 文件添加到 LocalizingResources 项目,以及名为 DeletionResources.resx 和 DeletionResources.es.resx 的 .resx 资源文件。 前者将包含非特定区域性资源:后者将包含西班牙语资源。
  3. 将以下代码添加到VerifyDeletion.js:
function VerifyDeletion(fileName)
{
 if (confirm(Message.VerifyDelete.replace(/FILENAME/, fileName)))
 {
 Delete(fileName);
 return true;
 }
 return false;
}
function Delete(fileName)
{
 alert (Message.Deleted.replace(/FILENAME/, fileName));
}

对于不熟悉 JavaScript 正则表达式语法的用户,在上一示例中,单个正斜杠中的文本 (/FILENAME/ 是一个示例,) 表示 RegExp 对象。 MSDN 库包含广泛的 JavaScript 参考,JavaScript 本机对象上的资源可以联机找到。

  1. 将以下资源字符串添加到 DeletionResources.resx:

    VerifyDelete:是否确实要删除 FILENAME?

    已删除:FILENAME 已被删除。

  2. 将以下资源字符串添加到 DeletionResources.es.resx:

    VerifyDelete: Est seguro que desee quitar FILENAME?

    已删除:FILENAME se ha quitado。

  3. 将以下代码行添加到 AssemblyInfo 文件:

[assembly: System.Web.UI.WebResource("LocalizingResources.VerifyDeletion.js",
 "text/javascript")]
[assembly: System.Web.UI.ScriptResource("LocalizingResources.VerifyDeletion.js",
 "LocalizingResources.DeletionResources", "Message")]
  1. 将对 System.Web 和 System.Web.Extensions 的引用添加到 LocalizingResources 项目。
  2. 从网站项目添加对 LocalizingResources 项目的引用。
  3. 在 default.aspx 的“网站”项目下,使用以下附加标记更新 ScriptManager 控件:
<asp:ScriptManager ID="ScriptManager1" runat="server" EnableScriptLocalization="true">
 <Scripts>
 <asp:ScriptReference Assembly="LocalizingResources" Name="LocalizingResources.VerifyDeletion.js"/>
 </Scripts>
</asp:ScriptManager>
  1. 在 default.aspx 中,页面上的任意位置都包含以下标记:
<asp:Button ID="btnDelete" runat="Server" OnClientClick="VerifyDeletion('a.txt');" Text="Delete" />
  1. 按 F5。 如果出现提示,请启用调试。 加载页面后,按“删除”按钮。 请注意,系统会用英语 (提示你,除非你的计算机默认设置为首选西班牙语资源,) 进行确认。
  2. 关闭浏览器窗口并返回到 default.aspx。 在标头指令中 @Page ,将“区域性和 UICulture”的 auto 替换为 es-ES。 再次按 F5 在浏览器中再次启动 Web 应用程序。 这一次,请注意,系统会提示你删除西班牙语文件:

显示 Windows Internet Explorer 对话框的屏幕截图,其中显示西班牙语提示单击“O K”。

(单击以查看全尺寸图像)

显示删除西班牙语文件的提示的屏幕截图。

(单击以查看全尺寸图像)

请注意,本演练有几个变体。 例如,可以在页面加载期间以编程方式向 ScriptManager 控件注册脚本。

包括静态脚本文件结构

使用静态脚本文件进行部署时,你将失去使用固有的 .NET 本地化方案的某些优势。 主要可见的是,你丢失了从包括脚本资源文件生成的自动类型;例如,在上面的演练中,资源由来自 ScriptManager 控件的名为 Message 的自动生成类型公开。

但是,使用静态脚本文件结构有一些好处。 可以在不重新编译和重新部署附属程序集的情况下执行汇报,还可以使用静态文件结构来替代嵌入的脚本,以集成组件中可能未附带的次要功能。

Microsoft 建议通过在项目编译期间自动生成脚本资源来避免版本控制问题。 维护大量脚本代码库时,确保代码更改反映在每个本地化脚本中可能会变得越来越困难。 或者,只需维护一个逻辑脚本和多个本地化脚本,在生成项目时合并文件。

由于没有要以声明方式包含的资源,因此应通过将元素添加<asp:ScriptElement>为 ScriptManager 控件的标记的<Scripts>子级,或通过以编程方式将 对象添加到ScriptReferenceScripts运行时页面上控件ScriptManager的 属性来引用静态脚本文件。

ScriptManager 及其在本地化中的角色

ScriptManager 为本地化的应用程序启用多个自动行为:

  • 它根据设置和命名约定自动查找脚本文件;例如,它在调试模式下加载已启用调试的脚本,并根据浏览器的用户界面选择加载本地化脚本。
  • 它支持区域性的定义,包括自定义区域性。
  • 它支持通过 HTTP 压缩脚本文件。
  • 它缓存脚本以有效管理多个请求。
  • 它通过将脚本通过加密 URL 管道向脚本添加一个间接层。

可以通过编程方式或通过声明性标记将脚本引用添加到 ScriptManager 控件。 使用嵌入在除网站项目本身以外的程序集中的脚本时,声明性标记特别有用,因为随着修订的推送,脚本名称可能不会更改。

总结

随着 Web 应用程序的增长以吸引更多受众,能够接触更广泛的文化和社区的需求成为业务模型的核心:电子商务 Web 应用程序需要能够处理外币,内容管理系统需要能够不仅以其他语言呈现其内容,而且还需要能够显示其导航提示和表单字段,公司需要知道这种需求是可访问的。

.NET Framework在本质上支持丰富的本地化框架,利用附属程序集和 XML 资源 (.resx) 文件来提供一种统一的方式来查找资源字符串和图像。 ASP.NET AJAX 扩展(包括 Microsoft AJAX 框架和 Microsoft AJAX 脚本库)支持此编程模型到客户端代码中,从而轻松查找资源字符串。 附属程序集支持通过 ScriptResource.axd) (实际.js文件自动包含脚本资源,只要文件名遵循给定的命名方案。 借助此支持,ASP.NET AJAX 扩展简化了脚本的本地化和应用程序的全球化。

个人简介

Scott Cate 自 1997 年以来一直从事 Microsoft Web 技术工作,是 myKB.com (www.myKB.com) 的总裁,专门编写专注于知识库软件解决方案的基于 ASP.NET 的应用程序。 可以通过电子邮件联系斯科特,也可以通过 scott.cate@myKB.com 他的博客 联系 ScottCate.com