.NET中实现网站的国际化

本文适当的修改了原文,,特此说明

原文地址:http://dotnet.9sssd.com/aspnet/art/949

网站在开发的过程中需要实现多语言版本,我们暂且认为有英语和汉语两个版本。网站结构包括,UI过程,rest服务,以及相应的js,各个部分我们都要实现多语言,本文实现的是根据用户请求浏览器设定的语言,来加载国际化资源实现国际化,不是网页中多语言的按钮切换的效果,但是在部署过程中要能实现多与语言配置。

首先我们出场的是资源文件,C#的项目实现本地化和区域化,我们要用到资源文件。

添加资源文件夹

添加资源文件夹

添加资源文件项

添加资源文件项

这里文件的命名最好能规范,如英文版本建议 lang.en.resx,汉语版本建议用lang.zh-cn.resx。

实际使用效果

ASP.NET 一步一步实现网站的多语言版本

资源文件夹由各个语言版本的资源文件组成,资源文件以.resx后缀和.cs后缀成对出现,其实质是一定规则的Xml文件。这个很容易理解,应用程序通过资源文件实现多语言版本的切换,这个资源文件自然保存着语言版本的键值对应关系,如果你还不太理解的资源文件的话,可以用记事本打开.resx文件,为了真正看到资源文件的核心数据,我们先提前添加一个资源。

ASP.NET 一步一步实现网站的多语言版本 - 1

.resx文件

以root为根节点的xml文件,刚才我们添加的资源表示为:


1 <data name="website" xml:space="preserve">
2 <value>cnblogs</value>
3 </data>

我们操作.resx文件就是要形成多个data节点。

接下来我们要添加键值对应关系了,如果键值对应对比较少,我们可以通过上图中的图形化界面操作,但是既然是网站,需要翻译的内容必定会很多,难道我们一个一个添加吗?

既然核心文件就是这个data节点,我们只要保证data节点补充完整即可。

这里我们提供两种方法供参考。

1、可以先把键值对事先批量保存在数据库中,再通过读取数据,使用程序批量生成data节点集合,补充完整即可。这样做的好处是可以把数据保存下来,省去手工添加的繁琐。

其实在实际开发过程中,翻译内容键是会不断增加调整的,并且资源文件不允许重复键,也就意味着要不断的修改数据和程序。总之,这不算一种科学的方法。

2、我们需要发现一个工具,vs早已经准备好了,Resgen

它可以实现txt文件与.resx文件的相互转化,准确快速:

Resgen

上图中的txt文件格式可以是这样。

website=网站

service=服务

以上两种方法各有利弊,我个人还是推荐第二种方法。

生成资源文件是实现多语言版本的第一步,有些需要注意的地方:

1)键的名字不能重复,最好是有意义的无空格及特殊字符的。

2)多个语言版本的文件中需要都有指定的键。

即 :


1 <data name="website" xml:space="preserve">
2 <value>cnblogs</value>
3 </data>

这个节点需要在lang.en.resx和lang.zh-cn.resx文件中都存在,只是value值不同,否则在读取时会出现混淆。

读取使用资源文件

资源文件整理完以后,我们需要替换所有需要翻译的内容为资源文件变量,无论是前台aspx页面还是cs文件都可以按照以下格式替换:


1 <%=Resources.lang.website%>

这个时候可以体现键名字规范的好处,智能提示可以清晰的找出,并且不会出现_等符号。

读取资源文件中的值更多的方式参考下面的网址:

http://msdn.microsoft.com/zh-cn/library/ms227427(v=vs.100).aspx ,,asp.net网页资源文件概述,在网页中使用资源小节

http://msdn.microsoft.com/zh-cn/library/ms227982(v=vs.100).aspx ,,编程方式检索资源文件

js中实现多语言

js实际上与资源文件是没有关系的,所以以上 的资源文件在js部分不能直接使用。既然js也需要有多语言版本,所以js也必定有自己的"资源文件"--json

我们借助json存储需要翻译的js提示语言,value等值的对应关系。

两个语言版本,我们生成3个js文件,以备后用:

js中实现多语言

每个文件中存放的相应的json数组,翻译内容键值对应。

var note { website:"博客园",sure:"确定"}

使用:

在需要使用的js文件中引入lang.en.js和 lang.zh-cn.js,做相应的替换即可。


1 ///<reference path="/Jscript/Translate/lang.en.js" />
2 ///<reference path="/Jscript/Translate/lang.js" />
3 ///<reference path="/Jscript/Translate/lang.zh-cn.js" />

note.sure

为了代码规范我建议在生成json文件时加上注释:


1 ///<param name="TianJia" type="String">添加</param>
2 Add:"Add",

js多语言翻译的关键是js中需要翻译的内容被相应的js文件中的json值替换。比如翻译英文版的 "确定",在程序中我们必须读到相应的 lang.en.js 文件,这样才可以取到sure值。

我们可以通过cookie来决定加载哪个翻译的js"资源文件",也可以部署时直接把相应的js转移到 lang.js,而删除其它不用的js翻译文件。这也是以上我说生成3个js文件的原因。

说完了js的配置,我们再返回头来说说资源文件的配置。

程序如何决定网站启动时使用哪个资源文件?

资源文件由在webconfig的<system.web>下globalization节点设置,打开相应的本地化节点即可:


1 <globalization culture="en-US" uiCulture="en-US"/>
2 <!--<globalization culture="zh-CN" uiCulture="zh-CN"/>-->

这样就实现了网站的多语言配置,如果要实现网页切换国际化,需要在cookie和Global.asax继续处理

PS:

其实网站国际化,从实现效果来看,有这么3中

1.网页中没有出现 简体中文 繁体中文 英文 等语言的切换按钮,就是根据用户请求信息头里面带的信息,网站服务器自动根据附带的标识加载对应的国际资源文件(本文)

2.网页中出现上述的切换按钮,但多个语言布局是不一样的,因为不同字符,占位是不一样的,汉语翻译成英文,很可能导致原来的布局完全变形,这种情况就是每个语言的网站都是一个独立的站点,第一次请求根据用户请求传递的标识符,转向到不同的站点,用户在页面切换语言,则转向相应语言的站点即可,每个站点负责一个语言版本的网站就行了

3.网页中出现上述按钮,布局也是一样,就是上文说的需要在上文的基础上,需要在cookie和Global.asax继续处理的这种情况,这种国际化,需要在上文的基础上,额外做的工作是,用cookie记下用户选择的语言,请求时,会附带上用户指定的语言,然后在Global.asax中的request事件中,指定加载哪个国际化资源文件(显式设置 Thread.CurrentUICulture 属性设置为特定区域性,无论用户的浏览器或操作系统语言,资源管理器(ResourceManager)总是检索该区域性的资源),不再让web服务器自动加载,即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
此文档是从实际项目总结出来的,互联网上只有“在单一页面进行语言切换”的教程, 没有“一键切换”的解决方案,更没有同时把5种读取资源文件总结在一起的demo。 本文档重点 1.多种读取方式 2.一键全站切换 步骤 一:新建一个asp.net 空 web应用程序“Internationalization”(图1) 二:右键“Internationalization”--->添加--->添加ASP.NET文件夹--->App_GlobalResources 三:右键“App_GlobalResources”--->添加--->新建项--->资源文件--->GlobalLanguage.resx 四:在GlobalLanguage.resx里添加键值对.(图二) 五:连续复制“GlobalLanguage.resx”两次到“App_GlobalResources”下面,并修改名称为 GlobalLanguage.en-US.resx GlobalLanguage.zh-CN.resx 说明:(为什么会有三个文件呢?系统必须有一个默认文件“GlobalLanguage.resx”,两种语言两个文件.) 六:修改英文和文资源文件里的键值对。 说明(网上大多做法都是把语言设置为浏览器自动识别语言, 这种方式在实际项目一般不用,所以直接讲解用程序来控制) 七:添加language1.aspx (图3,4) 八:添加language2.aspx (图5),在设计模式下“工具”--->“生成本地资源”,会自动添加一个“App_LocalResources” 和第五步一样,添加再添加两个资源文件。 language2.aspx.zh-CN.resx language2.aspx.en-US.resx 说明(一键全站切换的实现方法有多种,这里只讲最有效的,编写一个基类,在里面设置一个全局变量lan,所有 页面都继承这个基类,再通过程序修改变量lan,用Session最简单,但是用户过多时对内存的消耗很大, 还可以用数据库和配置文件,但是最好用Cookie,所以下面以Cookie为例子) 九:新建一个母板页“language.Master”(图6,7) 十:添加language3.aspx (图8,9),必须继承Base类 十一:添加language4.aspx (图10),必须继承Base类

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值