ASP.NET 2.0 bietet Funktionen zur Konvertierung mehrerer Sprachen und Designs mit mehreren Stilen. Die beiden Implementierungsformen sind relativ ähnlich und werden daher gemeinsam erläutert.
1. Sprachumschalter Mehrsprachigkeitsumschaltung Im Schnellstart-Tutorial wird erläutert, wie die vom Benutzer ausgewählte Sprache gespeichert und angewendet wird. Im Allgemeinen wird eine DropDownList verwendet, um die unterstützten Sprachen zur Auswahl anzuzeigen. Sie wird normalerweise auf der Masterseite platziert und die vom Benutzer ausgewählte Sprache wird hier verwendet. Es kann auch in einer Cookie-Sitzung oder einem Querystring gespeichert werden. Überschreiben Sie die InitializeCulture-Methode auf der Seite, um die zuvor vom Benutzer ausgewählte Sprache zu verwenden. Da der Vorgang zum Festlegen der Sprache (hier das SelectedIndexChanged-Ereignis) nach der InitializeCulture-Zeit erfolgt, ist eine Umleitung erforderlich, um diese Seite neu zu laden und das InitializeCulture-Ereignis auszulösen, damit die aktuelle Seite sofort nach Abschluss des Einstellungsvorgangs wirksam wird. Nachfolgend finden Sie einen Teil des Codes im Schnellstart. Achten Sie auf den roten Teil. Da sich hinter einigen Seitenadressen möglicherweise ein Abfragestring befindet, denke ich persönlich, dass der rote Codeteil am besten durch Response.Redirect(Request.Url.PathAndQuery); ersetzt wird.
protected void DropDownLanguage_SelectedIndexChanged(object sender, EventArgs e)
{
string SelectedLanguage = DropDownLanguage.SelectedValue.ToString();
//Ausgewählte Benutzersprache im Profil speichern
Profile.SetPropertyValue("PreferredCulture", SelectedLanguage);
//Neuinitialisierung der Seite erzwingen, um InitializeCulture() auszulösen;
Response.Redirect(Request.Url.LocalPath);
}
protected override void InitializeCulture()
{
// Virtuelle Methode InitializeCulture() überschreiben, um zu prüfen, ob das Profil eine Benutzerspracheneinstellung enthält
string UserCulture = Profile.GetPropertyValue("PreferredCulture").ToString();
if (UserCulture != "")
{
// Es gibt eine Benutzerspracheneinstellung im Profil: Wechseln Sie dorthin
Thread.CurrentThread.CurrentUICulture = new CultureInfo(UserCulture);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(UserCulture);
}
}
Um die Codeduplizierung zu reduzieren, wird eine Kundenbasisseitenklasse im Allgemeinen angepasst, sodass sie die Page-Klasse erbt und dann die InitializeCulture-Methode in der angepassten Seitenbasisklasse neu initialisiert. Abschließend erben Sie jede Ihrer Seiten von Ihrer benutzerdefinierten Seitenbasisklasse. Auf diese Weise müssen Sie die InitializeCulture-Methode nicht auf jeder Seite überschreiben.
Die obige Methode ist jedoch immer noch nicht sehr zufriedenstellend, da Sie jedes Mal, wenn Sie eine Seite hinzufügen, die Postleitzahl ändern müssen, um die Basisklasse der benutzerdefinierten Seite zu erben.
Wir haben festgestellt, dass in der InitializeCulture-Methode tatsächlich nur die Culture und UICulture des aktuellen Threads geändert werden. Können diese beiden Attribute also in einem globalen Ereignis, beispielsweise einem Anwendungsereignis, geändert werden? Ich habe dies vor langer Zeit versucht und die Details von InitializeCulture implementiert, wenn das BeginRequest-Ereignis von Application ausgelöst wird, ähnlich dem folgenden Code:
void Application_BeginRequest(object sender, EventArgs e)
{
string lang = string.Empty;//Standard zur invarianten Kultur
lang = Profile.PreferredCulture;
if (string.IsNullOrEmpty(lang))
{
lang = string.Empty;
}
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
}
Beachten Sie, dass der rote Teil durch andere Methoden ersetzt werden sollte, da das Profilobjekt während der Auslösephase von beginrequest noch nicht von asp.net erstellt wurde. Kann durch Cookies ersetzt werden.
Ich erinnere mich, dass es nach dem Festlegen der Sprache nicht funktionierte. Damals dachte ich, dass es in einem globalen Ereignis behandelt werden würde und möglicherweise später überschrieben würde, sodass es möglicherweise nicht funktionierte. Daher wurde zu diesem Zeitpunkt noch die Methode InitializeCulture verwendet. Heute habe ich jemanden im asp.net-Forum gesehen, der dies getan hat.
void Application_BeginRequest(Object sender, EventArgs e){
string lang = string.Empty;//Standard zur invarianten Kultur
HttpCookie cookie = Request.Cookies["DropDownName"]
if (cookie != null && cookie.Value != null)
lang = Request.Form[cookie.Value];
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
}
Daher dachte ich, dass zu diesem Zeitpunkt möglicherweise etwas nicht richtig eingestellt war, und versuchte es erneut. Es stellte sich heraus, dass dies der Grund für den Seitenkopfbefehl <%@ Page UICulture="auto" Culture="auto" %> war Kulturen werden auf der Seite festgelegt. Sie überschreiben die globalen Einstellungen. Nach dem Entfernen wurden die globalen Einstellungen wirksam. Es scheint, dass die Kultureinstellungen auf der Seite die globalen Einstellungen überschreiben und die Einstellungen der InitializeCulture-Methode auf der Seite (genauer gesagt alle Steuerelemente, die diese Methode unterstützen) die Seiteneinstellungen überschreiben. Tatsächlich ist die Standardimplementierung der InitializeCulture-Methode in der Page-Klasse leer, sodass nach dem Entfernen der Seitenkopfanweisung UICulture="auto" Culture="auto" die Einstellungen in Global wirksam werden.
Wenn Sie außerdem Profile (wie ich) wirklich zum Speichern der Benutzerauswahl verwenden möchten, können Sie dies nicht in der Beginrequest-Phase verarbeiten. Ich handhabe es, wenn das PreRequestHandlerExecute-Ereignis ausgelöst wird:
void Application_PreRequestHandlerExecute(object sender, EventArgs e)
{
string lang = string.Empty;//Standard zur invarianten Kultur
lang = Profile.PreferredCulture;
if (string.IsNullOrEmpty(lang))
{
lang = string.Empty;
}
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
}
Zu diesem Zeitpunkt wurde das Profil erstellt, sodass es verwendet werden kann.
2. Themenumschalter für mehrere Stile
In diesem Artikel geht es um den Themenwechsel, und ich denke, dass die Form dem Sprachwechsel sehr ähnlich ist. Er verwendet HttpModule. Ich denke, es kann direkt unter der entsprechenden Ereignisverarbeitung und -verteilung in der Datei Global.asax platziert werden. Es verwendet Cookies zur Speicherung. Da es bereitgestellt wird, sollte die Verwendung von Profilen kein Problem darstellen.
Quelle: Starke Anhäufung und blühender BLOG