ASP.NET: изменение культуры сайта программно - PullRequest
5 голосов
/ 09 июля 2010

Я пытаюсь настроить культуру моего сайта программно, поэтому, когда пользователь нажимает кнопку, он может изменить текст на странице с английского на испанский. вот мой код:

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

Я не могу изменить текст моего ярлыка с "английского" на "испанский". кто-нибудь видит, что я делаю не так?

Ответы [ 2 ]

12 голосов
/ 09 июля 2010

Потоки ASP.Net используются в течение всего времени одного запроса, а не всего сеанса пользователя. Хуже того, иногда фреймворк будет перерабатывать один и тот же поток для обработки дополнительных запросов, а не возвращать его в пул и получать новый (это не так уж и сложно, потому что следующий запрос снова инициализирует культуру, но все же).

Вместо этого вам необходимо переопределить метод InitializeCulture () для вашей страницы. Смотрите эту ссылку для более подробной информации:
http://msdn.microsoft.com/en-us/library/bz9tc508.aspx

9 голосов
/ 20 мая 2012
  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 () происходит до события, и изменение будет применимо только к следующему запросу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...