ResourceManager und ASP.NET
Der Zugriff auf den ResourceManager kann auch mit Hilfe von ASP.NET über Webanwendungen erfolgen. Der Code für diese kleine Anwendung befindet sich im Unterverzeichnis WorldDocs, und die wichtigen Routinen sind in zwei Dateien enthalten: Global.asax und Default.aspx.
Die erste Benutzeranforderung an die WorldDocs-Anwendung lädt die Datei Global.asax und führt die Application_Onstart-Unterroutine aus. Auch diese Unterroutine verwendet die statische CreateFileBasedResourceManager-Methode zum Erstellen eines Ressourcen-Managers, der die textbasierten Ressourcen aus Dateien und nicht aus Assemblies lädt. (Die vorherigen Beispielprogramme demonstrierten dies ebenfalls.) Dieser ResourceManager wird anschließend der RM-Variable von Application zugewiesen. Jede Benutzeranforderung führt auch die Application_BeginRequest-Unterroutine aus. Diese weist die Kultur des Benutzers (die in der Request.UserLanguages-Eigenschaft angegeben ist) dem aktuellen Thread auf dem Webserver zu (siehe folgenden Code).
Auflistung 5. Benannte Ressourcen mit ResourceManager (Global.asax)
void Application_OnStart() {
Application["RM"] =
ResourceManager.CreateFileBasedResourceManager
("mytext", Server.MapPath("resources")
+ Path.DirectorySeparatorChar, null);
}
void Application_BeginRequest(Object sender, EventArgs args) {
// For each request initialize the culture values with
// the user language as specified by the browser.
try {
Thread.CurrentThread.CurrentCulture = new
CultureInfo(Request.UserLanguages[0]);
}
catch(Exception) {
// provide fallback for not supported languages.
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
}
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
}
Die dynamische Ressourcenzuweisung wird beim Laden der Datei ausgeführt; in diesem Fall erfolgt dies in den Unterroutinen Page_Init und Page_Load der Default.aspx. Page_Init erstellt einen ResourceManager, dessen Gültigkeitsbereich sich auf Seiten erstreckt, und weist ihm die RM-Variable von Application zu. Die Page_Load-Unterroutine ändert die Kultur dynamisch, indem sie automatisch eine Rückmeldung an den Server sendet, wenn ein Benutzer eine andere Sprache wählt. Dies wird im folgenden Code veranschaulicht.
Auflistung 6. Benannte Ressourcen mit ResourceManager (Default.aspx)
void Page_Init(Object sender, EventArgs args) {
// Get the ResourceManager from the Application object.
rm = (ResourceManager) Application["RM"];
...
}
void Page_Load(Object sender, EventArgs args) {
String SelectedCulture = MyUICulture.SelectedItem.Text;
if(! SelectedCulture.StartsWith("Choose")) {
// If another culture was selected, use that instead.
Thread.CurrentThread.CurrentCulture = new
CultureInfo(SelectedCulture);
Thread.CurrentThread.CurrentUICulture = new
CultureInfo(SelectedCulture);
}
}
Das letzte Stück Code, das Sie sich ansehen sollten, ist der Code, der die Bild- und Zeichenfolgenressourcen tatsächlich zurückgibt.
<img src="Flags/<%=CultureInfo.CurrentCulture%>.jpg">
<%=rm.GetString("greeting")%>
Die Bildressource wird dynamisch durch Erstellen einer Dateispezifikation festgelegt, die auf dem Kulturcode des Benutzers basiert. Die Zeichenfolgenressource verwendet ResourceManager, um eine Zeichenfolgenressource aus der entsprechenden RESOURCES-Datei zu laden.