ASP.NET:以编程方式更改网站的文化

400*_*cat 5 asp.net

我正在尝试以编程方式设置我的网站文化,因此当用户单击按钮时,他们可以将页面上的文本从英语更改为西班牙语.这是我的代码:

protected void btnChangeLanguage(object sender, EventArgs e)
{
    Thread.CurrentThread.CurrentCulture = new CultureInfo("es");
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("es);
}

<asp:Label ID="lblDisplay" runat="server" meta:ResourceKey="lblDisplay" />

<asp:Button ID="btnChangeLanguage" runat="server" Text="Change Language"
        OnClick="btnChangeLanguage_Click" />
Run Code Online (Sandbox Code Playgroud)

我有一个Default.aspx.resx文件,其键/值为:lblDisplay.text/English和Default.aspx.es.resx文件,其键/值为:lblDisplay.text/Espanol

我无法将我的Label文本从"英语"更改为"西班牙语".有谁看到我做错了什么?

Joe*_*orn 12

ASP.Net线程用于一个请求的生命周期,而不是用户的整个会话.更糟糕的是,有时框架会回收相同的线程来处理额外的请求,而不是将其返回到池中并获得一个新的请求(这不是一个大问题,因为下一个请求将再次初始化文化,但仍然).

相反,您需要覆盖页面的InitializeCulture()方法.有关更多详细信息,请参阅此链接:http:
//msdn.microsoft.com/en-us/library/bz9tc508.aspx


小智 9

  1. 创建名为"CurrentUI"的Session变量.并在链接按钮事件上更改它,例如:

    在这里,每种语言都有两个链接按钮

    protected void EnglishLinkButton_Click(object sender, EventArgs e) {
       Session["CurrentUI"] = "en-US";
       Response.Redirect(Request.Url.OriginalString);
    
    }
    
    protected void SinhalaLinkButton_Click(object sender, EventArgs e) {
       // ????? (????? ????)
       Session["CurrentUI"] = "si-LK";
       Response.Redirect(Request.Url.OriginalString);
    
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 现在,您需要覆盖页面基类中的InitializeCulture()

     protected override void InitializeCulture() {
         if (Session["CurrentUI"] != null) {
             String selectedLanguage = (string)Session["CurrentUI"];
             UICulture = selectedLanguage;
             Culture = selectedLanguage;
    
             Thread.CurrentThread.CurrentCulture =
                 CultureInfo.CreateSpecificCulture(selectedLanguage);
             Thread.CurrentThread.CurrentUICulture = new
                 CultureInfo(selectedLanguage);
         }
    
         base.InitializeCulture();
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 请注意,我用过

    //Response.Redirect(Request.Url.OriginalString);
    
    Run Code Online (Sandbox Code Playgroud)

    将文化键分配到会话后,以创建返回页面的第二个帖子.因为InitializeCulture()在事件之前发生,并且更改仅适用于下一个请求.