Pergunta

Eu tenho um site com três domínios .com, .de e .it

Cada domínio precisa padrão para o idioma/cultura local do país. Eu criei uma página base e adicionei uma inicialização

  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

Isto é bom. O problema ocorre agora porque também queremos três botões de seleção de idiomas na página inicial para que o usuário possa substituir o idioma do domínio.

Então, no meu padrão.asp.vb, temos três eventos de botões 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

Mas é claro que a iniciativa de iniciativa substitui qualquer seleção de botões que tenha sido feita. Existe alguma maneira de a cultura inicial verificar se ocorreu um clique de botão e, se pular a rotina?

Qualquer conselho seria muito apreciado, obrigado.

Foi útil?

Solução

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

Outras dicas

Minha solução é dividir isso em duas partes:

  1. No início da sessão, armazeno a cultura derivada do domínio em uma variável de sessão
  2. Na InitializeCulture, pego o valor da variável da sessão para inicializar a cultura

Para alterar o idioma, só preciso alterar a variável da sessão e reinicializar a página.

Se o usuário selecionar o idioma, você poderá redirecionar para o domínio apropriado? Se o usuário mudar seu idioma para "italiano", você poderá responder. Depois disso, o seu método de "inicialização" cuidará.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top