Изменить CulturalInfo после нажатия кнопки - PullRequest
0 голосов
/ 04 апреля 2010

У меня есть многоязычный сайт 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 = "Culture:" + System.Globalization.CultureInfo.CurrentCulture.ToString ();

проблема в том, что когда я запускаю это приложение и нажимаю, например, Английская кнопка (по умолчанию польский), эффекта нет. если я щелкну по нему второй раз или нажму F5, изменения вступят в силу, и на ярлыке культура отобразится как en-US. Цаме случается, если я хочу изменить язык обратно на польский (он работает после второго щелчка (или одного щелчка и обновления)).

Что я делаю не так?

Ответы [ 4 ]

2 голосов
/ 04 апреля 2010

Я подозреваю, что проблема может быть в использовании вами Server.Transfer в событии нажатия кнопки. Вы пытались использовать Response.Redirect вместо этого?

0 голосов
/ 16 июля 2011

Используйте

Response.Redirect("Default.aspx");

вместо

Server.Transfer(Request.Path); 
0 голосов
/ 04 апреля 2010

Почему вы используете куки? Почему не сессия? Я думаю, что сессия удобнее, и у вас не будет этой проблемы. Когда InitializeCulture () запускается после Server.Transfer, это все тот же запрос, но без английского Cookie. Вы добавили его в Response, но Response все еще здесь, на стороне сервера.
Относительно вашего решения по интернационализации. Обычно рекомендуется включать локаль в URL. Рассмотрим английского пользователя, который нажал на кнопку «Английский» и затем отправил ссылку другу. Его друг открывает ссылку и не может понять ни слова. У него нет Английского Cookie, поэтому он просматривает польскую страницу.
Надеюсь, это поможет

0 голосов
/ 04 апреля 2010

Когда вы используете Server.Transfer, все происходит внутри одного и того же веб-запроса - это просто перенаправление обработки внутреннего сервера. Попробуйте использовать Response.Redirect вместо Server.Transfer. Это заставит браузер клиента вызвать другой запрос, после чего файл cookie будет отправлен на веб-сервер.

...