我正在尝试以编程方式设置我的网站文化,因此当用户点击按钮时,他们可以将页面上的文本从英语更改为西班牙语。这是我的代码:
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
我无法将我的Label文本从“英语”更改为“西班牙语”。有谁看到我做错了什么?
答案 0 :(得分:12)
ASP.Net线程用于一个请求的生命周期,而不是用户的整个会话。更糟糕的是,有时框架会回收相同的线程来处理额外的请求,而不是将其返回到池中并获得一个新的请求(这不是一个大问题,因为下一个请求将再次初始化文化,但仍然)。
相反,您需要覆盖页面的InitializeCulture()方法。有关详细信息,请参阅此链接:
http://msdn.microsoft.com/en-us/library/bz9tc508.aspx
答案 1 :(得分:9)
创建名为“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);
}
现在您需要覆盖页面基类
中的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();
}
请注意,我使用了
//Response.Redirect(Request.Url.OriginalString);
将文化键分配到会话后,以创建返回页面的第二个帖子。 因为InitializeCulture()在事件发生之前发生,并且更改仅适用于下一个请求。