Dieser Artikel beginnt mit den Grundkonzepten der Ressourcenglobalisierung und -lokalisierung in Asp.net und erläutert die Schritte und Methoden zum Erreichen der Globalisierung und Lokalisierung in Asp.net1.1 und Asp.net2.0.
eins. Grundbegriffe
1. Warum Ressourcen lokalisieren?
Unsere Website kann von Menschen aus verschiedenen Ländern und Regionen auf der ganzen Welt angesehen werden, und die Menschen in jedem Land und jeder Region haben ihre eigene Sprache und ihre eigenen kulturellen Merkmale. Nehmen wir als Beispiel unser großes Mutterland. In China wird vereinfachtes Chinesisch verwendet, während in Hongkong, Macao und Taiwan traditionelles Chinesisch verwendet wird. Darüber hinaus verfügt jedes Land über unterschiedliche Ausdrucksformate für Währung, Zahlen, Kalender und andere Informationen. Unser Land verwendet hauptsächlich das Jahres-, Monats- und Tagesformat, während die Vereinigten Staaten das Monats-, Tages- und Jahresformat verwenden. Da es viele Unterschiede wie diesen gibt, werde ich nicht viele Beispiele nennen. Um unseren Website-Besuchern ein besseres Benutzererlebnis zu bieten, sollten wir eine globale Lösung bereitstellen. Solange der Benutzer seine Sprache und Region auswählt, zeigt die Website die Seiteninformationen entsprechend seiner Sprache und seinen kulturellen Gewohnheiten an Lokalisierung.
2. Kultur, feste Kultur, unspezifische Kultur und kulturspezifische
Kulturnamen folgen dem RFC 1766-Standard und haben das Format „ Kulturname Kulturkennung Sprache – Land zh-CN 0x0804 Chinesisch – China zh-TW 0x0404 Chinesisch – Taiwan zh-CHS 0x0004 Vereinfachtes Chinesisch zh-CHT 0x
7C |
04 | Traditionelles Chinesisch | |
en | 0x0009 | Englisch |
en - US | 0x0409 | Englisch - Vereinigte Staaten | en
- | GB | 0x0809 |
uz | - | UZ - Cyrl |
0x0843 | Usbekisch (Kyrillisch) - Usbekistan uz-UZ-Latn 0x0443 | Usbekisch (Lateinisch) - Usbekistan |
Feste Kulturen gibt es nicht kultursensibel. Sie können die leere Zeichenfolge ("") verwenden, um eine feste Kultur anhand des Namens oder der Kulturkennung 0x007F anzugeben. Invariante Kulturinstanzen werden durch die InvariantCulture-Eigenschaft der CultureInfo-Klasse dargestellt. Feste Kulturen werden nur mit der englischen Sprache in Verbindung gebracht, nicht mit irgendeinem Land. Es kann in fast jeder Methode im „globalisierten“ Namespace verwendet werden, die Kultur erfordert. Wenn Ihr Programm Zeichenfolgenvergleiche oder Operationen zur Änderung der Groß- und Kleinschreibung durchführt, sollte es eine InvariantCulture verwenden, um sicherzustellen, dass das Verhalten unabhängig von der vom System festgelegten Kultur gemäß der festen Kultur der englischen Sprache erfolgt, die durch die InvariantCulture dargestellt wird. Eine feste Kultur darf jedoch nur von Prozessen verwendet werden, die kulturunabhängige Ergebnisse erfordern (z. B. Systemdienste); andernfalls können die erzielten Ergebnisse sprachlich falsch oder kulturell unangemessen sein. Beispiel: CultureInfo Invc = New CultureInfo("");
CultureInfo Invc = CultureInfo.InvariantCulture; Diese beiden Codezeilen haben den gleichen Effekt, der Zweck besteht darin, eine invariante Kulturinstanz zu erhalten.
Beispielsweise möchten Sie jetzt die Methode dateTime.ToString() auf einer DateTime-Instanz dateTime ausführen. Diese Methode verwendet tatsächlich die CurrentCulture Ihres aktuellen Threads als Standardkultur und konvertiert die Datumsinstanz basierend auf dieser Kultur in die entsprechende Zeichenfolgenform. Wenn wir es also zu diesem Zeitpunkt nicht benötigen, um die ToString-Operation gemäß der Thread- oder Systemkultur auszuführen, sollten wir diese Methode dateTime.ToString("G", CultureInfo.InvariantCulture) oder dateTime.ToString("G" verwenden. , DateTimeFormatInfo.InvariantInfo).
Eine neutrale Kultur ist eine Kultur, die mit einer Sprache, aber nicht mit einem Land verbunden ist. Eine bestimmte Kultur ist mit einer bestimmten Sprache und einem bestimmten Land verbunden. „en“ ist beispielsweise eine neutrale Kultur, während „en-US“ eine spezifische Kultur ist. Beachten Sie, dass „zh-CHS“ (vereinfachtes Chinesisch) und „zh-CHT“ (traditionelles Chinesisch) kulturneutral sind.
Kulturen haben eine hierarchische Struktur, das heißt, das übergeordnete Element einer bestimmten Kultur ist eine unspezifische Kultur und das übergeordnete Element einer unspezifischen Kultur ist eine invariante Kultur. Die Parent-Eigenschaft der CultureInfo-Klasse gibt die unspezifische Kultur zurück, die der spezifischen Kultur zugeordnet ist. Wenn die kulturspezifische Ressource nicht auf dem System vorhanden ist oder aus anderen Gründen nicht verfügbar ist, wird die nicht kulturspezifische Ressource verwendet. Wenn die nicht kulturspezifische Ressource ebenfalls nicht verfügbar ist, wird die in der Hauptassembly eingebettete Ressource verwendet.
3. Implementieren Sie allgemeine Typen, Eigenschaften und Methoden für die Lokalisierung.
Die CultureInfo-Klasse stellt Informationen über eine bestimmte Kultur dar, einschließlich des Namens der Kultur, des verwendeten Schriftsystems und des verwendeten Kalenders sowie Informationen über allgemeine Vorgänge (z. B. Formatierung von Datumsangaben usw.). Sortierzeichenfolgen). Bietet Zugriff auf kulturspezifische Informationsobjekte. Im Allgemeinen gibt es zwei Möglichkeiten, die CultureInfo-Klasse zu instanziieren:
CultureInfo culture = CultureInfo. CreateSpecificCulture (Name);
CultureInfo culture = new CultureInfo(name);
Der Unterschied zwischen den beiden besteht darin, dass Sie mit der ersten Methode nur eine CultureInfo-Instanz einer festen Kultur oder einer bestimmten Kultur erstellen können. Wenn „name“ eine leere Zeichenfolge ist, wird eine feste Kulturinstanz erstellt. Wenn „name“ eine nicht spezifische Kultur ist, wird eine mit „name“ verknüpfte standardmäßige kulturspezifische CultureInfo-Instanz erstellt. Die zweite Methode besteht darin, eine CultureInfo-Instanz der namentlich angegebenen Kultur zu erstellen, die fest, unspezifisch oder kulturspezifisch sein kann.
Die CurrentCulture-Eigenschaft der Thread-Klasse wird verwendet, um die Kultur des aktuellen Threads abzurufen oder festzulegen. Es muss auf eine bestimmte Kultur eingestellt sein. Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); Wenn Thread.CurrentThread.CurrentCulture = new CultureInfo("en");
Die CurrentUICulture-Eigenschaft der Thread-Klasse wird verwendet, um die aktuelle Kultur abzurufen oder festzulegen, die vom Ressourcenmanager verwendet wird, um zur Laufzeit kulturspezifische Ressourcen zu finden. Der Ressourcenmanager kann hier der ResourceManger-Klasse zugeordnet werden.
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
Die ResourceManger-Klasse kann kulturspezifische Ressourcen finden, Ersatzressourcen bereitstellen, wenn lokalisierte Ressourcen nicht vorhanden sind, und die Ressourcenserialisierung unterstützen. Der häufig verwendete ResourceManager-Konstruktor ist public ResourceManager(string, Assembly). Seine Bedeutung besteht darin, eine neue Instanz der ResourceManager-Klasse zu initialisieren, die unter Verwendung des angegebenen Stammnamens nach Ressourcendateien aus der angegebenen Assembly sucht. Der sogenannte Root-Name ist beispielsweise der Root-Name einer Ressourcendatei mit dem Namen „MyResource.en-US.resources“ und lautet „MyResource“. Dem Ausdruck des Stammnamens kann ein Namespace hinzugefügt werden, z. B. „MyWebSite.Resource.UserFolder.MyResource“. Die Assembly kann die Assembly sein, in der sich die Seite befindet, die die Ressourcendatei aufrufen muss, z. B. typeof(MyPage).Assembly. Die GetString-Methode der ResourceManager-Klasse wird verwendet, um den Wert des angegebenen Schlüssels in der Ressourcendatei abzurufen. Beispiel: Wenn die CurrentUICulture-Eigenschaft des Threads festgelegt wurde, befolgen Sie die folgende Methode.
ResourceManager rm = new ResourceManager("items", Assembly.GetExecutingAssembly());
String str = rm.GetString("welcome");
Wenn Sie Ressourcen gemäß der angegebenen Kultur erhalten möchten, schreiben Sie wie folgt:
ResourceManager rm = new ResourceManager("items", Assembly.GetExecutingAssembly());
CultureInfo ci = Thread.CurrentThread.CurrentCulture;
String str = rm.GetString("welcome",ci);
zwei. Um die Ressourcenlokalisierung in Asp.net1.1 zu implementieren,
sollten Sie zunächst einen Ressourcenordner im Website-Projekt WebTest erstellen und in diesem Ordner Ressourcendateien speichern, die für das gesamte Projekt gelten. Beispielsweise haben wir die folgenden drei Ressourcendateien erstellt: MyResource.en.resx, MyResource.en-US.resx, MyResource.zh-CN.res. In jeder Ressourcendatei gibt es zwei Schlüssel-Wert-Paare. Die Schlüsselwerte sind Status und Adresse. Rufen Sie die Ressourcendatei auf der Seite MyPage.aspx auf, die die Ressourcendatei verwenden muss, wie unten gezeigt:
Thread.CurrentThread.CurrentCulture= CultureInfo.CreateSpecificCulture("zh-CN");
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
ResourceManager rm = new ResourceManager("WebTest.Resource.MyResource", typeof (MyPage).Assembly);
Label1.Text = rm.GetString("State");
Label2.Text = rm.GetString("Address");
Nun, zu diesem Zeitpunkt zeigen Label1 und Label2 „Status“ und „Adresse“ gemäß den Vorschriften in der Datei MyResource.zh-CN.resx an. Das Obige ist die grundlegendste und einfachste Lokalisierungsmethode. Hier sind einige Probleme verborgen. Lassen Sie uns diese Methode einzeln lösen und optimieren.
1. Die Standardkultur des Benutzers erhalten Sie
über die Einstellungen in der Option „Eigenschaften“ -> „Sprache“ des Benutzers. Nehmen Sie die oberste Sprache als Standardsprache des Benutzers.
CultureInfo cultureInfo = CultureInfo.CreateSpecificCulture(Request.UserLanguages[0]);
Thread.CurrentThread.CurrentCulture = cultureInfo;
Thread.CurrentThread.CurrentUICulture = cultureInfo;
Im Allgemeinen sind CurrentCulture und CurrentUICulture auf die gleiche Kultur eingestellt. Sie können beispielsweise auch angeben, dass CurrentCulture en-US und CurrentUICulture zh-CN ist. Dies hat zur Folge, dass die Währung, das Datum und andere Informationen auf der Seite im amerikanischen Englischformat angezeigt werden und der Ressourcenmanager den Inhalt erhält, der aus der Ressourcendatei aus MyResource.zh-CN.resx abgerufen werden muss Datei.
Wenn die Seite Ihrer Website den Benutzern keine Funktion zum Auswählen einer Sprache bietet, wird sie standardmäßig gemäß der vom Browser des Benutzers festgelegten Kultur angezeigt. Sie können also den obigen Code in die Methode Application_BeginRequest von Global.asax einfügen. cs-Datei. Auf diese Weise legt unser Programm jedes Mal, wenn ein Benutzer eine Anfrage für eine Seite stellt, zunächst die Kultur fest.
2. Merken Sie sich die Gebietsschemaeinstellungen des Benutzers.
Die Gebietsschemaeinstellungen oder -auswahlen des Browsers können während der Sitzung gespeichert werden. Dieser Vorgang kann jedoch nicht in der Methode „Application_BeginRequest“ in der Datei „Global.asax.cs“ ausgeführt werden, da die Sitzung zu diesem Zeitpunkt noch nicht verfügbar ist. Wenn Ihre Site Benutzern nicht die Möglichkeit bietet, eine Sprache auszuwählen, müssen Sie sich die regionalen Einstellungen des Benutzers nicht merken. Legen Sie sie einfach wie oben beschrieben in der Methode „Application_BeginRequest“ fest Leistung. Dadurch werden vor allem Konflikte vermieden, bei denen der Nutzer mittendrin plötzlich die Spracheinstellungen im Browser ändert, die Website dem Nutzer aber trotzdem den Seiteninhalt entsprechend der in der Sitzung hinterlegten Kultur anzeigt.
Wenn Sie die Funktion erwähnt haben, den Benutzer eine Sprache auswählen zu lassen, müssen Sie natürlich eine Sitzung im Seitenprogramm verwenden, um die Kulturauswahl des Benutzers aufzuzeichnen. Da für jede Anfrage des Clients an das Serversegment das Serversegment einen neuen Thread zur Verarbeitung und Antwort öffnet. Wenn sich Ihr Programm die Auswahl des Kunden nicht merkt, antwortet es nur mit der Standardkultur.
3. Wie findet der Ressourcenmanager die entsprechenden Ressourcendateien für eine bestimmte Kultur?
Beim Ausführen einer Wertoperation, also beim Ausführen der GetString-Methode der ResourceManager-Klasse, sucht der Ressourcenmanager gemäß der CurrentUICulture-Eigenschaft des aktuellen Threads nach der entsprechenden Ressourcendatei. Es gibt mehrere Situationen:
(1) Wenn die Kultur, die der aktuellen CurrentUICulture entspricht, beispielsweise „en-US“ ist, prüfen Sie zunächst, ob „MyResource.en-US.resx“ vorhanden ist. Wenn sie nicht vorhanden ist, prüfen Sie, ob sie vorhanden ist ob MyResource.en.resx existiert.
(2) Die der aktuellen CurrentUICulture entsprechende Kultur ist beispielsweise en. Da es sich bei en um eine unspezifische Kultur handelt, ermitteln Sie zunächst, ob die Ressourcendatei MyResource.en-US.resx der spezifischen Kultur en-US zugeordnet ist Wenn dies der Fall ist, rufen Sie den Wert ab. Wenn er nicht vorhanden ist, prüfen Sie, ob MyResource.en.resx vorhanden ist.
(3) Wenn die Kultur, die der aktuellen CurrentUICulture entspricht, beispielsweise „en-GB“ ist, suchen Sie zunächst nach der Ressourcendatei „MyResource.en-GB.resx“. Wenn sie nicht vorhanden ist, prüfen Sie, ob „MyResource.en.resx“ vorhanden ist Wenn es nicht vorhanden ist, prüfen Sie, ob die mit en verknüpfte Ressourcendatei MyResource.en-US.resx vorhanden ist zu diesem Zeitpunkt vorhanden sind, aber MyResource.en-CA vorhanden ist, löst das Programm immer noch eine Ausnahme aus, dass die entsprechende Ressourcendatei nicht gefunden werden kann.
Daher können wir zusammenfassen, dass der Ressourcenmanager, wenn der aktuelle Thread CurrentUICulture einer bestimmten Kultur entspricht, zunächst nach der Ressourcendatei sucht, die dieser bestimmten Kultur entspricht Es wurde noch nicht gefunden. Suchen Sie es und suchen Sie dann nach der Ressourcendatei der Standardkultur, die mit ihrer nicht kulturspezifischen Zuordnung verknüpft ist. Wenn die CurrentUICulture des aktuellen Threads einer nicht spezifischen Kultur entspricht, prüft der Ressourcenmanager zunächst, ob die der nicht spezifischen Kultur entsprechende Standardressourcendatei vorhanden ist -spezifische Kultur ist vorhanden und löst eine Ausnahme aus, wenn sie ebenfalls nicht vorhanden ist.
4. Wie geht man mit Kulturen um, die keine Lokalisierungsunterstützung bieten?
Wenn die Site keine entsprechenden Ressourcendateien zur Unterstützung der Standardkultur des Benutzers bereitstellt, muss die CurrentUICulture des aktuellen Threads in die Standardkultur Ihrer Site konvertiert werden, z. B. en-US oder zh-CN. Es gibt zwei Möglichkeiten zur Konvertierung:
Wenn Sie Request.UserLanguages[0] erhalten, vergleichen Sie es mit der unterstützten Kulturvoreinstellung in der Konfigurationsdatei. Wenn bestätigt wird, dass es nicht unterstützt wird, legen Sie CurrentUICulture sofort als Standardkultur fest.
Die zweite besteht darin, die Try-Catch-Struktur zu verwenden, um die MissingManifestResourceException-Ausnahme zu erfassen, wenn Sie die GetString-Methode von ResourceManager verwenden, um den Wert abzurufen. Setzen Sie in der Ausnahmebehandlung zunächst CurrentUICulture auf die Standardkultur und verwenden Sie dann GetString, um den Wert erneut abzurufen.
5. Legen Sie die Standardkultur und uiCulture der Site über Web.config
Wie oben gezeigt: Es wird angegeben, dass die Standardkultur der Site en-US ist (hier muss es sich um eine bestimmte Kultur handeln) und die uiCulture zh-CN ist.
Natürlich können Sie es auch Seite für Seite im Page-Tag jeder Seite festlegen: <@Page Culture="zh-CN" UICulture="en">. Unabhängig davon, wie web.config hier eingestellt ist, wird die Seite entsprechend den Einstellungen des Seiten-Tags angezeigt.
drei. Implementieren der Ressourcenlokalisierung in Asp.net2.0
Asp.net2.0 bietet vielfältigere Implementierungsmethoden für die Ressourcenlokalisierung. Ich werde mich hier auf die Unterschiede zu Asp.net1.1 konzentrieren.
1. Das Festlegen der Standardkultur und der uiCulture der Site über Web.config
wurde bereits in Asp.net1.1 besprochen, bei dem die Datei web.config zum Festlegen der Site-Kultur verwendet wird. In Asp.net2.0 ist dies jedoch flexibler. Normalerweise möchten Sie, dass alle Seiten Ihrer Website derselben Kultur entsprechen. Weisen Sie den UICulture- und Culture-Attributen (Kultur) des Globalisierungselements in web.config einfach einen Site-weiten „Auto“-Wert zu, wie unten gezeigt. Beachten Sie, dass dieser „Auto“-Wert in Asp.net1.1 nicht akzeptiert wird.
Zusätzlich zu den automatischen Einstellungen können Sie auch die Standardkultur einer Site für Asp.net angeben:
Nachdem die Globalisierung in web.config konfiguriert wurde, muss Ihre Anwendung keinen Code schreiben. CurrentUICulture und CurrentCulture des Threads erhalten die Kultureinstellungen gemäß den im Globalisierungselement festgelegten uiCulture- und Kulturattributwerten. Wenn die Globalisierung nicht konfiguriert ist, werden CurrentUICulture und CurrentCulture des Threads standardmäßig auf en-US eingestellt.
2. Verwenden Sie die Datei Web.config, um die regionale Auswahl des Benutzers zu verfolgen.
In Asp.net1.1 verwenden die Sites, die eine regionale Auswahl bereitstellen, im Allgemeinen Sitzungen, um die Auswahl des Benutzers aufzuzeichnen, sodass jedes Mal, wenn der Benutzer eine Anfrage an die Site stellt, Alle Der Anzeigeinhalt wird entsprechend der vom Benutzer gewählten Kultur lokalisiert. Eine weitere in Asp.net2.0 bereitgestellte Methode besteht darin, die Datei web.config zu verwenden, um die Kulturauswahl des Benutzers zu verfolgen.
Sie können die anonyme Identifizierung der Kultur eines Benutzers unterstützen, indem Sie Ihrer web.config-Datei eine stringbasierte Profileigenschaft namens LanguagePreference hinzufügen. Bitte beachten Sie, dass das Attribut „enabled“ des Elements „anonymousIdentification“ „true“ sein muss, da sonst die anonyme Identifikationsfunktion nicht verfügbar ist.
Im Folgenden erkläre ich, wie das LanguagePreference-Attribut in Asp.net2.0 programmiert wird. Zunächst können Sie eine PageBase-Klasse schreiben, die von System.Web.UI.Page erbt und als Basisklasse für alle Seitenklassen auf der Site dient. Der Zweck ist eigentlich sehr einfach: Einige allgemeine Verarbeitungsprozesse auf jeder Seite zu extrahieren und in die Basisklasse einzufügen, um die Codeduplizierung zu reduzieren und die Wartbarkeit zu verbessern. Schreiben Sie dann den folgenden Code in die PageBase-Klasse: protected override void InitializeCulture()
{
base.InitializeCulture();
string LanguagePreference = ((ProfileCommon)this.Context.Profile).LanguagePreference;
//Wenn der Benutzer diese Website zum ersten Mal besucht und Profile.LanguagePreference leer ist, ermitteln Sie die Spracheinstellung des Browsers des Benutzers
if(string.IsNullOrEmpty(LanguagePreference))
{
if (this.Context.Request.UserLanguages != null)
{
LanguagePreference = this.Context.Request.UserLanguages[0];
((ProfileCommon)Context.Profile).LanguagePreference = LanguagePreference;
}
}
anders
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo(LanguagePreference);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(LanguagePreference);
}
}
Die InitializeCulture-Methode der System.Web.UI.Page-Klasse wurde in Asp.net2.0 neu hinzugefügt. Sie legt Culture und UICulture für den aktuellen Thread fest. Der Seitenlebenszyklus wurde so konzipiert, dass die InitializeCulture-Methode vor dem Init und Load der Seite ausgeführt wird. Verwenden Sie im obigen Code zunächst ((ProfileCommon)this.Context.Profile).LanguagePreference;, um den Wert des aktuellen LanguagePreference-Profilattributs abzurufen und festzustellen, ob es leer ist, d. h. ob die kulturellen Einstellungen für den Benutzer gespeichert wurden . Wenn leer, wird die bevorzugte Kultur des Benutzers aus dem HTTP-Header abgerufen und über ((ProfileCommon)Context.Profile).LanguagePreference = LanguagePreference; gespeichert. Wenn es nicht leer ist, bedeutet dies, dass die Kultureinstellungen des Benutzers gespeichert wurden. Verwenden Sie dann diese Kultur, um die Eigenschaften CurrentUICulture und CurrentCulture des aktuellen Threads festzulegen.
Wenn
{
base.InitializeCulture();
string LanguagePreference = ((ProfileCommon)this.Context.Profile).LanguagePreference;
if(!string.IsNullOrEmpty(LanguagePreference))
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo(LanguagePreference);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(LanguagePreference);
}
anders
{
((ProfileCommon)Context.Profile).LanguagePreference = Thread.CurrentThread.CurrentCulture.Name;
}
}
Wenn die Site eine Funktion bereitstellt, mit der Benutzer eine Kultur auswählen können, z. B. das Platzieren einer Liste mit Sprachauswahlmöglichkeiten auf der Masterseite der Site, kann die vom Benutzer gewählte Kultur durch die folgende Anweisung gespeichert werden:
protected void lstLanguage_SelectedIndexChanged(object sender,EventArgs e)
{
if (lstLanguage.SelectedValue != "Auto") //Die Standardoption ist Auto
{
Profile.LanguagePreference = lstLanguage.SelectedValue;
}
anders
{
Profile.LanguagePreference = null;
}
Response.Redirect(Request.Url.AbsolutePath);
}
Achten Sie auf die Codezeile Response.Redirect(Request.Url.AbsolutePath); da der Ereignisbehandlungscode nach Page_Load ausgeführt wird, müssen Sie einen Umleitungsvorgang durchführen, wenn Sie möchten, dass sich die Seite schnell ändert.
Wenn Ressourcendateien zum Erstellen globaler Ressourcendateien auf der Site
in Asp.net2.0
verwendet werden, erstellt VS.Net2005 automatisch einen App_GlobalResources-Ordner speziell zum Speichern globaler Ressourcendateien.Die sogenannte globale Ressourcendatei ist eine Ressourcendatei, die von mehreren Seitendateien oder Masterseiten auf der Site verwendet wird. Angenommen, wir erstellen Dateien mit den Namen MyResource.resx und MyResource.zh-cn.resx. Im Programm können wir den folgenden Code verwenden, um den Wert in der Ressourcendatei abzurufen: this.lblCountry.Text = Resources.MyResource.Country;
Dabei ist „Land“ der Schlüssel in der Ressourcendatei. Offensichtlich ist dies viel einfacher als das Abrufen von Werten aus Ressourcendateien in Asp.net 1.1.
Hier sind zwei Probleme zu beachten: Erstens müssen beim Erstellen einer Gruppe von Ressourcendateien mit demselben Stammnamen Dateien ohne Kulturidentifizierung erstellt werden, z. B. MyResource.resx, andere wie MyResource.en-gb. zh-cn.resx werden nach Bedarf erstellt. Wenn MyResource.resx nicht erstellt wird und nur MyResource.zh-cn.resx erstellt wird, wird MyResource im obigen Code nicht unter dem Ressourcen-Namespace angezeigt, sodass die Kompilierung des obigen Codes nicht erfolgreich sein kann. MyResource.resx sollte den Inhalt der Standardsprache der Site speichern, falls eine lokalisierte Ressourcendatei, die der CurrentUICulture des aktuellen Threads entspricht, nicht gefunden werden kann oder der entsprechende Schlüsselwert nicht in der lokalisierten Ressourcendatei gefunden werden kann. Asp.net basiert auf dem Schlüssel in der Datei MyResource.resx. Wenn der Länderschlüssel nicht in MyResource.resx, aber der Länderschlüssel in MyResource.zh-cn.resx vorhanden ist, meldet der obige Code ebenfalls einen Fehler beim Kompilieren. Zweitens meldet Asp.net keine Ausnahme, wenn es die lokalisierte Ressource im entsprechenden Bereich nicht finden kann. Es ruft den Wert automatisch aus der Datei MyResource.resx ab, ändert jedoch nicht die CurrentUICulture des aktuellen Threads.
Beim Erstellen lokaler Ressourcendateien auf der Site erstellt VS.Net2005 automatisch einen App_LocalResources-Ordner speziell zum Speichern lokaler Ressourcendateien. Die sogenannten lokalen Ressourcendateien sind Ressourcendateien, die für eine einzelne Seitendatei auf der Site verwendet werden. Die Benennungsmethode lautet im Allgemeinen Default.aspx.resx und Default.aspx.zh-cn.resx. Jetzt füge ich drei Schlüssel Language, lblNavigation.Text und lblNavigation.ForeColor in der Standardressourcendatei hinzu. Darunter habe ich Blau für lblNavigation.ForeColor von Default.aspx.resx und Rot für lblNavigation.ForeColor von Default.aspx.zh-cn.resx festgelegt. Es gibt zwei Möglichkeiten, Inhalte aus lokalen Ressourcendateien in Default.aspx in der Auslagerungsdatei abzurufen:
(1).
(2).
Achten Sie bei der ersten Methode darauf, das $-Symbol zu verwenden. Die Verwendung der zweiten Methode ist flexibler und ermöglicht das gleichzeitige Festlegen von Werten für viele Eigenschaften des Steuerelements.
Hier sind noch Probleme zu beachten: Die standardmäßige lokale Ressourcendatei der Seite muss erstellt werden, z. B. ist Default.aspx.resx erforderlich und Default.aspx.zh-cn.resx ist erforderlich. Wenn Sie keine standardmäßige lokale Ressourcendatei erstellen, sondern lokale Ressourcendateien auf der Seite verwenden, tritt bei Verwendung der ersten Methode zum Binden ein Kompilierungsfehler auf. Bei Verwendung der zweiten Methode zum Binden tritt kein Kompilierungsfehler auf Es tritt ein Fehler auf, aber die Einstellungen dieser Eigenschaften haben keine Auswirkung, als wären sie nicht geschrieben worden.
4. Lokalisierte Bilder anzeigen
Die Anzeige lokalisierter Bilder ist ebenfalls eine neue Funktion von Asp.net2.0. In Asp.net2.0 sind Ressourcendateien nicht auf Kombinationen von Schlüssel-Wert-Paaren vom Typ Zeichenfolge beschränkt. Es können mehrere Dateitypen gespeichert werden. Verwenden Sie diese Funktion, um Bilder zu lokalisieren. Tatsächlich sind die sogenannten lokalisierten Bilder nichts anderes als das Platzieren von Bildern, die für verschiedene Regionen vorbereitet wurden, in verschiedenen lokalisierten Ressourcendateien. Fügen Sie beispielsweise LitwareSlogan.jpg in MyResource.resx und LitwareSlogan.cn.jpg in MyResource.zh-cn.resx ein.
Wenn globale Ressourcendateien verschiedener lokalisierter Versionen lokalisierte Versionen von Bilddateien enthalten, können Sie eine Handlerdatei mit dem Namen MyLocalImage.ashx anpassen, um sie basierend auf der Spracheinstellung des Benutzers bedingt zu laden. Der Code lautet wie folgt: Anzeigen.
Aufrufende Methode auf der Seite:
So schreiben Sie den Handler von MyLocalImage.ashx:
öffentliche Klasse MyLocalImage: IHttpHandler
{
public void ProcessRequest (HttpContext-Kontext)
{
context.Response.ContentType = "image/png";
string LanaguageReference = ((ProfileCommon)context.Profile).LanguagePreference;
if (!string.IsNullOrEmpty(LanaguageReference))
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo(LanaguageReference);
}
Bitmap bm = Resources.Litware.LitwareSlogan;
MemoryStream image = new MemoryStream();
bm.Save(image,ImageFormat.Png);
context.Response.BinaryWrite(image.GetBuffer());
}
}
Die in MyLocalImage.ashx definierte benutzerdefinierte Handlerklasse verwendet eine ähnliche Logik, die Sie zuvor in der benutzerdefinierten InitializeCulture-Methode gesehen haben, um die CurrentUICulture-Einstellungen für den aktuellen Thread zu initialisieren, bevor die Bilddatei aus der globalen Ressourcendatei abgerufen wird. Sie fragen sich vielleicht, warum die CurrentUICulture des aktuellen Threads in der Basisklasse der Seite festgelegt wurde und hier zurückgesetzt werden muss. Das liegt daran, dass der Thread hier nicht derselbe Thread ist wie der Thread, der in der Basisklasse verarbeitet wird. Nachdem der benutzerdefinierte Handler die CurrentUICulture-Einstellungen korrekt initialisiert hat, kann er über die stark typisierte Ressourcenklasse MyResource.resx auf die Bilddatei zugreifen. Dann müssen nur noch die Bits der Bilddatei in den HTTP-Antwortstrom geschrieben werden.