Verpacken und Bereitstellen von Ressourcen
.NET Framework verwendet zum Verpacken und Bereitstellen von Ressourcen ein strahlenförmiges Modell. Im Mittelpunkt steht dabei die Hauptassembly, die den nicht lokalisierbaren ausführbaren Code sowie die Ressourcen für eine einzelne Kultur enthält, die so genannte neutrale Kultur bzw. Standardkultur. Diese Standardkultur stellt die Fallbackkultur der Anwendung dar. Jeder Strahl in diesem Modell ist mit einer Satellitenassembly verknüpft, welche die Ressourcen für eine einzelne Kultur – jedoch keinen Code – enthält.
Dieses Modell besitzt einige Vorteile:
Sie können Ressourcen für neue Kulturen inkrementell hinzufügen, nachdem Sie eine Anwendung bereitgestellt haben. Die nachträgliche Entwicklung von kulturabhängigen Ressourcen beansprucht meist einen erheblichen Zeitaufwand. Mit diesem Modell können Sie zuerst die Hauptanwendung herausgeben und kulturspezifische Ressourcen zu einem späteren Zeitpunkt nachliefern.
Sie können die Satellitenassembly einer Anwendung aktualisieren oder ändern, ohne die Anwendung neu kompilieren zu müssen.
Eine Anwendung muss nur jeweils die Satellitenassemblys laden, welche die für eine bestimmte Kultur benötigten Ressourcen enthalten. Damit verringern sich die benötigten Systemressourcen erheblich.
Dieses Modell hat jedoch auch Nachteile:
Sie müssen mehrere Sätze von Ressourcen verwalten.
Die Anfangskosten zum Testen einer Anwendung steigen, da mehrere Konfigurationen getestet werden müssen. Bedenken Sie jedoch, dass es langfristig gesehen einfacher und preiswerter ist, eine Kernanwendung mit verschiedenen Satelliten zu testen, als mehrere parallele internationale Versionen zu verwalten.
Namenskonventionen für Ressourcen
Beim Verpacken der Anwendungsressourcen müssen Sie diese entsprechend der Ressourcennamenkonventionen der Common Language Runtime benennen. Die Common Language Runtime identifiziert eine Ressource anhand der Kultursignatur oder des Namens. Jede Kultur erhält einen eindeutigen Namen. Dieser besteht aus einem zweistelligen Kulturnamen in Kleinbuchstaben, der mit einer Sprache verknüpft ist, sowie gegebenenfalls aus einem zweistelligen Teilkulturnamen in Großbuchstaben, der mit einem Land oder einer Region verknüpft ist. Der Teilkulturname steht hinter dem Kulturnamen, getrennt durch einen Bindestrich (-). Beispielsweise steht "ja-JP" für Japanisch in Japan, "en-US" für amerikanisches Englisch oder "de-DE" für Deutsch in Deutschland (im Gegensatz zu z. B. "de-AT" für Deutsch in Österreich). Eine vollständige Liste der Kulturnamen finden Sie unter der CultureInfo-Klasse.
Ressourcenfallback-Prozess
Das sternenförmige Modell zum Verpacken und Bereitstellen von Ressourcen verwendet einen Fallbackprozess, um geeignete Ressourcen zu ermitteln. Wenn ein Benutzer der Anwendung ein nicht verfügbares ResourceSet anfordert, sucht die Common Language Runtime in der Hierarchie der Kulturen nach einer passenden Fallbackressource, die der Benutzeranfrage am nächsten kommt, und löst erst in letzter Instanz eine Ausnahme aus. Sobald auf einer Ebene der Hierarchie eine passende Ressource gefunden wurde, wird sie von der Common Language Runtime verwendet. Falls keine Ressource gefunden werden kann, wird die Suche auf der nächsten Ebene fortgesetzt.
Wenden Sie zur Verbesserung der Suchleistung das NeutralResourcesLanguageAttribute-Attribut auf die Hauptassembly an, wobei Sie dieser den Namen der neutralen Sprache übergeben, die für die Hauptassembly verwendet wird.
Der Ressourcenfallback-Prozess besteht aus folgenden Schritten:
Die Common Language Runtime sucht zuerst im globalen Assemblycache nach einer Assembly, die mit der für die Anwendung angeforderten Kultur übereinstimmt.
Im globalen Assemblycache können Ressourcenassemblys gespeichert werden, die von vielen Anwendungen gemeinsam genutzt werden. Auf diese Weise müssen Sie nicht länger bestimmte Sätze von Ressourcen in die Verzeichnisstruktur jeder erstellten Anwendung übernehmen. Findet die Common Language Runtime einen Verweis auf die Assembly gefunden wird, wird diese Assembly nach der angeforderten Ressource durchsucht. Ist ein Eintrag in der Assembly vorhanden, wird die angeforderte Ressource verwendet. Ist kein Eintrag vorhanden, wird die Suche fortgesetzt.
Die Common Language Runtime durchsucht anschließend das Verzeichnis der aktuell ausgeführten Assembly nach einem Verzeichnis, das mit der angeforderten Kultur übereinstimmt. Ist das Verzeichnis vorhanden, wird es nach einer gültigen Satellitenassembly für die angeforderte Kultur durchsucht. Die Common Language Runtime durchsucht anschließend die Satellitenassembly nach der angeforderten Ressource. Ist die Ressource in der Assembly vorhanden, wird sie verwendet. Wird keine Ressource gefunden, wird die Suche fortgesetzt.
Die Common Language Runtime durchsucht nun erneut den globalen Assemblycache, dieses Mal nach der übergeordneten Assembly der angeforderten Ressource. Wenn die übergeordnete Assembly im globalen Assemblycache vorhanden ist, durchsucht die Common Language Runtime die Assembly nach der angeforderten Ressource.
Die übergeordnete Assembly ist als die entsprechende Fallbackkultur definiert. Ein übergeordnetes Element eignet sich besonders gut, da es auf jeden Fall besser ist, eine andere Ressource zu verwenden als eine Ausnahme auszulösen. Mit diesem Prozess können Ressourcen auch wieder verwendet werden. Sie müssen eine bestimmte Ressource auf der übergeordneten Ebene nur einfügen, falls die angeforderte Ressource nicht von der untergeordneten Kultur lokalisiert werden muss. Wenn Sie beispielsweise Satellitenassemblys für "en" (neutrales Englisch), "en-GB" (britisches Englisch) und "en-US" (amerikanisches Englisch) zur Verfügung stellen, enthält der "en"-Satellit die allgemeine Terminologie, während die "en-GB"- und "en-US"-Satelliten nur Überschreibungen für die abweichenden Begriffe enthalten.
Die Common Language Runtime durchsucht anschließend das Verzeichnis der aktuell ausgeführten Assembly nach einem übergeordneten Verzeichnis. Ist ein übergeordnetes Verzeichnis vorhanden, wird es nach einer gültigen Satellitenassembly für die übergeordnete Kultur durchsucht. Ist die Assembly vorhanden, wird diese nach der angeforderten Ressource durchsucht. Wenn die Ressource vorhanden ist, wird sie verwendet. Wird keine Ressource gefunden, wird die Suche fortgesetzt.
Die Common Language Runtime durchsucht nun, wie im vorigen Schritt, viele potenzielle Ebenen nach übergeordneten Assemblys. Jede Kultur verfügt über nur eine übergeordnete Kultur, die aber u. U. ihre eigene übergeordnete Kultur besitzen kann.
Wenn die ursprünglich angegebene Kultur und alle übergeordneten Ebenen durchsucht wurden und die Ressource nicht gefunden werden konnte, wird die Ressource für die (Fallback-)Standardkultur verwendet. Seit der Freigabe von .NET Framework, Version 2.0, können Sie angeben, dass die endgültige Fallbackposition für Ressourcen eine Satellitenassembly ist und nicht die Hauptassembly. Durch Verwendung von NeutralResourcesLanguageAttribute mit der UltimateResourceFallbackLocation-Enumeration können Sie steuern, ob sich die endgültige Fallbackposition für Ressourcen in der Hauptassembly oder in einer Satellitenassembly befindet.
Hinweis Die Standardressource ist die einzige Ressource, die zusammen mit der Hauptassembly kompiliert wird.Dies ist der endgültige Fallback (die letzte übergeordnete Ebene), sofern mit NeutralResourcesLanguageAttribute keine Satellitenassembly angegeben wurde.Daher empfiehlt es sich, immer einen Standardsatz von Ressourcen in die Hauptassembly einzufügen.So wird das Auslösen von Ausnahmen verhindert.Durch das Hinzufügen einer Standardressourcendatei steht ein Fallback für alle Ressourcen zur Verfügung. So verfügt der Benutzer immer über mindestens eine Ressource, auch wenn diese nicht kulturspezifisch ist.
Falls die Common Language Runtime schließlich keine Ressource für eine (Fallback-)Standardkultur findet, wird eine Ausnahme ausgelöst, die angibt, dass die Ressource nicht gefunden werden konnte.
Wenn der Benutzer z. B. eine Ressource für mexikanisches Spanisch anfordert, wird die Suche nach der angeforderten Ressource folgendermaßen durchgeführt. Entsprechend den oben beschriebenen Ressourcennamenkonventionen durchsucht die Common Language Runtime zunächst den globalen Assemblycache nach einer Assembly, die mit der angeforderten Kultur, "es-MX", übereinstimmt. Ist diese nicht vorhanden, wird anschließend das Verzeichnis der aktuell ausgeführten Assembly nach einem "es-MX"-Verzeichnis durchsucht. Schlägt dies fehl, durchsucht die Common Language Runtime den globalen Assemblycache erneut nach einer übergeordneten Assembly, die der geeigneten Fallbackkultur entspricht — in diesem Fall "es" (Spanisch). Ist die übergeordnete Assembly nicht vorhanden, durchsucht die Common Language Runtime alle potenziellen Ebenen nach übergeordneten Assemblys für die "es-MX"-Kultur, bis eine entsprechende Ressource gefunden wird. Ist keine Ressource vorhanden, verwendet die Common Language Runtime die Ressource für die Standardkultur.
Endgültiges Fallback in Satellitenassembly
Seit der Freigabe von .NET Framework, Version 2.0, besteht die Möglichkeit, Ressourcen aus der Hauptassembly zu entfernen und festzulegen, dass sich die endgültigen Fallbackressourcen in einer Satellitenassembly befinden, die einer bestimmten Kultur entspricht. Um den Fallbackprozess zu steuern, können Sie NeutralResourcesLanguageAttribute verwenden. Der NeutralResourcesLanguageAttribute-Klasse wurde ein neuer Konstruktor hinzugefügt, der einen zusätzlichen UltimateResourceFallbackLocation-Parameter verwendet, um die Position anzugeben, an der der ResourceManager die Fallbackressourcen extrahieren soll: die Hauptassembly oder eine Satellitenassembly.
Im folgenden Beispiel wird veranschaulicht, wie das Attribut auf Klassenebene angewendet wird:
[assembly: NeutralResourcesLanguageAttribute("de" , UltimateResourceFallbackLocation.Satellite)]
Für die endgültige Fallbackposition wird der ResourceManager angewiesen, die Ressourcen im Verzeichnis der aktuell ausgeführten Assembly im Unterverzeichnis "de" zu suchen.
Empfohlene Verpackungsalternative
Möglicherweise ist es aufgrund finanzieller oder zeitlicher Einschränkungen für Sie nicht vorteilhaft, für jede Teilkultur, welche die Anwendung unterstützt, einen Satz von Ressourcen zu erstellen. In diesem Fall können Sie für eine übergeordnete Kultur eine einzige Satellitenassembly erstellen, die von allen verwandten Teilkulturen verwendet werden kann. Sie können z. B. eine einzige Satellitenassembly für Englisch (en) für alle Anforderungen nach regionsspezifischen englischen Ressourcen verwenden, oder eine einzige Satellitenassembly für Deutsch (de) für alle Anforderungen nach regionsspezifischen deutschen Ressourcen. Dadurch wird z. B. für alle Anforderungen nach Deutsch in Deutschland (de-DE), Deutsch in Österreich (de-AT) und Deutsch in der Schweiz (de-CH) auf die Satellitenassembly für Deutsch (de) zurückgegriffen. Überlegen Sie genau, welche Standardressourcen zusammen mit der Hauptassembly kompiliert werden sollen. Die Standardressource ist die letzte übergeordnete Ebene und sollte daher von der Mehrzahl der Benutzer der Anwendung angefordert werden. Obwohl bei dieser Lösung Ressourcen verwendet werden, die weniger kulturspezifisch sind, können damit die Lokalisierungskosten der Anwendung deutlich gesenkt werden.