Language: HTML | XAML

So wird’s gemacht: Laden von Zeichenfolgenressourcen (XAML)

Applies to Windows and Windows Phone

Sie können Zeichenfolgenressourcen aus Objekten wie Ressourcendateien, -bibliotheken und -steuerelementen sowie aus Paketen und Manifesten für Windows Store-Apps laden.

Laden von Zeichenfolgen aus Ressourcendateien.

Zeichenfolgenressourcen werden in Ressourcendateien erstellt. Der Verweis auf Zeichenfolgenressourcen erfolgt mithilfe von Ressourcenbezeichnern. Eine grundlegende Einführung in das Laden von Zeichenfolgenressourcen finden Sie unter Schnellstart: Verwenden von Zeichenfolgenressourcen.

Die meisten Anwendungen benötigen lediglich eine einzelne Standardressourcendatei ("<language>/Resources.resw") und können mithilfe eines relativen Pfads auf ihre Ressourcen verweisen ("String1"). In bestimmten Anwendungen ist es jedoch angebracht, Ressourcen auf mehrere Ressourcendateien aufzuteilen, um die Komponenten voneinander zu trennen.

Beispiel:

Dateiname:

"Strings/en-US/Errors.resw"


<TextBlock x:Uid="/Errors/AlreadyRegistered"></TextBlock>



var res =  Windows.ApplicationModel.ResourceLoader('Errors');
res.GetString('AlreadyRegistered');

Der Ressourcenbezeichner liegt im Format "/ResourceFileName/StringName" vor. Beachten Sie, dass der Ressourcendateiname weder die Erweiterung noch den Ordnerpfad beinhaltet. Daher müssen alle Ressourcendateinamen in einer Komponente oder in einem Projekt eindeutig sein.

Laden von Zeichenfolgen aus Bibliotheken, Steuerelementen oder SDKs (Software Development Kits).

Apps verfügen häufig über mehrere Komponenten oder sind von Bibliotheken abhängig, z. B. portablen Bibliotheken, Klassenbibliotheken und Steuerelementbibliotheken von .NET.

Steuerelemente und SDKs sollten möglichst immer dazu beitragen, die Ressourcenanzahl zu verringern, da diese von der App bereitgestellt werden sollten. Wenn eine Bibliothek Ressourcen bereitstellen muss, sollte sie es den Apps ermöglichen, diese Ressourcen als Eingabe zu ersetzen. Dies kann erforderlich sein, wenn die Bibliothek nicht im gleichen Umfang lokalisiert ist wie die App, die sie verwendet.

Das Steuerelement sollte benutzerdefinierte Zeichenfolgen genau so anzeigen, wie sie übergeben wurden, und nach Möglichkeit sollte die Lokalisierung durch die App erfolgen.

Komponenten- oder Bibliotheksdateien werden – ähnlich wie die zugehörigen Zeichenfolgenressourcen – üblicherweise einem Unterordner des Pakets hinzugefügt, in das sie im Rahmen des Erstellungsprozesses eingefügt wurden. Der jeweilige Ressourcenbezeichner besitzt in der Regel folgendes Format:

ClassLibrarySDKOrAssemblyName/ResourceFileName/StringName

Bibliotheken können programmgesteuert auch einen eigenen ResourceLoader für ihre Ressourcen erhalten. So veranschaulicht der folgende Code beispielsweise, wie eine Bibliothek oder ein SDK mit einem ResourceLoader für die eigene Ressourcendatei versehen werden kann:


ResourceLoader R = new Windows.ApplicationModel.Resources.ResourceLoader("ContosoControl/Resources");
R.getString("loadingStr"); // which came from ContosoControl's Resources.resw


Laden von Zeichenfolgen aus anderen Paketen.

Die Ressourcen für die einzelnen Pakete für Windows Store-Apps werden getrennt verwaltet. Der Zugriff erfolgt über getrennte ResourceMap-Objekte auf der obersten Ebene, die über das aktuelle ResourceManager-Objekt zugänglich sind. In jedem Paket können verschiedene Komponenten jeweils einen eigenen ResourceMap-Subtree besitzen.

Framework-Pakete können auf ihre eigenen Ressourcen mit einem absoluteren Ressourcenbezeichner-URI zugreifen. Weitere Informationen zu ms-resource-URIs finden Sie unter den URIs "ms-resource" und "ms-appx".

Laden von Zeichenfolgen aus dem Manifest für Windows Store-Apps.

Alle anzeigbaren Zeichenfolgen und Logos im Manifest sind lokalisierbar. Logos können auch für die Skalierung und für hohen Kontrast angepasst werden. Anstelle einer hartcodierten Zeichenfolge können Zeichenfolgenverweise hinzugefügt werden. Platzieren Sie hierzu einen per ms-resource:-Schema angegebenen URI im Manifest. Beispiel:


<DisplayName>ms-resource:String1</DisplayName>

Dies verweist auf die Zeichenfolge "String1" in der Ressourcendatei "Resources.resw" oder "Resources.resjson".


ShortName="ms-resource:/ManifestStrings/Shortname"

verweist dagegen auf eine Zeichenfolge namens "Shortname" in der Ressourcendatei "ManifestStrings.resw/.resjson".

Laden von Zeichenfolgen für eine bestimmte Sprache oder einen bestimmten Kontext.

Der standardmäßige ResourceContext (ein aus dem ResourceManager abgerufenes Objekt) steht für den aktuellen Zustand, auf den die Ressourcen abgestimmt werden. Der ResourceContext enthält all die unterschiedlichen Qualifiziererwerte für den aktuellen Benutzer und den aktuellen Computer. Sie können die einzelnen Qualifizierer zwar überschrieben, aber von dieser Vorgehensweise wird abgeraten. Die meisten Qualifizierer besitzen einen Systemdatenanbieter. Dieser wird in einigen Fällen am besten über eine separate API (also PrimaryLanguageOverride) geändert oder unverändert gelassen.

Windows.ApplicationModel.Resources.Core.ResourceManager.current.defaultContext;

Ausführliche Informationen zu den verschiedenen Qualifizierern und ihren Datenanbietern finden Sie unter So wird's gemacht: Benennen von Ressourcen mithilfe von Qualifizierern.

Der ResourceManager verwaltet das Standardkontextobjekt, mit dessen Hilfe Ressourcensuchvorgänge ausgeführt werden. In bestimmten Fällen kann es hilfreich sein, beim Laden von Ressourcen durch die App explizit die Sprache, die Skalierung oder andere Kontextqualifizierer anzugeben. So kann es eine App einem Benutzer beispielsweise ermöglichen, eine alternative Sprache für QuickInfos oder Fehlermeldungen auszuwählen. Suchvorgänge können ihr eigenes explizit überschriebenes Kontextobjekt angeben, um die Ressourcenauswahl zu beeinflussen. So geben Sie einen expliziten Kontext an:


using Windows.ApplicationModel.Resources.Core;

var context = new ResourceContext();
context.languages = new List<String>();
context.languages.Add("en-us");

var resourceMap = ResourceManager.Current.MainResourceMap.GetSubtree("Resources");
var str = resourceMap.GetValue("scenario3Message", context);

Ereignisse und Kontextänderungen.

Windows Store-Apps werden möglicherweise noch ausgeführt, während eine Systemänderung erfolgt. Dies führt dazu, dass ein anderer Satz von Qualifizierern verwendet wird. Eine solche Änderung könnte beispielsweise das Aktivieren des hohen Kontrasts durch den Benutzer sein. Verschiedene Systemänderungen rufen Ereignisse für das ResourceContext-Objekt auf.

In Apps mit XAML wird das Aktualisieren der angezeigten Seite mit neuen Ressourcen dadurch verkompliziert, dass Handler für diese Ereignisse oft in einem anderen Thread als dem Benutzeroberflächenthread aufgerufen werden. Das folgende Teilbeispiel veranschaulicht eine Möglichkeit, eine Überwachung des Änderungsereignisses einzurichten und den Text auf der Hauptseite zu aktualisieren. Beachten Sie Folgendes:

  • Im MainPage-Konstruktor ist festgelegt, dass der qualifiers_MapChanged-Ereignishandler aufgerufen wird, wenn die Ressourcenqualifizierer geändert werden.
  • Der qualifiers_MapChanged-Ereignishandler stellt sicher, dass die UpdateTextBlocks-Methode für den richtigen Thread aufgerufen wird.
  • Die UpdateTextBlocks-Methode übernimmt das Laden der jetzt richtigen Ressourcenzeichenfolgen und das Aktualisieren der Textblöcke auf der Hauptseite.

public sealed partial class MainPage : SampleApp.Common.LayoutAwarePage
{
    public MainPage()
    {
        this.InitializeComponent();

        // Listen for event when the resource qualifiers change.
        var qualifiers = Windows.ApplicationModel.Resources.Core.ResourceManager.Current.DefaultContext.QualifierValues;
        qualifiers.MapChanged += new MapChangedEventHandler<string, string>(qualifiers_MapChanged);
    }

    // Event handler for change in resource qualifiers.
    private async void qualifiers_MapChanged(IObservableMap<string, string> sender, IMapChangedEventArgs<string> @event)
    {
        var d = GreetingHello.Dispatcher;
        if (d.HasThreadAccess)
        {
            UpdateTextBlocks();
        }
        else
        {
            await d.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => UpdateTextBlocks());
        }
    }

    // Update text blocks on the main page.
    private void UpdateTextBlocks()
    {
        // Replace the Text properties of text blocks on the main page with the appropriate resource strings.
        var resourceLoader = new Windows.ApplicationModel.Resources.ResourceLoader();
        Greeting.Text = resourceLoader.GetString("Greeting");
        Farewell.Text = resourceLoader.GetString("Farewell");
    }
    ...
}

Verwandte Themen

Windows.ApplicationModel.Resources.ResourceLoader
Windows.ApplicationModel.Resources.Core.ResourceContext
Windows.ApplicationModel.Resources.Core.ResourceManager
Windows.ApplicationModel.Resources.Core.ResourceMap
Windows.Globalization.ApplicationPreferences.PrimaryLanguageOverride
Features und Einschränkungen nach Kontext
So wird's gemacht: Benennen von Ressourcen mithilfe von Qualifizierern
Roadmap für Windows-Runtime-Apps mit C# oder Visual Basic

 

 

Anzeigen:
© 2014 Microsoft