0

我正在尝试制作多语言 ASP.NET Web 应用程序。在应用程序开始时,我正在设置 cookie,然后我调用 InitializeCulture() 来启动文化。页面的数据存储在全局资源中,并写入 aspx 文件,如下所示:<%$ Resources:Main,lang %>

它实际上可以工作,但仍然存在一个问题:单击语言更改按钮后,coockie 和文化会发生变化,但页面内容不会发生变化。我总是要重新加载整个页面才能获得正确的内容global.resx

在 PageLoad 我调用这个:

            setLanguageCookie(); //<- TO SET A COOKIE IF NULL
            InitializeCulture();

InitializeCulture() 看起来像这样:

        string sprache = "en-US";

        if (Request.Cookies["sprache"] != null)
        { 
            sprache = Request.Cookies["sprache"].Value;
        }

        Thread.CurrentThread.CurrentCulture =
          CultureInfo.GetCultureInfo(sprache);

        Thread.CurrentThread.CurrentUICulture =
          CultureInfo.GetCultureInfo(sprache);

有 3 个语言按钮。他们背后的代码如下所示:

protected void lang_en_Click(object sender, EventArgs e)
        {
            Request.Cookies["sprache"] = "en-US";
            Session["Language"] = "en";
        }

有人可以提示我在哪里弄错了吗?O有没有更好的方法来做到这一点?

4

3 回答 3

0

如果您查看以下链接,它将向您展示如何以编程方式检索资源文​​件内容http://msdn.microsoft.com/en-us/library/ms227982.aspx但它仅在您的控件数量有限时才有用从资源文件初始化。

于 2012-08-02T08:39:35.563 回答
0

在页面循环中的 Click 事件之前调用 InitializeCulture() - 因此您设置 cookie 为时已晚。如果要获取控件的值,可以从Request.Form中的 InitializeCulture() 方法中读取它们。

例如,如果您使用名为 mydropdown 的下拉列表来更改语言,则可以从 Request.Form["mydropdown"] 中获取其值。或者,在您设置的示例中(每种语言都有一个按钮),您可以在隐藏字段(在客户端)内设置语言值,然后从 Form 对象中读取其值。

于 2013-01-14T21:26:24.167 回答
0

您的 lang_en_Click 事件在页面加载后处理,因此您必须再次调用 CurrentTread.CurrentCulture 集合:

protected void lang_en_Click(object sender, EventArgs e)
{
     Request.Cookies["sprache"] = "en-US";     
     Session["Language"] = "en";         
     Thread.CurrentThread.CurrentCulture =   CultureInfo.GetCultureInfo("en-US");   
     Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");     
} 

在处理 lang_en_Click 之前,您必须检查是否没有设置任何语言字符串。通常我会在页面的 Pre_Render 上设置正确的文化信息。但是,如果您更早地手动处理字符串,则可能会导致问题。

于 2012-08-02T08:45:24.040 回答