zoukankan      html  css  js  c++  java
  • 基于ASP.NET实现全球化

    本文转自http://www.cnblogs.com/tonyjoule/archive/2004/05/14/9504.html

        因为项目的关系,这两天一直在研究ASP.NET的全球化问题。我知道,在JAVA体系中有专门的I18N处理方案,.NET中不可能会没有。所以,到网上查了查资料,经过一番“苦斗”,略有小成。感觉网上目前还没有非常完整的解决方案(也可能是我没有发现),遂花了点时间总结一下经验教训,希望与大家共享之。若有什么不足之处,请各位多多指教。
        本文中,将以在VS.Net2002中创建一个实际项目的方式来描述在ASP.NET中实现全球化的基本步骤和需要注意的地方。
        第一步,我们创建一个名为TestRM的Web Application。这个项目将缺省包含
          - AssemblyInfo.cs
          - TestRM.csproj
          - TestRM.csproj.webinfo
          - TestRM.sln
          - TestRM.suo
          - TestRM.vsdisco
          - WebForm1.aspx(包含aspx.cs和aspx.resx)
          - Global.asax(包含asax.cs和asax.resx)
          - Web.Config
        第二步,需要为项目创建若干不同语种的资源文件。在.Net中,资源文件的扩展名是.resx,此文件是基本于XML的,VS.NET提供了非常方便的资源文件编辑工具(个人感觉很象XmlSpy),这儿就不多说了。在此,以简体中文(zh-cn)和美国英语(en-us)为例。通过“项目->添加新项->资源文件”向项目中分别添加名为string.en-us.resx和string.zh-cn.resx的资源文件,并在string.en-us.resx中添加一条记录,内容是name:String001;value:Welcome,在string.zh-cn.resx中添加一条记录name:String001;value:欢迎。其XML文件的结构如下:
    <?xml version="1.0" encoding="utf-8" ?>
    <root>
       ...
     <data name="String001">
      <value>欢迎</value>
     </data>
       ...
    </root>
        这儿有一点需要说明,如果你不是希望通过修改配置文件动态的切换语种,而是希望通过设置Windows的“区域设置”功能来切换语种的话,请跳过第三步。(有这种需求吗???-_-)
        这样,当此项目被编译后,在bin目录下将为出现en-us和zh-cn两个子目录,其中分别有一个dll文件。名为TestRM.resources.dll。
        第三步,修改Global.asax和Web.Config文件以实现动态切换语种。
            首先,我们需要在Global.asax的Application_BeginRequest事件中添加如下代码:  
      protected void Application_BeginRequest(Object sender, EventArgs e)
      {
           Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(ConfigurationSettings.AppSettings["DefaultCulture"]);
      }
            这是最简单的应用,当然,你可以将一些配置项存储到Cookie之中。
            然后,在Web.Config中添加如下代码:
       <appSettings>
             <add key="DefaultCulture" value="zh-cn" />
       </appSettings>
            注意,appSettings元素与system.web属于同一层次。
        最后,在WebForm1的Page_Load事件中加入如下代码:
    public class WebForm1 : System.Web.UI.Page
    {
      private void Page_Load(object sender, System.EventArgs e)
      {
         WebForm1 form1 = new WebForm1();
         ResourceManager resManager = new ResourceManager(form1.GetType().Namespace + ".string", form1.GetType().Assembly);
         System.Globalization.CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentCulture;

         Response.Write(resManager.GetString("String001",ci));
      }

      ...
    }
        请大家注意上面这段代码中有下划线的这行代码,在VS.NET 2002中,如果使用this.GetType().Namespace和this.GetType().Assembly.FullName得到竟然是ASP和6fqpc_hh, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null,获得的Assembly显然是随机产生。但在c#的类文件和WinForm中是正常的,不清楚是什么原因。结果当然不用说,肯定是找不到相应的资源文件的。
        此外,需要强调的一点是,这儿使用了form1.GetType().Namespace + ".string",如果资源文件不是被放置在项目根目录下,而是被放在某个子目录下时,请注意修改项目的缺省命名空间。因为,资源文件被编译后,在项目的资源文件TestRM.resources.dll的Manifest(用ILDASM查看)中会有如下一行,.mresource public 'TestRM.string.zh-CN.resources'或.mresource public 'TestRM.string.en-US.resources'。其基本的构成规则是项目缺省命名空间+资源文件所在目录名+资源文件名[+语种],如果一种项目的资源文件不分语种,如:我们定义了一个名为string.resx的资源文件,此时,编译项目后在bin目录下将不再会产生诸如zh-CN和en-US之类的子目录,资源文件将被直接嵌入项目的Assembly中。同时,在项目的Assembly的Manifest中会有如下一行.mresource public 'TestRM.string.resources'。所以,如果资源文件不是放在项目的根目录,且缺省命名空间没有被改变的话,在试图使用resManager.GetString时将会被提示“无法访问任何语种的资源文件”,原因就是上面所说的。
        基本上,上述的这些就是我在研究基于ASP.NET实现全球化时的一些心得,希望能对一些朋友有所帮助。

    链接:asp.net 2.0多语言网站解决方案http://www.cnblogs.com/luluping/archive/2009/04/10/1433136.html

    asp.net 2.0中的App_GlobalResources可以用来解决本地化的问题,程序会根据浏览器的语言首选项自动判断显示出本地化的界面。

    首先在App_GlobalResources新建resx资源文件。如:

    不同语言的resx中项目应该具有相同的名称:

    中文资源项

    英文资源项

    完了以后就可以使用这些名值对了,

    <asp:Literal ID="Literal1" runat="server" Text="<%$ Resources:lang,userinfo%>" />

    或者

    <%=Resources.lang.userinfo%>

    至此你可以更换浏览器的语言首选项来看看效果了。

    接下去的问题是怎么通过程序本身的方式来更换语言项。

    1. 可以往web.config中增加<globalization culture="en-US" uiCulture="en-US"/>来改变程序默认使用的语言项。

    2.可以往global全局应用程序中增加如下代码

    void Application_BeginRequest(Object sender, EventArgs e)
        {
            try
            {
                if (Request.Cookies["lang"] != null)
                {
                    System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture(Request.Cookies["lang"].Value.ToString());
                    System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(Request.Cookies["lang"].Value.ToString());
                }
            }
            catch (Exception)
            { }
        }

    即可通过设置变换cookie值来达到即时切换语言的目的,轻松的实现了程序的多语言。

    下载测试:[Global.rar (8.36 kb).rar]

  • 相关阅读:
    Android开发 使用 adb logcat 显示 Android 日志
    【嵌入式开发】向开发板中烧写Linux系统-型号S3C6410
    C语言 结构体相关 函数 指针 数组
    C语言 命令行参数 函数指针 gdb调试
    C语言 指针数组 多维数组
    Ubuntu 基础操作 基础命令 热键 man手册使用 关机 重启等命令使用
    C语言 内存分配 地址 指针 数组 参数 实例解析
    CRT 环境变量注意事项
    hadoop 输出文件 key val 分隔符
    com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: Too many connections
  • 原文地址:https://www.cnblogs.com/JuneZhang/p/1849909.html
Copyright © 2011-2022 走看看