0

我有多语言的asp.net 网站。有一个母版页和default.aspx。

我在母版页中放了两个按钮 - 当我想将语言更改为英语时单击一个,第二个用于波兰语。当然,我想在点击这些按钮后更改语言(所有更改都应该自动出现在页面上)

这是两者的代码:

protected void EnglishButton_Click(object sender, ImageClickEventArgs e)
{
    string selectedLanguage = "en-US";
    //Sets the cookie that is to be used by InitializeCulture() in content page
    HttpCookie cookie = new HttpCookie("CultureInfo");
    cookie.Value = selectedLanguage;
    Response.Cookies.Add(cookie);
    Server.Transfer(Request.Path);
}

protected void PolishButton_Click(object sender, ImageClickEventArgs e)
{
    string selectedLanguage = "pl-PL";
    //Sets the cookie that is to be used by InitializeCulture() in content page
    HttpCookie cookie = new HttpCookie("CultureInfo");
    cookie.Value = selectedLanguage;
    Response.Cookies.Add(cookie);
    Server.Transfer(Request.Path);
}

在 default.aspx.cs 我有 InitializeCulture():

protected override void InitializeCulture()
{
    HttpCookie cookie = Request.Cookies["CultureInfo"];

    // if there is some value in cookie
    if (cookie != null && cookie.Value != null)
    {
        Thread.CurrentThread.CurrentCulture =
            CultureInfo.CreateSpecificCulture(cookie.Value);
        Thread.CurrentThread.CurrentUICulture = new
            CultureInfo(cookie.Value);
    }
    else // if none value has been sent by cookie, set default language
    {
        Thread.CurrentThread.CurrentCulture =
            CultureInfo.CreateSpecificCulture("pl-PL");
        Thread.CurrentThread.CurrentUICulture = new
            CultureInfo("pl-PL");
    }

    base.InitializeCulture();
}

我添加了资源文件,并在一个标签中显示了实际文化:

Welcome.Text = "文化:" + System.Globalization.CultureInfo.CurrentCulture.ToString();

问题是当我运行这个应用程序并单击例如英语按钮(默认语言是波兰语)时,没有效果。如果我第二次单击它或按 F5,则会应用更改,并且在标签中文化显示为 en-US。如果我想将语言改回波兰语(它在第二次单击(或单击并刷新)后起作用),也会发生相同的情况。

我究竟做错了什么?

4

4 回答 4

2

我怀疑问题可能在于您在按钮单击事件中使用 Server.Transfer 。您是否尝试过使用 Response.Redirect 代替?

于 2010-04-03T21:38:17.693 回答
0

当您使用 Server.Transfer 时,所有事情都发生在同一个 Web 请求中 - 它只是一个内部服务器处理重定向。尝试使用 Response.Redirect 而不是 Server.Transfer。这将强制客户端浏览器调用另一个请求,然后将 cookie 发送到 Web 服务器。

于 2010-04-03T21:37:52.863 回答
0

您为什么使用 Cookie?为什么不是会话?我认为 Session 更方便,你不会有这个问题。当 InitializeCulture() 在 Server.Transfer 之后启动时,它仍然是相同的请求,仍然没有英文 Cookie。你把它放在响应中,但响应仍然在这里,在服务器端。
关于您的国际化解决方案。通常建议在 URL 中嵌入语言环境。考虑一个英语用户,他点击了英语按钮,然后向朋友发送了一个链接。他的朋友打开链接,却一个字也听不懂。他没有英文 Cookie,所以他正在查看波兰语页面。
希望这可以帮助

于 2010-04-03T22:09:48.717 回答
0

采用

Response.Redirect("Default.aspx");

代替

Server.Transfer(Request.Path); 
于 2011-07-16T19:06:00.593 回答