最近给单位做了一个业务下单系统,由于在全球几个国家都有业务办事处,所以下单系统做的是多语言界面的
我实现多语言是利用了ASP.NET2.0的资源文件,其实据我所知除了资源文件的方式,在数据库里面建多个表中进行一个区域文化映射,也是解决国际化的一种方式(关于这种方式感兴趣的朋友可以自己试试)
现在我把实现国际化用到的相关知识总结如下:
在总结全球化知识前,先来了解一个名词:表达式语法
表达式语法格式:<%$ ... %>
它是ASP.NET2.0新增了一种声明性表达式语法,可在分析页之前将值替换到页中.
ASP.NET表达式是基于运行时计算的信息设置控件属性的一种声明性方式.
ASP.NET表达式主要应用在:连接字符串,应用程序设置,资源文件等地方.
ASP.NET 表达式的基本语法如下:
<%$ expressionPrefix: expressionValue %>
下面演示表达式语法在连接字符串和应用程序设置的应用:
a.表达式语法在连接字符串的应用
将存储在Web.config文件中的连接字符串的值设置为控件的连接字符串属性
- <asp:SqlDataSource ID="SqlDataSource1" Runat="server"
- SelectCommand="SELECT * FROM Employees"
- C>
- </asp:SqlDataSource>
- <configuration>
- <connectionStrings>
- <add name="NorthwindCon"
- c
- providerName="System.Data.SqlClient" />
- </connectionStrings>
- </configuration>
b.表达式语法在应用程序设置的应用
使用表达式来引用在Web.config配置文件中定义的应用程序设置
- <asp:Label ID="Label1" runat="server" Text="<%$ AppSettings:Txt %>"></asp:Label>
- <appSettings>
- <add key="Txt" value="Abc"/>
- </appSettings>
其实表达式语法还有一个重要的应用,就是在资源文件中的使用,而资源文件正是我实现本地化的基础.
ASP.NET2.0提供了三项关于网站国际化的特性:
(1)自动侦测浏览器的语言
通过确定发出请求的浏览器的语言,可以方便地根据用户的区域性调整应用程序的行为
(2)声明本地化的表达式
声明性资源表达式可使您的应用程序使用多种语言,而不必手动编写代码来检索资源并在页中进行替换
只需使用ASP.NET2.0中新提供的表达式语法即可对资源替换进行定义
(3)生成本地资源
ASP.NET2.0支持标准的resx文件格式自动进行运行时资源检索。
Vs2005也提供了相应的支持,可方便地生成资源
A.区域性的格式设置
区域性名称和标识符名称遵循RFC 1766标准,具体请查看msdn
请看下图,我抓取的部分区域性图片:
区域性通常分为三个类型:固定区域性、非特定区域性和特定区域性。
a.固定区域性不区分区域性。可以使用空字符串("")或者按区域性标识符0x007F来指定固定区域性,它与英语语言关联,但不与任何国家/地区关联。
b.非特定区域性是与某种语言关联但不与国家/地区关联的区域性。
c.特定区域性是与某种语言和某个国家/地区关联的区域性。
例如:"fr"(法语)是非特定区域性,而"fr-FR"(法语(法国))是特定区域性
特别提示:"zh-CHS"(简体中文)和"zh-CHT"(繁体中文)是非特定区域性。
区域性是有层次结构的,即特定区域性的父级是非特定区域性,而非特定区域性的父级是InvariantCulture
利用ASP.NET2.0可轻松地逐页更改区域性设置
只需将UICulture和Culture(区域性)属性添加到.aspx等类似页面内的Page指令即可
<%@ Page Culture="Auto" UICulture="Auto" %>
要想对站点中的所有页面都设置相同的区域性设置,只需将以下元素添加到位于站点的根处的web.config文件中即可,这样就不必分别为每个页面进行分配了
<globalization uiCulture="auto" culture="auto" />
还可以为ASP.NET指定一个默认区域性
以下指定页面的用户界面区域性是自动,默认区域性是英语,页的区域性是自动,默认区域性是英语(美国)
<globalization uiCulture="auto:en" culture="auto:en-US" />
Culture:指示页的区域性设置
UICulture:指定用于页的用户界面(UI)区域性设置
关于Internet Explorer中设置首选语言,可以如下配置:
1.选择“工具 | Internet 选项”命令。
2.选择“语言”按钮。
3.在显示的对话框中,单击“添加”按钮添加一个新的语言并选择一个新的区域性。单击“确定”。
4.请确保首选语言位于列表的顶部。选择该语言并单击“上移”。单击“确定”退出对话框。
5.刷新。
B.设置语言首选项
自动检测功能所选择的默认Culture和UICulture有时可能不是用户所需要的
例如:一个美国籍业务员来到中国出差,在中国总部上网下业务单.这种情况下,Web应用程序应该为用户提供显式更改语言的功能,给他提供英文版的业务下单页
- using System.Threading;
- using System.Globalization;
- protected override void InitializeCulture ( )
- {
- //显式的指定区域为en,为美国籍业务员显示英文页
- //实际应用中可以根据用户选择来动态设置语言
- //还可以利用Profile来记住用户选择的语言,以便用户以后访问网站时自动进入相应语言页
- Thread.CurrentThread.CurrentUICulture = new CultureInfo ( "en" );
- Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture ( "en-US" );
- }
注意:对Thread.CurrentThread.CurrentCulture和Thread.CurrentThread.CurrentUICulture所做的更改需要在InitializeCulture()方法中进行,因为对首选浏览器语言的自动检测是在页生存期的早期发生的
特别提示:
CultureInfo类的实例化一般有两个途径,如下所示:
- CultureInfo culture = CultureInfo. CreateSpecificCulture (name);
- CultureInfo culture = new CultureInfo(name);
二者的区分:
使用第一种方法,只能创建固定区域性或特定区域性的CultureInfo实例。
使用第二种方法,则是建立一个name所指定的区域性的CultureInfo实例,它可以是固定的,非特定的或特定区域性的
Thread类的CurrentCulture属性用来获取或配置当前线程的区域性,它必须被配置为特定区域性。
假如Thread.CurrentThread.CurrentCulture = new CultureInfo ( "en" );就会报错!
C.全局资源和本地资源
资源文件实际是XML文件,其中包含要转换为不同语言或图像路径的字符串。
资源文件包含键/值对,每一对都是一个单独的资源。键名不区分大小写。
ASP.NET中的资源文件具有.resx扩展名。在运行时,.resx 文件将编译进一个程序集内。
全局资源位于一个名为/App_GlobalResources的专用文件夹中,该文件夹位于应用程序的根目录下。
所有页、用户控件等都可访问这些资源,因此全局资源通常用作共享资源。
资源文件的名称用在显式表达式中,但也采用namespace.classname形式,以便在应用程序的Resources命名空间下进行强类型访问。
本地资源在同级/App_LocalResources文件夹下定义,RESX 文件遵循关联页、用户控件或母版页以及区域性定义的命名约定.
例如:与Index.aspx页一起有一个名为App_LocalResources的文件夹,本地资源就放在该文件夹中,该文件夹根据页的名称相应命名如下:
Index.aspx.resx。非区域性特定资源文件
Index.aspx.fr.resx。区域性特定资源文件(法语)
Index.aspx.de.resx。区域性特定资源文件(德语)
文件的基名称与页文件名相同,后跟语言和区域性名称,最后以扩展名 .resx 结尾
提示:Vs2005可以在设计视图编辑器中打开页、用户控件或母版页时,在工具菜单中提供一个名为生成本地资源的命令。该命令可自动创建默认区域性的本地资源文件。
若要创建其他语言的资源文件,可以在解决方案资源管理器中复制该文件,然后按照以下模式之一重命名它:
对于全局资源文件:
name.language.resx
name.language-culture.resx
对于局部资源文件:
pageOrControlName.extension.language.resx
pageOrControlName.extension.language-culture.resx
例如,如果创建名为WebResources.resx的全局资源文件,且该文件将翻译为英语,则请将复制的文件命名为WebResources.en.resx。请注意,对于局部资源文件,资源文件名是页或控件的名称(包括文件扩展名),后面是语言和区域性信息。
全局资源文件和本地资源文件之间选择?
通常情况下,希望在各页之间共享资源时,应向全局资源文件添加这些资源。
全局资源文件中的资源还是强类型的,用于以编程方式访问。
但如果将所有本地化资源都存储在全局资源文件中,则这些文件会变得很大。
此外,如果多个开发人员要处理不同的页但在同一个资源文件中工作时,全局资源文件也会更难于管理。
本地资源文件使得单个ASP.NET网页的资源比较容易管理,但不能在各页之间共享资源。
此外,如果有许多页必须本地化为多种语言,则可能会创建大量本地资源文件。
提示:
在对默认资源文件进行更改时,无论它是本地资源文件还是全局资源文件,ASP.NET都重新编译资源并重新启动ASP.NET应用程序
在添加附属资源文件将不会导致重新编译资源,但ASP.NET应用程序将重新启动
D.资源表达式
有两种形式的资源表达式:显式和隐式
(1).本地资源的隐式表达式
如果已为页创建了本地资源文件,则可以使用隐式本地化从该资源文件中为控件填充属性值。
使用隐式本地化时,ASP.NET读取资源文件并将资源与属性值相匹配。
在页上,对该控件的标记使用特殊的 meta 属性可指定隐式本地化.
<asp:Button ID="Button1" runat="server" Text="Button" meta:resourcekey="Button1Resource1" />
resourcekey值与相应资源文件中的键相匹配,如果在资源文件中定义了某个属性值,则ASP.NET会用资源值替换该属性。
(2).本地资源的显式表达式
与隐式本地化不同,必须为要设置的每个属性分别使用一个资源表达式。
该表达式采用以下形式,ResourceID是必需的:
- <%$ Resources: ResourceID %>
- <asp:Button ID="Button1" runat="server"
- Text="<%$ Resources: Button1Resource1.Text %>"
- ToolTip="<%$ Resources:Button1Resource1.ToolTip %>" />
(3).全局资源的显式表达式
该表达式采用以下形式:
<%$ Resources: Class , ResourceID %>
Class是全局资源时使用的资源文件,ResourceID是要读取的资源的标识符.
- <asp:Button ID="Button1" runat="server"
- Text="<%$ Resources : ResourceGlobal, Button1Txt %>"
- ToolTip="<%$ Resources : ResourceGlobal, Button1ToolTip %>" />
E.对全局资源和本地资源的编程访问
调用GetLocalResourceObject或GetGlobalResourceObject方法以分别从全局资源文件或本地资源文件中读取特定的资源
- //访问本地资源
- Button1.Text = GetLocalResourceObject ( "Button1Resource1.Text" ).ToString ( );
- Button1.ToolTip = GetLocalResourceObject ( "Button1Resource1.ToolTip" ).ToString ( );
- //访问全局资源
- Button1.Text = GetGlobalResourceObject ( "ResourceGlobal" , "Button1Txt" ).ToString ( );
- Button1.ToolTip = GetGlobalResourceObject ( "ResourceGlobal" , "Button1ToolTip" ).ToString ( );
F.编码
对于比较旧的浏览器以及移动设备上的浏览器,可能有必要将与浏览器之间的通信转换成某种基于代码页的旧式编码
在web.config文件的globalization节中配置即可
G.为全球化使用 HTML 标记从右向左显示文本
编写ASP.NET网页时,令文本从右向左显示的最佳方式是采用dir方向)属性
dir属性通常放在html或body标记中,而页上的控件和HTML元素从指定的方向继承
如果dir属性的值为html标记中的rtl(从右向左),则说明页的扩展样式设置正确。
如果dir属性的值为body标记中的rtl(从右向左),则框架和标题不继承从右向左的方向。
1.在<html>或<body>标记中,将dir设置为ltr或rtl
<html dir="rtl">
<body dir="rtl" >
2.若要重写单个控件的默认方向,请将每个控件的dir设置为ltr或rtl
<table dir="ltr" >
<asp:TextBox dir="ltr" >