国际化Asp.net网站的初步实践
最近因为要做公司网站要国际化,接触了一些关于将Asp.net网站国际化的内容。
先从网上搜索了一下,无非是使用资源文件,设置本地配置之类的,感觉并不完全符合自己的要求。
我本人的要求是这样的:
- 希望能够统一进行处理,不用维护多套程序
- 结构上比较清晰,每种语言使用不同的文件夹分开
- 可以可视化的对页面进行修改
- 能够自动根据浏览器设置默认的语言
- 能够记住用户对语言的选择
为此我是这样设计的
- 在web.config的system.web节中设置
前三项设置编码类型为utf-8,作为一个国际化网站,使用utf-8编码是最普遍也最保险的做法,后面的两项设置本地语言编码,如果不设置为Auto,下面根据浏览器自动识别语言的功能将无法生效 - 在Global.asax文件中处理Application_BeginRequest事件,根据浏览器类型自动重定向页面
C#:
-
///定义语言代码
-
public enum Lang{
-
cn=2052,
-
en=1033,
-
-
}
-
///获取语言编码,如果存在cookie则从cookie中取值,否则根据浏览器自动判断
-
public Lang getlanguage
-
{
-
get {
-
-
HttpCookie cook= Context.Request.Cookies[“language”];
-
if (cook == null)
-
{
-
if (CultureInfo.CurrentCulture.LCID ==(int)Lang.cn)
-
{
-
return Lang.cn;
-
-
-
}
-
else
-
{
-
return Lang.en;
-
}
-
}
-
else
-
{
-
int iret=1033;
-
int.TryParse(cook.Value,out iret);
-
if (iret != (int)Lang.cn)
-
{
-
iret = 1033;
-
}
-
-
if (Thread.CurrentThread.CurrentCulture.LCID != iret)
-
{
-
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(iret);
-
}
-
return (Lang)iret;
-
}
-
-
}
-
set {
-
-
Context.Response.Cookies[“language”].Value = ((int)value).ToString();
-
Context.Response.Cookies[“language”].Expires = DateTime.MaxValue;
-
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo((int)value);
-
}
-
}
-
///根据语言不同自动重定向到不同文件夹
-
protected void Application_BeginRequest(object sender, EventArgs e)
-
{
-
-
if((getlanguage==Lang.cn)&&(Request.Path.EndsWith(“.aspx”)))
-
{
-
string newurl = “/cn” + Request.Path;
-
if (System.IO.File.Exists(Request.MapPath(newurl)))
-
{
-
Context.RewritePath(“/cn”+Request.Url.PathAndQuery);
-
}
-
}
-
-
-
}
-
- 创建一个cn文件夹存放中文文件,cn文件夹中的目录结构和主文件夹的目录结构相同,将所有.aspx文件复制到这个文件夹中,修改.aspx文件中的CodeFile属性,使其可以和英文页面使用相同的代码 。这样做的好处是可以直观的编辑不同语言的页面,并且可以使中英文的页面呈现完全不同的面貌
- 在主目录下创建一个App_GlobalResources文件夹,在里面放置不同语言的全局资源文件,如xxx.resx,xxx.zh-cn.resx…。为了方便调用这些资源,编写了一个函数
C#:
-
static public string getResourceString(string name)
-
{
-
try
-
{
-
return (string)HttpContext.GetGlobalResourceObject(“xxx”, name);
-
}
-
catch
-
{
-
return “Resource error!”;
-
}
-
}
在所有需要在代码里面动态处理的文字都使用getResourceString来显示
-
经过这一番处理后,就可以很方便的对原有网站进行翻译了。我们可以按不同的语言随意的设计自己的版面,又不用同时维护多套代码,并且保持了系统的整洁。只有一个全局的resx文件(我讨厌一堆的资源文件)。可惜.net还不能支持从代码里直接生成资源文件,如果可以那样就更妙了。
也许这不是最好的国际化方法,但至少在我感觉效率还不错,这就足够了。






