2010-07-09 68 views
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" /> 

我有一个为Default.aspx.resx用的键/值文件:lblDisplay.text /英文 和Default.aspx.es.resx用的键/值文件: lblDisplay.text/Espanol

我无法让我的标签文本从“英文”更改为“西班牙文”。任何人看到我做错了什么?

回答

11

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

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

+0

+1优秀的答案,只是打败了我:) – armannvg 2010-07-09 00:58:21

+0

嗨,谢谢你的回答。你给我的链接中的示例程序就是我一直在寻找的。尽管我有一些问题,但仍然无法让我的网站正常工作。示例程序根据从列表框中选择的语言来设置文化。我无法弄清楚使用linkbutton时代码应该是什么。因为我没有使用列表框,点击我的链接按钮应该在英文和西班牙文之间切换。应该在我的linkbutton的点击事件中有一些代码? – 2010-07-09 04:05:13

+0

您需要在按钮的单击事件中使用代码,并且您需要在某个地方保留一个变量,如可用于了解当前切换的会话。 – 2010-07-09 18:04:24

8
  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); 
    
    } 
    
  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(); 
    } 
    
  3. 请注意,我用

    //Response.Redirect(Request.Url.OriginalString); 
    

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

+3

+1“සිංහල(ශ්රීලංකා)”:) – 2013-11-20 07:51:06