人无信不立/2008-04-26 22:30
永春阁
专注于技术,切不可沉湎于技术
博客园
社区
首页
新随笔
联系
管理
订阅
随笔- 226 文章- 20 评论- 1276
ASP.NET中多国语言的实现
现在的程序越来越要考虑国际化了,对于网站的开发也经常要考虑国际化的问题。
常见的国际化的需求主要就是两个方面:
1、不同的国家页面布局不同
2、不同的国家要显示当国的文字
在ASP.NET2.0中实现这两种需求的方法很多,我今天就总结其中一种方法的具体实现。
对应需求1我们可以使用母版页来实现,对于需求2可以使用资源文件的方式来实现。
在母版页中定义好页面布局和各种语言的转换链接,每种语言定义一个母版页,比如中文就叫Chinese.master,英文就叫English.master
Chinese.master 示例
<%
@ Master Language
=
"
C#
"
AutoEventWireup
=
"
true
"
CodeFile
=
"
Chinese.master.cs
"
Inherits
=
"
Front_ChineseMasterPage
"
%>
<!
DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
<
html
xmlns
="http://www.w3.org/1999/xhtml"
>
<
head
runat
="server"
>
<
title
>
首页
</
title
>
</
head
>
<
body
>
<
form
id
="form1"
runat
="server"
>
<
a
href
="index.aspx?language=Chinese"
>
中文
</
a
>
<
a
href
="index.aspx?language=English"
>
English
</
a
>
<
a
href
="index.aspx?language=Japanese"
>
日本語
</
a
>
<
div
>
<
table
>
<
tr
>
<
td
>
<
asp:contentplaceholder
id
="Top"
runat
="server"
>
</
asp:contentplaceholder
>
</
td
>
</
tr
>
<
tr
>
<
td
>
bbbbb
</
td
>
</
tr
>
<
tr
>
<
td
>
ccccc
</
td
>
</
tr
>
</
table
>
</
div
>
</
form
>
</
body
>
</
html
>
其他语言的母版页也是类似
然后可以在每个aspx的Page_PreInit事件中调用共通的方法来进行语言的动态转换
protected
void
Page_PreInit(
object
sender, EventArgs e)
{
Util.ChangeLanguage(Request,
this
);
}
public
static
void
ChangeLanguage(HttpRequest Request, Page page)
{
string
strLanguage
=
Request.QueryString.Get(
"
language
"
);
if
(strLanguage
!=
null
)
{
page.Session[Util.SESSION_LANGUAGE]
=
strLanguage;
}
strLanguage
=
page.Session[Util.SESSION_LANGUAGE]
as
string
;
string
strMasterPage
=
"
~/Front/MasterPage/
"
+
strLanguage
+
"
.master
"
;
page.MasterPageFile
=
strMasterPage;
string
strUICulture
=
""
;
switch
(strLanguage)
{
case
"
English
"
:
strUICulture
=
"
en-us
"
;
break
;
case
"
Japanese
"
:
strUICulture
=
"
ja
"
;
break
;
}
page.UICulture
=
strUICulture;
}
主要就是在ChangeLanguage方法中首先改变页面的母版页,然后再改变页面的区域
然后可以在Global.asax全局的Session_Start事件中设置初始语言:
void
Session_Start(
object
sender, EventArgs e)
{
Session[Util.SESSION_LANGUAGE]
=
"
Chinese
"
;
}
我这个例子中是直接设置初始为中文语言,当然也可以根据客户端的环境来动态设置的:
void
Session_Start(
object
sender, EventArgs e)
{
switch
(Session.LCID)
{
case
0x0009
:
Session[Util.SESSION_LANGUAGE]
=
"
English
"
;
break
;
case
0x0011
:
Session[Util.SESSION_LANGUAGE]
=
"
Japanese
"
;
break
;
default
:
Session[Util.SESSION_LANGUAGE]
=
"
Chinese
"
;
break
;
}
//
Session[Util.SESSION_LANGUAGE] = "Chinese";
}
通过以上步骤我们已经可以动态改变页面布局(母版页)和页面的区域了。
下面新建三个全局的资源文件:Resource.resx,Resource.en-us.resx,Resource.ja.resx
在三个资源文件中都加入
TestString
这个键值,value值写上不同的语言
然后我们就可以在自己的Page页面中使用这个资源文件了:
<%
@ Page Language
=
"
C#
"
MasterPageFile
=
"
~/Front/MasterPage/Chinese.master
"
AutoEventWireup
=
"
true
"
CodeFile
=
"
index.aspx.cs
"
Inherits
=
"
index
"
%>
<
asp:Content
ID
="Content1"
ContentPlaceHolderID
="Top"
Runat
="Server"
>
<
asp:Label
ID
="Label1"
runat
="server"
Text
="<%$ Resources:Resource,TestString %>"
Width
="76px"
>
</
asp:Label
><
br
/>
<
br
/>
</
asp:Content
>
也就是说以后出现文字或和区域有关的图片的时候都要在不同的资源文件中定义好,然后在页面中使用
<%$ Resources:Resource,TestString %>
的方式取值
虽然麻烦了一点,但还是比较方便的,有此需求的可以参考一下,如果有更好的实现方案也欢迎讨论。
posted @ 2008-03-13 17:24
永春
阅读(3052)
评论(24)
编辑
收藏
所属分类:
.Net
发表评论
回复
引用
查看
#1楼
2008-03-13 17:38 |
重典
感觉还是麻烦了些,不知道有没有更好的方法##我是直接将对象序列化了2套,一中一英,然后调用
回复
引用
#2楼
2008-03-13 17:50 |
designbeauty [未注册用户]
界面的不同最好用css来控制
回复
引用
查看
#3楼
2008-03-13 17:50 |
Clark Zheng
http://www.cnblogs.com/reonlyrun/archive/2007/03/14/ASP_Net_Localization_Study.html
不知道这样算不算个方案
回复
引用
查看
#4楼
[
楼主
]2008-03-13 18:12 |
永春
@Clark Zheng
不错,很详细
和我的方案有点像,都是使用资源文件的方式
回复
引用
查看
#5楼
[
楼主
]2008-03-13 18:15 |
永春
@重典
序列化也能实现多国语言?没试过
回复
引用
查看
#6楼
[
楼主
]2008-03-13 18:16 |
永春
@designbeauty
css也是可以的,不过还是要在每个页面动态切换css的
回复
引用
查看
#7楼
2008-03-13 18:22 |
重典
@永春
就是我的语言其实是保存在一个模型对象中的,将其序列化成N个语言版本的XML
这样,换语言只要换不要的Xml反序列化就好了
其实与使用资源的原理是差不多的
回复
引用
查看
#8楼
[
楼主
]2008-03-13 18:26 |
永春
@重典
哦,明白了
回复
引用
#9楼
2008-03-13 19:02 |
Wuvist [未注册用户]
我折腾的基于Gettext的asp.net网站多语言解决方案:
http://www.cnblogs.com/wuvist/archive/2007/03/31/Gettext_On_ASP_DotNet.html
回复
引用
查看
#10楼
2008-03-13 20:34 |
showfan
建议用Cookie存储UICulture,
在Global.asax中,用Application_AcquireRequestState代替Session_Start:
void Application_AcquireRequestState(Object sender, EventArgs e)
{
HttpCookie cookie = this.Request.Cookies["UserCulture"];
if (cookie != null)
{
string s = cookie.Value;
System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo(s);
System.Threading.Thread.CurrentThread.CurrentUICulture = culture;
System.Threading.Thread.CurrentThread.CurrentCulture = culture;
}
}
回复
引用
查看
#11楼
2008-03-13 22:25 |
张子阳.
@showfan
语言是根据浏览器如何设置的去分别进行显示的吧,为什么要设置Cookie?让用户自己选择语言么?我的做法是读取Threading.Thread.CurrentThread.CurrentUICulture 判断用户使用的是什么语言,然后根据这个值去对显示处理。
处理有两种方式,对于零散的页面显示,直接用App_GlobalResources。对于需要读数据库的大量数据(数据库存了两个版本的),只要根据CultureInfo去使用不同的SQL语句就可以了。
回复
引用
查看
#12楼
[
楼主
]2008-03-14 08:45 |
永春
@showfan
cookie是可以比session保存的时间长一点,怕客户端不支持cookie的
Application_AcquireRequestState不错,可以统一处理
回复
引用
查看
#13楼
[
楼主
]2008-03-14 08:46 |
永春
@张子阳.
我们的需求是可以让用户自由选择语言的
回复
引用
#14楼
2008-03-14 09:27 |
NetCase [未注册用户]
@showfan
Threading.Thread.CurrentThread.CurrentUICulture 去到是服务器的语言不是客户端的。你的方法不行。
回复
引用
查看
#15楼
2008-03-14 09:31 |
丁一
@张子阳.
@永春.
我也建议使用 cookie 或 profile
如果某个中国人出差在国外,
使用国外的办公电脑上网(比如英文操作系统),
但他可能希望通过一次设置后,
以后每次打开网页时看到的是中文的..
回复
引用
查看
#16楼
2008-03-14 09:46 |
Clark Zheng
@丁一
兄弟呀,只有存在profile里才有可能在任何地点,任何地方打开都是以前自己设置的语言习惯吧,cookie怎么实现?
回复
引用
查看
#17楼
[
楼主
]2008-03-14 09:56 |
永春
@Clark Zheng
丁一的意思应该是 用cookie后,每次换一台电脑只要设置一次就可以了,不要每天都设置的
回复
引用
查看
#18楼
2008-03-14 16:14 |
Azuresong
可以先判断cookie,如果cookie为空就取HTTP HEADER里的用户浏览器默认语言。
回复
引用
#19楼
2008-03-16 19:03 |
海宏软件 [未注册用户]
我的办法:
建立几个目录:zh-cn en-gb等等,首先做中文的,然后把ASPX文件全部复制到en-gb目录,把里边的第一行<% %>之间的zh-cn改成en-gb,然后翻译汉字,代码处理中检查culture处理。
回复
引用
查看
#20楼
[
楼主
]2008-03-17 12:53 |
永春
@海宏软件
你的方法也可以
不过如果有很多的国家的话就要拷贝很多个aspx页面了,而且改动起来比较麻烦的
回复
引用
#21楼
2008-07-02 10:31 |
朱建清 [未注册用户]
楼主您测试过这个吗?
<%$ Resources:Resource,TestString %>
这里已经说明了使有Resource里的TestString. 所以应该是无法自动去根据UICulture来得到相应的Resources里的TestString的吧.
回复
引用
查看
#22楼
[
楼主
]
2008-07-02 18:48 |
永春
@朱建清
这个是我自己写的,运行通过的:)
它会根据UICulture取得不同的资源文件中的值得,你可以试试
新用户注册
刷新评论列表
标题
姓名
主页
Email
(博主才能看到)
验证码
*
看不清,换一张
[
登录
][
注册
]
内容(请不要发表任何与政治相关的内容)
网站首页
新闻频道
社区
小组
博问
网摘
闪存
找找看
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
该文被作者在 2008-03-13 17:27 编辑过
相关文章:
翻译一些很酷的.Net技巧
VS.Net 的一些小技巧
ASP.NET AJAX入门系列
.NET设计模式系列文章
设计可扩展的.Net应用程序该配合什么书一起看
Linq 能否部署在 .Net 2.0 环境中?
.Net互动小组
Lucene.Net Helper(Lucene.Net 辅助工具)
相关链接:
历史上的今天:
2007-03-13
随笔20070313
所属分类的其他文章:
C#读取WORD时发生“拒绝访问”及“消息筛选器显示应用程序正在使用中”异常的处理
Asp.Net之自定义表达式构造器(ExpressionBuilder)
C#强化系列文章九:代码访问安全性使用
《博客园精华集》Sharepoint+MOSS分册第2轮筛选结果文章列表
Asp.Net页面执行流程分析
C#强化系列文章八:HttpModule,HttpHandler,HttpHandlerFactory简单使用
在MOSS中使用.Net3.5中的Ajax功能
Asp.Net Forms验证(自定义、角色提供程序、单点登录)
Asp.Net中虚拟文件系统的使用
用C#显示Project2007+TFS2008结合后的实时项目进度
最新IT新闻:
Google向Wine贡献更多代码
苹果创始人Steve Wozniak称iPod将被淘汰
福布斯:硅谷日子将更难过 谁下一个倒下
微软老矣 尚能赚否?
YouTube探索新赢利模式 开始售音乐、视频游戏
公告
本Blog版权均为本人所有,欢迎任何媒体和网站转载本人博客的内容。
本Blog的内容按原样提供,本人不提供任何形式的担保。
转载请注明出处
我的MVP配置
自2007年3月8日:
系列文章
1、
Sharepoint2007对象模型系列
2、
C#强化系列文章
3、
MOSS SDK学习系列
4、
IBatis.Net学习笔记系列
5、
MonoRail学习笔记系列
<
2008年3月
>
日
一
二
三
四
五
六
24
25
26
27
28
29
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
与我联系
发短消息
搜索
常用链接
我的随笔
我的空间
我的短信
我的评论
更多链接
我的参与
我的新闻
最新评论
我的标签
留言簿
给我留言
查看留言
我参加的小组
Debug 探索团队小组
写书译书小组
博客园精华集出版小组
iBATIS.NET
MonoRail
我参与的团队
SharePoint团队(0/744)
Ajax&Atlas技术团队(0/1138)
南京.net俱乐部(0/429)
ASP.NET AJAX (Atlas)学习(0/1353)
MVP(微软最有价值专家)团队(0/637)
Debug 探索团队(0/53)
博客园精华集出版(0/45)
随笔分类
.Net(49)
(rss)
AJax(3)
(rss)
C++/VC学习(2)
(rss)
iBATIS.NET(15)
(rss)
Java(6)
(rss)
MonoRail(25)
(rss)
OS Shell(5)
(rss)
SharePoint(42)
(rss)
Windows Server(1)
(rss)
XHTML/CSS/Script(6)
(rss)
企业开发(2)
(rss)
数据库(21)
(rss)
外语(1)
(rss)
项目管理(7)
(rss)
娱乐/杂记/修养(49)
(rss)
随笔档案
2008年9月 (1)
2008年8月 (3)
2008年7月 (7)
2008年6月 (1)
2008年5月 (2)
2008年4月 (12)
2008年3月 (14)
2008年2月 (3)
2008年1月 (14)
2007年12月 (17)
2007年11月 (21)
2007年10月 (31)
2007年9月 (13)
2007年8月 (25)
2007年7月 (10)
2007年6月 (1)
2007年5月 (2)
2007年4月 (10)
2007年3月 (15)
2007年2月 (7)
2007年1月 (1)
2006年12月 (3)
2006年11月 (21)
2006年10月 (5)
2006年8月 (2)
SharePoint学习
Codeplex Sharepoint
jianyi @ cnblogs
Kaneboy's Blog
Patrick Tisseghem's Blog
管理相关
下载_中计在线
中国管理之家
开源社区
C#开源资源大全
Java开源大全
SourceForge主页
门户网站
南京程序员俱乐部
积分与排名
积分 - 300344
排名 - 98
最新评论
1. re: C#强化系列文章
太牛了,我找了好久的资料呀,爱死你了 (luoxp)
2. re: MonoRail学习笔记十:Controller和Url的对应关系
感谢,一直对这方面不熟悉。 MonoRail果然是个好东西!! 特别对于刚从asp转到。net的人来说简直就是回归自然!! 网站建设... (benfeng)
3. re: MonoRail学习笔记十一:页面控件的填充和验证
@Ariel Y.
Brail 是什么东西?
API做得好吗?
4. re: 为什么要使用MonoRail?
不知道是用MonoRail好还是用ProMesh好!
希望给点建议。
网站建设
(benfeng)
5. re: IBatis.Net学习笔记十--数据库连接处理
你好,我现在碰上一个问题
我现在有两个数据库,对应有两个连接,请问一下,要如何处理呢?谢谢 (Scrofield)
阅读排行榜
1. 这样的面试题你会吗?(4768)
2. 易经杂说—南怀瑾(4397)
3. Asp.Net Forms验证(自定义、角色提供程序、单点登录)(4196)
4. 年终个人总结:我这五年(4016)
5. 为什么要使用MonoRail?(3929)