ASP.NET Web应用程序避免因区域性语言更改而重新加载页面

本文关键字:新加载 加载 应用程序 Web NET 语言 区域性 ASP | 更新日期: 2024-09-27 04:50:39

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

它实际上是有效的,但仍然存在一个问题:点击语言更改按钮后,cookie和文化性会改变,但页面的内容不会改变。我总是需要重新加载整个页面才能获得正确的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";
        }

有人能告诉我哪里搞错了吗?有更好的方法吗??

ASP.NET Web应用程序避免因区域性语言更改而重新加载页面

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

您的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上设置正确的文化信息。但是,如果您较早地手动处理字符串,则可能会导致问题。

InitializeCulture()在页面周期中的Click事件之前被调用,所以您设置cookie太晚了。如果要获取控件的值,可以从InitializeCulture()方法内的Request.Form中读取它们。

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