Переключение языка в приложении ASP.NET с использованием главной страницы - PullRequest
4 голосов
/ 02 июня 2011

Я использую Visual Studio 2008 и ASP.NET для создания веб-приложения.Большинство моих веб-страниц основаны на одной главной странице.Эта главная страница содержит три ссылки кнопок, которые действуют как переключатели языка;обработчики событий Click выглядят так:

protected void lbuLangEN_Click(object sender, EventArgs e)
{
    this.SwitchLanguage(string.Empty);
}  

protected void lbuLangES_Click(object sender, EventArgs e)
{
    this.SwitchLanguage("es");
}

Тогда у меня есть свой закрытый метод SwitchLanguage:

private void SwitchLanguage(string culture)
{
    Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(culture);
    Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(culture);
}

Насколько я понимаю, этого должно быть достаточно, чтобыстраницы, основанные на моей главной странице, имеют локализованное поведение, то есть получают ресурсы из соответствующего локального файла resx в соответствии с культурой.Тем не менее, это не работает.Они всегда отображаются на испанском языке, который является языком по умолчанию для моего браузера.Я установил несколько сообщений трассировки в точках входа и выхода SwitchLanguage, и, очевидно, текущий поток не меняет информацию о культуре: каждый раз, когда вызывается SwitchLanguage, культура текущего потока - "es-ES", независимо отчто мой код только что установил.

Есть ли проблемы с моим кодом или с подходом, который я использую?Спасибо.

Ответы [ 3 ]

10 голосов
/ 02 июня 2011

Вы можете использовать OnAcquireRequestState в Global.asax, чтобы изменить культуру. Он вызывается сразу после загрузки сеанса, но перед любым событием главной страницы.

Таким образом, в обработчике события кнопки вы устанавливаете переменную сеанса в соответствии с желаемой текущей культурой. Затем вы перенаправляете на текущую страницу. Событие Global.asax может затем выбрать новый язык непосредственно перед загрузкой главной страницы:

protected void OnAcquireRequestState(object sender, EventArgs e)
{
    string cultureName = "en-GB";
    if (HttpContext.Current.Session != null &&
        HttpContext.Current.Session["CultureName"] is string)
        cultureName = HttpContext.Current.Session["CultureName"];

    if (Thread.CurrentThread.CurrentUICulture.Name == cultureName) 
        return;

    Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultureName);
    Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture;
}
2 голосов
/ 30 июня 2015

Для любого тела, использующего решение @Andomar, метод должен иметь имя Application_AcquireRequestState, расположенное в коде Global.ascx (например, ниже Application_Start), и обработчики событий не требуется присоединять.(Если вы сделаете что-то кроме этого, вы можете столкнуться с NullReferenceException даже без кода в теле метода! Или ваш метод не будет работать вообще)Так что код будет примерно таким:

void Application_AcquireRequestState(object sender, EventArgs e)
{
    string cultureName = "en-GB";
    if (HttpContext.Current.Session != null &&
        HttpContext.Current.Session["CultureName"] is string)
        cultureName = HttpContext.Current.Session["CultureName"];

    if (Thread.CurrentThread.CurrentUICulture.Name == cultureName) 
        return;

    Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultureName);
    Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture;
}
0 голосов
/ 02 июня 2011

переопределить метод InitializeCulture на уровне страницы, чтобы установить UICulture

...