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.

¿Fue útil?

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:

  1. Al inicio de la sesión, almaceno la cultura derivada del dominio en una variable de sesión
  2. 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á.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top