ASP.NET -Kultur mit der Initializecultur einstellen
-
18-09-2019 - |
Frage
Ich habe eine Website mit drei Domains .com, .de und .it
Jede Domäne muss standardmäßig in die Landessprache/Kultur des Landes standhalten. Ich habe eine Basisseite erstellt und eine Initializecultur hinzugefügt
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
Das ist in Ordnung. Das Problem tritt nun auf, da wir auch drei Sprachauswahlschaltflächen auf der Startseite wünschen, damit der Benutzer die Domänensprache überschreiben kann.
Also auf meinem Standard.
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
Aber natürlich überschreibt die Inititalizekultur die Auswahl der Taste, die getroffen wurde. Gibt es eine Möglichkeit, wie die InitialCulture prüfen kann, ob ein Schaltflächenklick aufgetreten ist und ob dies die Routine überspringt?
Jeder Rat wäre sehr geschätzt, danke.
Lösung
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
Andere Tipps
Meine Lösung ist es, dies in zwei Teile zu teilen:
- Bei der Sitzungsstart speichere ich die von der Domain abgeleitete Kultur in einer Sitzungsvariablen
- In der Initializeculture nehme ich den Wert aus der Sitzungsvariablen, um die Kultur zu initialisieren
Um die Sprache zu ändern, muss ich nur die Sitzungsvariable ändern und die Seite neu initialisieren.
Wenn der Benutzer die Sprache auswählt, können Sie sich nur auf die entsprechende Domäne umführen? Wenn der Benutzer seine Sprache auf "Italienisch" umstellt, können Sie ihn auf "www.domain.it" reagieren. Danach kümmert sich Ihre "Initializeculture" -Methode.