ASP.NET CULTURA COMPLETA COM A INICIALIZECULTULE
-
18-09-2019 - |
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.
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:
- No início da sessão, armazeno a cultura derivada do domínio em uma variável de sessão
- 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á.