ASP.NET Cultura de configuración con InitializeCulture
-
18-09-2019 - |
Pregunta
Tengo un sitio web con tres dominios .com, .de y .it
Cada dominio necesita por defecto al idioma/cultura local del país. He creado una página base y agregué una InicializeCulture
Protected Overrides Sub InitializeCulture()
Dim url As System.Uri = Request.Url
Dim hostname As String = url.Host.ToString()
Dim SelectedLanguage As String
If HttpContext.Current.Profile("PreferredCulture").ToString Is Nothing Then
Select Case hostname
Case "www.domain.de"
SelectedLanguage = "de"
Thread.CurrentThread.CurrentUICulture = New CultureInfo(SelectedLanguage)
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(SelectedLanguage)
Case "www.domain.it"
SelectedLanguage = "it"
Thread.CurrentThread.CurrentUICulture = New CultureInfo(SelectedLanguage)
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(SelectedLanguage)
Case Else
SelectedLanguage = "en"
Thread.CurrentThread.CurrentUICulture = New CultureInfo(SelectedLanguage)
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(SelectedLanguage)
End Select
End If
End Sub
Esto esta bien. El problema ahora ocurre porque también queremos tres botones de selección de idioma en la página de inicio para que el usuario pueda anular el lenguaje de dominio.
Entonces, en mi valor predeterminado.asp.vb tenemos tres eventos de botones como este ...
Protected Sub langEnglish_Click(ByVal sender As Object, ByVal e As System.Web.UI.ImageClickEventArgs) Handles langEnglish.Click
Dim SelectedLanguage As String = "en"
'Save selected user language in profile'
HttpContext.Current.Profile.SetPropertyValue("PreferredCulture", SelectedLanguage)
'Force re-initialization of the page to fire InitializeCulture()'
Context.Server.Transfer(Context.Request.Path)
End Sub
Pero, por supuesto, la Inititalizeculture luego anula cualquier selección de botones. ¿Hay alguna forma de que la cultura inicial pueda verificar si ha ocurrido un clic de botón y, de ser así, omita la rutina?
Cualquier consejo sería muy apreciado, gracias.
Solución
Protected Overrides Sub InitializeCulture()
'Set the PreferredCulture as the SelectedLanguage by default'
Dim SelectedLanguage As String = HttpContext.Current.Profile("PreferredCulture").ToString()
'If there is no PreferredCulture, use these defaults'
If [String].IsNullOrEmpty(SelectedLanguage) = True Then
Select Case Request.Url.Host.ToString()
Case "www.domain.de"
SelectedLanguage = "de"
Case "www.domain.it"
SelectedLanguage = "it"
Case Else
SelectedLanguage = "en"
End Select
End If
'Finally set the culture'
Thread.CurrentThread.CurrentUICulture = New CultureInfo(SelectedLanguage)
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(SelectedLanguage)
End Sub
Otros consejos
Mi solución es dividir esto en dos partes:
- Al inicio de la sesión, almaceno la cultura derivada del dominio en una variable de sesión
- En inicializecultura, tomo el valor de la variable de sesión para inicializar la cultura
Para cambiar el lenguaje, solo tengo que cambiar la variable de sesión y reiniciar la página.
Si el usuario selecciona el idioma, ¿podría redirigir al dominio apropiado? Si el usuario cambia su idioma a "italiano", podría responder. Rediríjalo a "www.domain.it". Después de eso, su método "Initializeculture" se encargará.