ASP.NET Impostazione Cultura con InitializeCulture
-
18-09-2019 - |
Domanda
Ho un sito web con tre domini .com, .de e .it
Ogni dominio ha bisogno per difetto alla lingua locale / cultura del paese. Ho creato una pagina di base e ha aggiunto un InitializeCulture
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
Questo va bene. Il problema ora si verifica perché vogliamo anche tre pulsanti di scelta della lingua nella home page in modo che l'utente può ignorare la lingua del dominio.
Quindi sul mio Default.asp.vb abbiamo tre eventi dei pulsanti come questo ...
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
Ma naturalmente l'InititalizeCulture poi ignora qualsiasi pulsante di selezione è stato fatto. C'è un modo che l'InitialCulture può controllare se si è verificato un clic del pulsante e se è così saltare la routine?
Qualche consiglio sarebbe molto apprezzato, grazie.
Soluzione
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
Altri suggerimenti
La mia soluzione è quella di dividere in due parti:
- All'avvio della sessione devo conservare la cultura derivato dal dominio in una sessione variabile
- In InitializeCulture Colgo il valore della variabile di sessione per inizializzare la cultura
Per modificare la lingua non mi resta che cambiare la variabile di sessione e reinizializzare la pagina.
Se l'utente seleziona la lingua, si può solo reindirizzare al dominio appropriato? Se l'utente cambia il suo linguaggio a "italiano", lui "www.domain.it" si potrebbe Response.Redirect. Dopo che il metodo "InitializeCulture" si prenderà cura.