摘要 由于越来越多的跨国公司需要跨语言的WEB应用所以本地化工作变得尤其重要在ASPNET 中我们使用ResourceManager 类来实现这个工作而中提供了更加方便的方法和工具来实现
导言
现在很多跨国的商务需求都需要实现多语言对客户来说他们始终想看到网站是用他们所熟悉的语言来显示的他们不会关注网站使用的是什么技术而现在的开发工具或者开发技术并没有在本地化方面做的很好我们还需要花大量的时间和精力去做本地化的工作
ASPNET的出现大大简化了这个过程配合VSNET新的特性我们可以很方便得来自动剥离网站的语言元素很容易去实现多版本网站而且许多针对本地化的API同样也可以方便得帮助我们完成这个过程
NET 中的本地化
在中我们使用ResourceManager来实现这个过程或许对于WINFORM来说这个过程还比较简单但是VSNET并没有给我们WEBFORM下的本地化工作带来什么自动化我们还需要花很多精力在重复复制代码上
NET 中的本地化
中的本地化还是基于的但是却提供了很多自动化工作
自动生成页面资源文件
方便的编程实现资源文件的访问
自动为页面装载合适的语言
控件和资源文件自动匹配
强类型的资源文件
资源文件编辑器
资源文件使用表达式
资源Provider模型
本地资源文件实现
VSNET 菜单-Tools-Generate Local Resource所产生的资源文件将会放在\App_LocalResources下面
上图显示了不仅ASPX文件用户控件和MASTER页都会自动产生资源文件自动产生的资源文件名将是原文件名加上resx页面上的所有服务器控件用户控件和在服务器端运行的HTML控件都会被自动加在资源文件中下图显示了一个LINKBUTTON的资源文件
可以看到只有TEST和TOOLTIP这些涉及到语言的属性被加入了资源文件
再切换回视图状态可以看到一些属性右边有红色标记这表明这个属性绑定的是本地资源通常这些都是IDE自动为你做的再看看上面的AlternateText后面有一个蓝色标记这表示这个资源是全局的资源
全局资源的实现
在我们的项目中通常有很多重复的东西比如MasterPage用户控件菜单甚至还有一些提示信息等这些东西如果包含在多个页面我们每次都需要重复制作他们的资源文件这非常不科学所以我们要手动的来制定全局资源这个时候先要建立一个\App_GlobalResources目录然后在下面添加资源文件先看看IDE提供给我们的资源文件编辑器
非常多种的类型我们访问全局资源不需要考虑太多比如说一个资源文件是Flagsresx试试在编译器内输入ResourcesFlags当再次按下的时候智能感应出来了
可见这些资源文件都被编译成了强类型的类比如说图片资源我们得到的类型是SystemDrawingBitmap
本地资源访问
通常我们使用meta:resourcekey来指定控件的资源如果说一个控件的资源前缀是LinkButtonResource的话那么它的Text属性的资源就是LinkButtonResourceText这个是生成资源文件的时候IDE自动做的如果我们需要在程序中访问本地资源可以按照下面的例子
LinkButton button = new LinkButton();thislnkSelectCulture = button;
buttonID = lnkSelectCulture;
buttonPostBackUrl = selectcultureaspx;
buttonText = ((string)
baseGetLocalResourceObject(LinkButtonResourceText));
buttonToolTip = ((string)baseGetLocalResourceObject(LinkButtonResourceToolTip));
当然如果你不想你的控件使用资源文件可以按照下面的例子修改
<asp:LinkButton id=lnkSelectCulture PostBackUrl=selectcultureaspx runat=server meta:localize=false>Change Culture Settings</asp:LinkButton>
全局资源访问
使用下面的格式来定位全局资源
<%$ resources: [applicationkey] resourcekey%>
比如从Glossaryresx读取资源例子如下
<asp:ImageButton ID=btnIDesign Runat=server ImageUrl=~/Images/idesignlogojpg AlternateText=<%$ Resources:Glossary MissionSatatement%>
PostBackUrl= meta:resourcekey=ImageButtonResource />
当然你也可以直接用IDE的表达式对话框直接来选择
用程序读取方式如下
ImageButton button = new ImageButton();// other initialization code
buttonID = btnIDesign;
buttonAccessKey = (string) baseGetLocalResourceObject(ImageButtonResourceAccessKey);
buttonAlternateText = (string) baseGetGlobalResourceObject(Glossary MissionStatement);
buttonImageUrl = (string) baseGetLocalResourceObject(ImageButtonResourceImageUrl);
buttonToolTip = (string) baseGetLocalResourceObject(ImageButtonResourceToolTip);
buttonVisible = (bool)
baseGetLocalResourceObject(ImageButtonResourceVisible typeof(Control) Visible);
本地化HTML控件和文本
Html控件html控件不能用前面说的两种表达式来指定资源除非是让它runat=server不过对于页面的title比较特殊它也会作为页面的一个对象自动生成本地资源
<%@ Page Language=C# CodeFile=Defaultaspxcs Inherits=_Default meta:resourcekey=PageResource %>
不过我们也可以为它制定全局资源
<head runat=server> <title>
<asp:Literal Text=<% $ Resources: Glossary DefaultPageTitle %> runat=server></asp:Literal>
</title>
</head>
本地化文本
对于项目中很多静态的文本我们可以使用Localize控件来包含这些文字其实这个控件和Literal相似但是它能在设计模式下随意修改里面的文字内容看下怎么访问本地资源和全局资源
<asp:Localize id=welcomeContent runat=server meta:resourcekey=welcome>Welcome!</asp:Localize> <asp:Localize id=welcomeContent runat=server text=<%$ resources: Glossary
welcomeText%>>Welcome!</asp:Localize>
多语言实现
从默认的资源文件复制一个新的的资源文件只要在resx前面加上地区代号逐项编辑即可如下设置后浏览器会自动根据设置(工具-选项-语言)调用新的资源文件
<%@ Page UICulture=auto Culture=auto>
当然你也可以通过nfig文件指定一种语言
<systemweb><globalization culture=esES uiCulture=es>
</systemweb>