国际化Asp.net网站的初步实践

2007年03月29日 • 追风逐月 • 分类: 网站建设

最近因为要做公司网站要国际化,接触了一些关于将Asp.net网站国际化的内容。
先从网上搜索了一下,无非是使用资源文件,设置本地配置之类的,感觉并不完全符合自己的要求。
我本人的要求是这样的:

  1. 希望能够统一进行处理,不用维护多套程序
  2. 结构上比较清晰,每种语言使用不同的文件夹分开
  3. 可以可视化的对页面进行修改
  4. 能够自动根据浏览器设置默认的语言
  5. 能够记住用户对语言的选择

为此我是这样设计的

  1. 在web.config的system.web节中设置
    前三项设置编码类型为utf-8,作为一个国际化网站,使用utf-8编码是最普遍也最保险的做法,后面的两项设置本地语言编码,如果不设置为Auto,下面根据浏览器自动识别语言的功能将无法生效
  2. 在Global.asax文件中处理Application_BeginRequest事件,根据浏览器类型自动重定向页面
    C#:

    1. ///定义语言代码
    2. public enum Lang{
    3.         cn=2052,
    4.         en=1033,
    5.    
    6.     }
    7. ///获取语言编码,如果存在cookie则从cookie中取值,否则根据浏览器自动判断
    8. public Lang getlanguage
    9.         {
    10.             get {
    11.                
    12.                HttpCookie cook= Context.Request.Cookies[“language”];
    13.                if (cook == null)
    14.                {
    15.                    if (CultureInfo.CurrentCulture.LCID ==(int)Lang.cn)
    16.                    {
    17.                        return Lang.cn;
    18.  
    19.                      
    20.                    }
    21.                    else
    22.                    {
    23.                        return Lang.en;
    24.                    }
    25.                }
    26.                else
    27.                {
    28.                    int iret=1033;
    29.                    int.TryParse(cook.Value,out iret);
    30.                    if (iret != (int)Lang.cn)
    31.                    {
    32.                        iret = 1033;
    33.                    }
    34.  
    35.                    if (Thread.CurrentThread.CurrentCulture.LCID != iret)
    36.                    {
    37.                        Thread.CurrentThread.CurrentUICulture = new CultureInfo(iret);
    38.                        Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(iret);
    39.                    }
    40.                    return (Lang)iret;
    41.                }
    42.  
    43.             }
    44.             set {
    45.  
    46.                 Context.Response.Cookies[“language”].Value = ((int)value).ToString();
    47.                 Context.Response.Cookies[“language”].Expires = DateTime.MaxValue;
    48.                 Thread.CurrentThread.CurrentUICulture = new CultureInfo((int)value);
    49.                 Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo((int)value);
    50.          }
    51.         }
    52. ///根据语言不同自动重定向到不同文件夹
    53. protected void Application_BeginRequest(object sender, EventArgs e)
    54.     {
    55.        
    56.         if((getlanguage==Lang.cn)&&(Request.Path.EndsWith(“.aspx”)))
    57.         {   
    58.         string newurl = “/cn” + Request.Path;
    59.         if (System.IO.File.Exists(Request.MapPath(newurl)))
    60.         {
    61.             Context.RewritePath(“/cn”+Request.Url.PathAndQuery);
    62.         }
    63.         }
    64.        
    65.        
    66.     }
  3. 创建一个cn文件夹存放中文文件,cn文件夹中的目录结构和主文件夹的目录结构相同,将所有.aspx文件复制到这个文件夹中,修改.aspx文件中的CodeFile属性,使其可以和英文页面使用相同的代码 。这样做的好处是可以直观的编辑不同语言的页面,并且可以使中英文的页面呈现完全不同的面貌
  4. 在主目录下创建一个App_GlobalResources文件夹,在里面放置不同语言的全局资源文件,如xxx.resx,xxx.zh-cn.resx…。为了方便调用这些资源,编写了一个函数
    C#:

    1. static public string getResourceString(string name)
    2.         {
    3.             try
    4.             {
    5.                 return (string)HttpContext.GetGlobalResourceObject(“xxx”, name);
    6.             }
    7.             catch
    8.             {
    9.                 return “Resource error!”;
    10.             }
    11.         }

    在所有需要在代码里面动态处理的文字都使用getResourceString来显示

经过这一番处理后,就可以很方便的对原有网站进行翻译了。我们可以按不同的语言随意的设计自己的版面,又不用同时维护多套代码,并且保持了系统的整洁。只有一个全局的resx文件(我讨厌一堆的资源文件)。可惜.net还不能支持从代码里直接生成资源文件,如果可以那样就更妙了。
也许这不是最好的国际化方法,但至少在我感觉效率还不错,这就足够了。

标签: ,
本文链接:http://chyni.com/site-builder/%e5%9b%bd%e9%99%85%e5%8c%96aspnet%e7%bd%91%e7%ab%99%e7%9a%84%e5%88%9d%e6%ad%a5%e5%ae%9e%e8%b7%b5.html

你可能还喜欢



发表你的意见

追风逐月

提供网络赚钱、网赚经验、网赚工具、SEO、国外主机信息
订阅追风逐月博客feed
订阅到google 订阅到哪吒
订阅到鲜果 订阅到抓虾
* 更多订阅本站方式请看 订阅帮助