【问题标题】:ASP.NET: Changing a site's culture programmaticallyASP.NET:以编程方式改变网站的文化
【发布时间】:2012-05-25 03:08:34
【问题描述】:

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

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/English 和一个 Default.aspx.es.resx 文件,其键/值为:lblDisplay.text/Espanol

我无法将标签的文本从“英语”更改为“西班牙语”。有人看到我做错了吗?

【问题讨论】:

    标签: asp.net


    【解决方案1】:

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

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

    【讨论】:

    • 嗨,感谢您的回答。您给我的链接中的示例程序就是我想要的。不过我有一些问题,因为我仍然无法让我的网站正常工作。示例程序根据从列表框中选择的语言设置文化。我不知道使用链接按钮时代码应该是什么。因为我没有使用列表框,所以单击我的链接按钮应该在英语和西班牙语之间切换。我的链接按钮的点击事件中应该有一些代码吗?
    • 您需要在按钮的单击事件中添加代码,并且您需要在会话等某个位置保留一个变量,以便您了解当前切换的内容。
    【解决方案2】:
    1. 创建名为“CurrentUI”的会话变量。并在链接按钮事件上更改它 例如:

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

      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() 发生在事件之前,并且更改仅适用于下一个请求。

    【讨论】:

      猜你喜欢
      • 2023-03-04
      • 2017-07-09
      • 2012-12-04
      • 1970-01-01
      • 2015-09-29
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      • 2013-12-01
      相关资源
      最近更新 更多