了解 ASP.NET AJAX 本地化(四)

来源:互联网 发布:tpshop多商户分销源码 编辑:程序博客网 时间:2024/04/30 05:03
 

简介

Microsoft的 ASP.NET 技术提供了一个面向对象、事件驱动的编程模型,并将其与已编译代码的优势结合起来。但其服务器侧的处理模型仍存在技术本身所固有的几点不足,其中很多可以通过将Microsoft AJAX 服务封装到 .NET Framework 3.5 中的System.Web.Extensions 的新特性得到解决。这些扩展提供了大量丰富的客户端特性,这些特性之前是作为ASP.NET 2.0 AJAX Extensions 的一部分,现在则是包含在Framework 基础类库中提供的。这一命名空间的控件和特性包括无需刷新整个页面的局部呈现、通过客户端脚本(包括ASP.NET 配置文件 API)访问 Web 服务的能力、以及功能广泛的客户端侧API,用于映射 ASP.NET 服务器侧控件集中许多控件方案。

本白皮书将在本地化支持的业务需求场景中深入探讨Microsoft AJAX Framework 和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 Framework 利用集成模型来支持不同的本地化场景。有了Microsoft AJAX Framework,脚本的本地化可以通过将其部署到附属程序集中实现,也可利用静态文件系统结构实现。

用附属程序集嵌入脚本

与标准 .NET Framework本地化策略一致的资源可以嵌入附属程序集。与传统字节资源集成相比,附属程序集提供了如下优势:可以在无需更新较大镜像的情况下更新任何特定的本地化内容;通过向项目文件夹中安装附属程序集即可添加本地化内容;附属程序集的部署不会导致主要项目程序集的重新载入,等等。对于 ASP.NET 项目而言,这些特性尤其实用,因为它们可以极大地降低增量更新占用的系统资源,同时将对生产网站使用的影响降到最低。

通过将脚本添加到 .resx 托管文件(或 .resources 编译文件)将脚本嵌入程序集。这些文件是在编译时被添加到程序集中的。添加脚本后,文件的资源通过AJAX 运行时生成代码,经由程序集级别属性,向脚本应用程序提供。

嵌入脚本文件的命名约定

Microsoft AJAX Framework 脚本管理支持多种可在脚本部署和测试中使用的选项,并提供了一些相关的使用指南。

出于便于调试的目的:

发行(生产)脚本的文件名中不应包含.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 Extensions的 Web 站点项目。在 LocalizingResources解决方案中再创建一个类库项目。
  2. 向 LocalizingResources项目中添加一个名为 VerifyDeletion.js的 Jscript 文件,以及名为 DeletionResources.resx和 DeletionResources.es.resx的 .resx 资源文件。前者将包含不受文化影响的资源,后者包含西班牙语资源。
  3. 将下列代码添加到 VerifyDeletion.js 中:
  1. function VerifyDeletion(fileName)
  2. {
  3.      if (confirm(Message.VerifyDelete.replace(/FILENAME/, fileName)))
  4.      {
  5.           Delete(fileName);
  6.           return true;
  7.      }
  8.  
  9.      return false;
  10. }
  11.  
  12. function Delete(fileName)
  13. {
  14.      alert (Message.Deleted.replace(/FILENAME/, fileName));
  15. }
  1. 如果不了解 JavaScript Regex语法的人,包含在单斜线中的文字(如前例中的 /FILENAME/)表示一个 RegExp 对象。MSDN 库包含大量 JavaScript 引用,而且以在线方式提供了关于JavaScript 内建对象的资源。向 DeletionResources.resx 添加下列资源字符串:
    VerifyDelete:Are you sure you want to delete FILENAME?
    Deleted:FILENAME has been deleted.
  2. 向 DeletionResources.es.resx 添加下列资源字符串:
    VerifyDelete:¿Está seguro que desee quitar FILENAME?
    Deleted:FILENAME se ha quitado.
  3. 向 AssemblyInfo 文件添加下列代码行:
  1. [assembly: System.Web.UI.WebResource("LocalizingResources.VerifyDeletion.js",
  2.      "text/javascript")]
  3. [assembly: System.Web.UI.ScriptResource("LocalizingResources.VerifyDeletion.js",
  4.      "LocalizingResources.DeletionResources""Message")]
  1. 向 LocalizingResources项目添加对 System.Web 和 System.Web.Extensions的引用。
  2. 从网站项目中添加一个到LocalizingResources项目的引用。
  3. 在网站下的 default.aspx 中,添加下列标记以更新 ScriptManager 控件:
  1. <asp:ScriptManager ID="ScriptManager1" runat="server" EnableScriptLocalization="true">
  2.      <Scripts>
  3.           <asp:ScriptReference Assembly="LocalizingResources" 
  4.                Name="LocalizingResources.VerifyDeletion.js"/>
  5.      </Scripts>
  6. </asp:ScriptManager>
  1. 在 default.aspx 页面的任意位置添加下列标记:
  1. <asp:Button ID="btnDelete" runat="Server" OnClientClick="VerifyDeletion('a.txt');" 
  2.  Text="Delete" />
  1. 按 F5 键。根据提示启用调试功能。页面载入后,按下 Delete 按钮。注意,提示确认的语言为英语(除非您的计算机默认设置为优先选择西班牙语资源)。
  2. 关闭浏览器窗口并返回 default.aspx。将 @Page 标题指示符中 Culture 和 UICulture 的 auto 替换为 es-ES。再次按下 F5,从而在浏览器中再次启动web 应用程序。注意,这次删除文件的提示语言为西班牙语:

注意本演练中有几处可变要素。例如,脚本可以在页面载入时通过编码注册到 ScriptManager 控件。

包含静态脚本文件结构

使用静态脚本文件进行部署时,就会失去使用 .NET 固有的本地化方案的某些优势。最显而易见的是,不能通过包含脚本资源文件生成自动类型了。比如在上面的示例中,资源的显示是通过一个从ScriptManager 控件中自动生成、名为 Message 的类型实现的。

但使用静态脚本文件结构也有一些优点。执行更新无需对附属程序集进行重新编译或重新部署,也可以使用静态文件结构来覆写嵌入脚本或集成可能未被某个组件携带的小功能。

Microsoft建议,应尽量避免在项目编译过程中通过自动生成脚本资源发生的版本控制事件。否则维护大规模的脚本代码库时,将越发难以确定代码更改是否已经反映到每个本地化脚本中。或者,您可以只维护一个逻辑脚本以及多个本地化脚本,并在建立项目时合并这些文件。

由于不需要声明性地添加资源,引用静态脚本文件可通过两种方式实现:将<asp:ScriptElement>元素添加为 ScriptManager 控件的 <Scripts>标记的子元素;在运行时通过编码向页面上的 ScriptManager 控件的 Scripts属性添加 ScriptReference对象。

ScriptManager及其在本地化中的角色

ScriptManager 为本地化应用程序提供了几种自动操作:

  • 根据设置和命名约定自动定位脚本文件;例如,它在调试模式下时载入启用了调试的脚本,并根据浏览器的用户界面选择载入本地化脚本。
  • 启用了文化定义,包括定制文化定义。
  • 启用了 HTTP协议下的脚本文件压缩。
  • 缓存脚本以便有效管理多个请求。
  • 添加了一个脚本的间接层,通过一个加密 URL 发送脚本。

脚本引用可通过编码或声明式标记添加到 ScriptManager 控件中。当使用嵌入程序集而不是网站项目本身的的脚本时,声明式标记尤其有用。因为版本的更新不会导致脚本名称发生变化。

小结

随着 web 应用程序的日益普及,满足更广泛的文化和社会需求日益成为业务模型的核心。电子商务web 应用程序需要具有处理外币的能力;内容管理系统不仅需要呈现自身的内容,还应以其他语言显示浏览提示和表单字段;而且公司还需要了解这一需求是可访问的。

.NET Framework 通过使用附属程序集和 XML 资源(.resx)文件来提供一种通用的资源字符串和图像查看方法,支持一个丰富的本地化框架。ASP.NET AJAX Extensions,包括Microsoft AJAX Framework 和 Microsoft AJAX 脚本库,在客户端侧代码支持这种编程模型,从而方便进行简单的资源字符串查找。在文件名遵循特定命名规则的前提下,附属程序集支持通过ScriptResource.axd 自动包含脚本资源(实际的.js 文件)。通过这种支持,ASP.NET AJAX Extensions 简化了脚本的本地化和应用程序的国际化。

快乐编程!

原创粉丝点击