[FROM-> http://blog.csdn.net/wgf2006/archive/2007/10/22/1838251.aspx]
ASP.NET多语言版的开发
如果您创建的网页将由使用不同语言的用户阅读,则必须为这些读者提供用他们自己的语言查看网页的方法。一种方法是分别用各语言重新创建页面,但这种方法可能需要大量工作量、容易出错并且在更改原始页时很难维护。ASP.NET 为您提供了一种方法,使用这种方法创建的页可以根据浏览器的首选语言设置或用户显式选择的语言获取内容和其他数据。内容和其他数据指的就是资源,此类数据可以存储在资源文件或其他源中。在 ASP.NET 网页中,可以将控件配置为从资源获取其属性值。在运行时,资源表达式将被相应资源文件中的资源替换。
一、 ASP。NET的资源文件
资源文件是 XML 文件,其中包含要转换为不同语言或图像路径的字符串。资源文件包含键/值对,每一对都是一个单独的资源。键名不区分大小写。您需要为每种语言(如英语和法语)或每种语言和区域性(如英语 [英国]、英语 [美国])分别创建一个资源文件。每个本地化资源文件都有相同的键/值对;本地化资源文件与默认资源文件的唯一区别就是前者所包含的资源可能少于后者。然后,语言回退处理非特定资源或默认资源的加载。
ASP.NET 中的资源文件具有 .resx 扩展名。在运行时,.resx 文件将编译进一个程序集内,该程序集有时称为附属程序集。由于 .resx 文件是用与 ASP.NET 网页相同的方式动态编译的,因此不必创建资源程序集。编译过程将多个语言类似的资源文件压缩在同一程序集内。在创建资源文件时,首先开始创建基文件 .resx。对于要支持的每种语言,分别创建一个新文件,该文件具有同一基本文件名但包含语言或语言及区域性(区域性名称)。
您可以创建下列文件:
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
全局资源文件
将资源文件放入应用程序根目录的保留文件夹 App_GlobalResources 中,即可创建全局资源文件。App_GlobalResources 文件夹中的任何 .resx 文件都具有全局范围。此外,ASP.NET 还生成了一个强类型对象,这为开发人员提供了一种以编程方式访问全局资源的简单方法。
本地资源文件
本地资源文件是只应用于一个 ASP.NET 页的文件(带有 .aspx、.ascx、.master 等扩展名的 ASP.NET 页)。本地资源文件所放入的文件夹具有 App_LocalResources 保留名称。App_LocalResources 文件夹可以存在于应用程序的任何文件夹中,这与 App_GlobalResources 根文件夹不同。通过资源文件名将一组资源文件与特定的网页相关联。
在全局和本地资源文件之间选择
但如果将所有本地化资源都存储在全局资源文件中,则这些文件会变得很大。此外,如果多个开发人员要处理不同的页但在同一个资源文件中工作时,全局资源文件也会更难于管理。 本地资源文件使得单个 ASP.NET 网页的资源比较容易管理,但您不能在各页之间共享资源。此外,如果有许多页必须本地化为多种语言,则可能会创建大量本地资源文件。如果站点是具有许多文件夹和使用多种语言的大型站点,则使用本地资源可能快速地在应用程序域中扩展程序集的数量。 在对默认资源文件进行更改时,无论它是本地资源文件还是全局资源文件,ASP.NET 都重新编译资源并重新启动 ASP.NET 应用程序,这可能会影响站点的整体性能。添加附属资源文件将不会导致重新编译资源,但 ASP.NET 应用程序仍将重新启动。
二、在网页中使用资源
一)使用本地资源的隐式本地化
如果您已为特定页创建了本地资源文件,则可以使用隐式本地化从该资源文件中为控件填充属性值。使用隐式本地化时,ASP.NET 读取资源文件并将资源与属性值相匹配。若要使用隐式本地化,必须对本地资源文件中的资源使用命名约定,命名约定采用以下模式:
Key . Property 可以对 Key 使用任意名称,但 Property 必须与要本地化的控件的属性相匹配。
在页上,对该控件的标记使用特殊的 meta 属性可指定隐式本地化。不必显式指定要本地化的属性。配置为使用隐式本地化的 Button 控件看起来可能类似于下面的形式:
<asp:Button ID="Button1" runat="server" Text="DefaultText" meta:resourcekey="Button1" />
二)显式本地化
该资源表达式采用以下形式,其中 Class 是可选的(除非资源是全局资源),而 ResourceID 是必需的:
<%$ Resources:[Class ,]ResourceID %>
Class 值标识要在使用全局资源时使用的资源文件。在编译 .resx 文件时,将不带扩展名的基文件名显式用作所得程序集的类名。若要使用本地资源文件(与当前页名匹配的文件)中的资源,则不必提供类名,因为 ASP.NET 将该页类与资源类相匹配。
三、择资源文件
当正在运行某页并且 ASP.NET 正在从资源管理器中检索值时,ASP.NET 为该页选择与当前 UICulture 设置匹配程度最高的资源文件版本,或者使用资源后备获取资源。 ASP.NET 可以将该页的 UICulture 和 Culture 属性设置为浏览器所传递的语言和区域性值。或者,可以以声明方式或通过使用代码显式设置 UICulture 和 Culture 属性。还可以在 Web.config 文件中以声明方式设置这些值。
四、为 ASP.NET 网页全球化设置区域性和 UI 区域性
在 ASP.NET 网页中,可以设置两个区域性值,即 Culture 和 UICulture 属性。Culture 值确定与区域性相关的函数的结果,如日期、数字和货币格式等。UICulture 值确定为页加载哪些资源。 这两个区域性设置不需要具有相同的值。根据您的应用程序,分别设置它们可能很重要。Culture 值只能设置为特定的区域性
一)以声明方式设置 ASP.NET 网页的区域性和 UI 区域性
1)在Web.config 文件添加一个 globalization 节,然后设置 uiculture 和 culture 属性。<globalization uiculture="es" culture="es-MX" />
2)在页面中的区域性和 UI 区域性,请设置 @ Page 指令的 Culture 和 UICulture 属性。<%@ Page UICulture="es" Culture="es-MX" %>
3)若要使 ASP.NET 将区域性和 UI 区域性设置为用户默认语言,请将 UICulture 和 Culture 设置为 auto。
二)以编程方式设置 ASP.NET 网页的区域性和 UI 区域性
重写该页的 InitializeCulture 方法。 在重写的方法中为页设置的语言和区域性。 注意:
InitializeCulture 方法在页生命周期的很早的时期调用,此时还没有为页创建控件,也没有为页设置属性。因此,若要读取从控件传递给页的值,必须使用 Form 集合直接从请求获取这些值。
五、以编程方式使用资源
1、调用 GetLocalResourceObject 或 GetGlobalResourceObject 方法以分别从全局资源文件或本地资源文件中读取特定的资源。在 HttpContext 和 TemplateControl 类中提供了这些重载方法。
2、使用强类型检索全局资源。Resources.Class.Resource
六、 HTML 布局准则
HTML 布局的最佳做法是确保本地化人员只需翻译字符串,因为用户界面会调整所有控件的大小以适合字符串包含的文本。这是一个优点,因为从本地化过程中去除了手动调整控件大小的步骤,从而可以避免由此产生的 bug。但是,控件的布局是随字符串长度的不同而变化的,因此需要仔细测试经过本地化的网站。
下面的列表提供了设计全球化 ASP.NET 网页的建议准则。
避免使用绝对位置。
将可用的宽度和高度用于窗体
有两种方法实现此目标,如下所示:
将主要元素(如表)的宽度调整为 100%。
基于窗体的整体大小使用级联样式表表达式调整元素的大小。
对每个控件使用单独的表单元格。 这使得文本可以独立换行,并确保对于其文本布局是从右向左显示的区域性的对齐方式正确。
对于包含文本的表单元格,允许文本换行但不要使用 nowrap 属性。
将复选框和单选按钮与其标签文本分隔开。
留出增长空间,并且避免采用固定的宽度。
在尽可能少的地方设定按钮大小。
尽可能少地设置高度。
不要在 HTML 标记中使用左或右对齐。
避免使用可能需要更改的内联级联样式表值。
七、双向的支持
您可以创建支持双向语言的 Web 应用程序。创建 ASP.NET 应用程序时,若要通过一个代码库提供双向支持,应注意若干事项。
一)Web 应用程序中的对象名称
如果您使用相应的语言配置了自己的 Microsoft Windows 系统,则可以创建使用双向语言的 ASP.NET 网页。但是,如果语言配置不正确的用户访问该应用程序,这些名称将无法得到正确处理。
二)区域性支持
区域性和 UI 区域性设置决定了应用程序如何使用本地化的资源值。对于双向语言的区域性和 UI 区域性的支持与对于任何其他语言的相应支持是相同的。
三)编码
ASP.NET 将所有文本都作为 Unicode 处理,因此对双向语言提供固有的支持。您可以选择设置编码选项,以指定用于与浏览器交换信息的编码和应用于应用程序的文件的编码。
四)从右向左支持
当您创建 Web 窗体页时,可设置 dir(方向)属性。使用 dir 属性指定您希望该页使用从左向右还是从右向左的读取顺序。但是,相应的操作是由用户的浏览器来实现的。
五)ASP.NET Web 服务器控件
HTML 和 ASP.NET 服务器控件支持 Unicode 和双向语言。例如,这些控件支持从右向左的读取顺序,而且通过文本输入控件(如 TextBox 控件)可以输入阿拉伯语或希伯来语文本。