#vb.net #.net-4.0 #internationalization #globalization
#vb.net #.net-4.0 #интернационализация #глобализация
Вопрос:
Кажется, у меня проблема с изменением System.Globalization.CultureInfo.CurrentUICulture
значения в соответствии с пользовательскими предпочтениями (веб-приложение .NET 4.0).
В моем веб-приложении у меня есть две кнопки. Один для греческого языка и один для английского языка. При нажатии кнопок на сервер отправляется запрос с просьбой изменить предпочитаемый пользователем язык. Для греческого я отправляю «el-GR», а для английского — «en-US».
На стороне сервера я использую следующий фрагмент кода для изменения текущего CultureInfo
.
Dim languageChosen As String = Me.Context.Request.Params("langId")
' Code for CultureInfo
Dim cultureInfo As System.Globalization.CultureInfo
cultureInfo = New System.Globalization.CultureInfo(languageChosen)
' Code for Setting the CurrentCulture
Thread.CurrentThread.CurrentCulture = cultureInfo
Thread.CurrentThread.CurrentUICulture = cultureInfo
Response.Redirect("Default.aspx", True)
Теперь, при следующих запросах к серверу, я проверяю текущую культуру, получая значение из CultureInfo.CurrentUICulture.TwoLetterISOLanguageName
, и это всегда показывает «en», даже если я пользователь выбрал «el-GR».
В чем может быть проблема?
Должен ли я сохранять предпочитаемый пользователем язык между запросами, например, в сеансе? А затем установите для него значение System.Thread.CurrentThread.CurrentCulture
в начале каждой страницы?
Ответ №1:
Я нашел решение проблемы.
1) Мне пришлось сохранить пользовательские настройки в сеансе. 2) Теперь при каждой загрузке страницы я устанавливаю, Thread.CurrentThread.CurrentCulture
после создания cultureInfo
, на основе сохраненных в сеансе языковых предпочтений пользователя. Суть кода, с помощью которого я это делаю, заключается в переопределении InitializeCulture. Другими словами, мои страницы переопределяют InitializeCulture следующим образом:
Protected Overrides Sub InitializeCulture()
Dim l_languageChosen As String = Session("language")
' Code for CultureInfo
Dim cultureInfo As System.Globalization.CultureInfo
cultureInfo = New System.Globalization.CultureInfo(l_languageChosen)
' Code for Setting the CurrentCulture
Thread.CurrentThread.CurrentCulture = cultureInfo
Thread.CurrentThread.CurrentUICulture = cultureInfo
MyBase.InitializeCulture()
End Sub
3) Чтобы избежать переопределения этого метода всеми моими страницами и избежать повторения кода, я создал суперкласс «MyWebPage», который выполняет переопределение (и который наследуется от System.Web.UI.Page
), а затем я сделал так, чтобы все мои страницы наследовали от MyWebPage.
4) Конечно, серверный код, который отвечал на запросы пользователя на изменение языка, изменился соответствующим образом, чтобы сохранить языковые предпочтения в сеансе, после установки потока.Текущий поток.CurrentCulture и CurrentUICulture
5) Я также установил globalization
тег в моем web.config
следующим образом:
<globalization
uiCulture="auto"
culture="auto"
enableClientBasedCulture="true" />
Это позволило мне определить языковые предпочтения пользователя, установленные в его / ее браузере, чтобы я мог изначально установить предпочтительный язык.
6) В моем global.asax
я сохраняю языковые предпочтения, определенные в браузере, следующим образом:
Session.Add("language", System.Globalization.CultureInfo.CurrentUICulture.TwoLetterISOLanguageName)
Теперь все работает, как ожидалось.