程序中的多语言(对比asp.net2.0)

软件要广泛的发布,就要支持多语言。

使用.net的resX文件来实现多语言是一个不错的选择。

这是使用Web中使用多语言的一个例子。

效果是:在国内访问的话,看到这样的显示:
UserLanguages : zh-cn
based on ur cultrue, u should see this word : 汉字:
如果在英语国家访问的话
UserLanguages : en-us
based on ur cultrue, u should see this word : English Word 

Web项目名叫ChineseWordTest。建立了两个资源文件,分别是MultiLang.en-us.resx和MultiLang.zh-cn.resx。资源文件里面都有一个键值对Test_Word。en-us的那个里面值是“English Word”,MultiLang.zh-cn.resx里面写的是“汉字:”。
下边是代码
---------------------------------code------------------------
public class WebForm1 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Label Label2;
protected System.Web.UI.WebControls.Label Label1;
 
private void Page_Load(object sender, System.EventArgs e)
{
string clientCultrue=Request.UserLanguages[0].ToString();
this.Label1.Text="UserLanguages : "+ clientCultrue;

try
{
//使用客户的浏览器的默认语言来确定显示
Thread.CurrentThread.CurrentUICulture=new System.Globalization.CultureInfo(clientCultrue);
}
catch
{
//如果失败,就使用默认语言展示给用户。
    Thread.CurrentThread.CurrentUICulture=new System.Globalization.CultureInfo("en-us");
}
           

Assembly assembly;
ResourceManager rmManager;

assembly = Assembly.GetExecutingAssembly();
rmManager = new ResourceManager("ChineseWordTest.MultiLang", assembly);

string str = rmManager.GetString("Test_Word");
this.Label2.Text="based on ur cultrue, u should see this word : "+str;
}
------------------------------------end code-------------------------


注意:
1:资源文件的命名规则。一定是这样子的了:xxx.文化代码.resx.比如MultiLang.zh-cn.resx。MultiLang是资源名,zh-cn是简体中文的代码。
2:资源文件好像只能放在根目录下,一旦放进一个文件夹里,好像就出错。
3:引用时: new ResourceManager("ChineseWordTest.MultiLang", assembly);  格式是:项目名.资源名。 ChineseWordTest是Web项目的名称,MultiLang使资源文件的名称。  至于该调用那一个资源文件,是汉语还是英语,由Thread.CurrentThread.CurrentUICulture来确定,只要指定了这个Cultrue,framework就会自动调用你的不同文化的资源文件了。
4:如果成功的话,编译成功后会在bin文件夹下创建en-us,zh-cn文件夹。发布时不要改变这个结构。
5:我是使用的string clientCultrue=Request.UserLanguages[0].ToString();来获取用户的语言代码的。根据发送请求的用户的浏览器的语言列表的第一个来确定。如果失败,证明还没有这个语言包,那么就使用默认语言包(英语)。


以上是在vs2003下测试通过。
如果要在asp.net2.0中使用,则稍有不同。

这时放在Global.asax中的代码。

--------------------------------------code----------------------
    void Session_Start(Object sender, EventArgs e)
    {
        // Code that runs when a new session is started
        //new a resource manager for each session
        string clientCultrue = Request.UserLanguages[0].ToString();
     
        try
        {
            //使用客户的浏览器的默认语言来确定显示
            Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(clientCultrue);
        }
        catch
        {
            //如果失败,就使用默认语言展示给用户。
            Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-us");
        }

        ResourceManager rmManager;

        rmManager = Resources.MultiLang.ResourceManager;     

        Session.Add("ResourceManager", rmManager);
       
       
    }
-------------------------end code-----------------------
注意:
1:asp.net2.0中应该如此使用:
  rmManager = Resources.MultiLang.ResourceManager;
  而不是在Assembly中取:
  assembly = Assembly.GetExecutingAssembly();
  rmManager = new ResourceManager("ChineseWordTest.MultiLang", assembly);
2:2.0中创建资源文件时,必须创建一个MultiLang.resx,然后再创建MultiLang.en-us.resx和MultiLang.zh-cn.resx。如果没有MultiLang.resx,则系统就找不到该资源。MultiLang.resx里面可以什么都不写,但是必须得有。
3:访问资源可以Resources.MultiLang.Key。
  有了资源文件(必须是如此命名的:xxx.resx。而不能是xxx.语言.resx)之后, 代码文件中写入Resources.就可以自动找到该资源名称xxx。继而可以直接引用资源中的key。


文章来源:http://blog.aspcool.com/dlwang2002/archive/2005/06/20/2462.html
原文地址:https://www.cnblogs.com/flyfish/p/349539.html