Lokalisieren Sie Zeichenketten in Ihrer Benutzeroberfläche und in Ihrem App-Paketmanifest

Weitere Informationen zu einer Werterhöhung Ihrer App durch Lokalisierung finden Sie unter Globalisierung und Lokalisierung.

Wenn Sie möchten, dass Ihre App verschiedene Anzeigesprachen unterstützt und Ihr Code oder XAML-Markup- oder App-Paketmanifest Zeichenfolgenliterale enthält, verschieben Sie diese Zeichenketten in eine Ressourcendatei (.resw). Sie können dann eine übersetzte Kopie dieser Ressourcendatei für jede Sprache erstellen, die Ihre App unterstützt.

Hartcodierte Zeichenfolgenliterale können im imperativen Code oder im XAML-Markup angezeigt werden, z.B. als Texteigenschaft eines TextBlock-Objekts. Sie können auch in der Quelldatei des App-Paketmanifests (der Package.appxmanifest Datei) angezeigt werden, z. B. als Wert für den Anzeigenamen auf der Anwendungsregisterkarte des Visual Studio-Manifest-Designers. Verschieben Sie diese Zeichenketten in eine Ressourcendatei (.resw), und ersetzen Sie die hartcodierten Zeichenfolgenliterale in Ihrer App und im Manifest durch Verweise auf Ressourcenbezeichner.

Im Gegensatz zu Bildressourcen, bei denen nur eine Bildressource in einer Bildressourcendatei enthalten ist, sind mehrere Zeichenfolgenressourcen in einer Zeichenfolgenressourcendatei enthalten. Eine Zeichenkettenressourcendatei ist eine Ressourcendatei (.resw), und normalerweise erstellen Sie diese Art von Ressourcendatei in einem Ordner \Strings in Ihrem Projekt. Hintergrundinformationen zur Verwendung von Qualifizierern in den Namen Ihrer Ressourcendateien (.resw) finden Sie unter Anpassen Ihrer Ressourcen für Sprache, Skalierung und andere Qualifizierer.

Speichern Sie Zeichenketten in einer Ressourcendatei

  1. Legen Sie die Standardsprache Ihrer Apps fest.

    1. Wenn Ihre Lösung in Visual Studio geöffnet ist, öffnen Sie Package.appxmanifest.
    2. Vergewissern Sie sich auf der Registerkarte Anwendung, dass die Standardsprache richtig eingestellt ist (zum Beispiel „en“ oder „en-US“). Bei den weiteren Schritten wird davon ausgegangen, dass Sie die Standardsprache auf „en-US“ eingestellt haben.

    Hinweis

     Sie müssen mindestens eine Zeichenfolgenressource für die Standardsprache angeben. Diese sind die Ressourcen, die geladen werden, wenn nichts Passenderes für die benutzerseitig bevorzugten Einstellungen für Sprache oder Anzeigesprache gefunden wird.

  2. Erstellen Sie eine Ressourcendatei (.resw) für die Standardsprache.

    1. Erstellen Sie unter Ihrem Projektknoten einen neuen Ordner mit dem Namen Strings.
    2. Erstellen Sie unter Strings einen neuen Unterordner, und nennen Sie ihn en-US.
    3. Erstellen Sie unter en-US eine neue Ressourcendatei (.resw) (unter den XAML-Dateitypen im Dialogfeld Neues Element hinzufügen) und bestätigen Sie, dass sie den Namen Resources.resw hat.

    Hinweis

    Wenn Sie über .NET Ressourcendateien (.resx) verfügen, die Sie portieren möchten, lesen Sie Portieren von XAML und der Benutzeroberfläche.

  3. Öffnen Sie Resources.resw und fügen Sie diese Zeichenkettenressourcen hinzu.

    Strings/en-US/Resources.resw

    Screenshot der Tabelle

    In diesem Beispiel ist „Greeting“ ein Zeichenketten-Ressourcenbezeichner, auf den Sie in Ihrem Markup verweisen können, wie wir noch zeigen werden. Für den Bezeichner „Greeting“ wird eine Zeichenkette für eine Text-Eigenschaft bereitgestellt, und eine Zeichenkette wird für eine Breiten-Eigenschaft bereitgestellt. „Greeting.Text“ ist ein Beispiel für einen Eigenschaftsbezeichner, da er einer Eigenschaft eines Benutzerfoberflächen-Elements entspricht. Sie können z.B. „Greeting.Foreground“ in der Spalte Name hinzufügen und den Wert auf „Rot“ festlegen. Der Bezeichner „Farewell“ ist ein einfacher Zeichenfolgenressourcenbezeichner; der über keine Untereigenschaften verfügt und kann aus imperativem Code geladen werden, wie wir noch zeigen. Die Spalte Kommentar ist ein guter Ort, um Übersetzern spezielle Anweisungen bereitzustellen.

    Da wir in diesem Beispiel einen einfachen Zeichenketten-Ressourcenbezeichner-Eintrag mit dem Namen „Farewell“ haben, können wir nicht auch Eigenschaftsbezeichner basierend auf demselben Bezeichner haben. Das Hinzufügen von „Farewell.Text“ würde also beim Erstellen von Resources.resw einen Doppelten Eintragsfehler verursachen.

    Bei Ressourcenbezeichnern wird die Groß-/Kleinschreibung nicht beachtet und muss pro Ressourcendatei eindeutig sein. Achten Sie darauf, aussagekräftige Ressourcenbezeichner zu verwenden, um zusätzlichen Kontext für Übersetzer bereitzustellen. Ändern Sie die Ressourcenbezeichner nicht, nachdem die Zeichenkettenressourcen zur Übersetzung gesendet wurden. Lokalisierungsteams verwenden den Ressourcenbezeichner, um Ergänzungen, Löschungen und Aktualisierungen in den Ressourcen nachzuverfolgen. Änderungen an den Ressourcenbezeichnern - auch bekannt als „Verschiebung der Ressourcenbezeichner“ - erfordern eine Neuübersetzung der Zeichenketten, da es so aussieht, als ob Zeichenketten gelöscht und andere hinzugefügt wurden.

Beziehen Sie sich auf einen Zeichenketten-Ressourcenbezeichner aus XAML

Sie verwenden eine x:Uid-Direktive, um einem Steuerelement oder einem anderen Element im Markup einen Zeichenketten-Ressourcenbezeichner zuzuordnen.

<TextBlock x:Uid="Greeting"/>

Zur Laufzeit wird \Strings\en-US\Resources.resw geladen (da das derzeit die einzige Ressourcendatei im Projekt ist). Die x:Uid-Direktive im TextBlock bewirkt, dass ein Nachschlagevorgang stattfindet, um Eigenschaftsbezeichner in Resources.resw zu finden, die den Zeichenketten-Ressourcenbezeichner „Greeting“ enthalten. Die Bezeichner der Eigenschaft „Greeting.Text“ und „Greeting.Width“ werden gefunden, und ihre Werte werden auf den TextBlock angewendet, wobei alle lokal im Markup festgelegten Werte außer Kraft gesetzt werden. Der Wert „Greeting.Foreground“ würde ebenfalls angewendet, wenn Sie diesen hinzugefügt hätten. Es werden jedoch nur Eigenschaftenbezeichner verwendet, um Eigenschaften für XAML-Markupelemente festzulegen, sodass das Festlegen von x:Uid auf „Farewell“ für diesen TextBlock keine Auswirkung hätte. Resources.resw enthält den Zeichenfolgenressourcenbezeichner "Farewell", enthält jedoch keine Eigenschaftsbezeichner dafür.

Stellen Sie beim Zuweisen eines Zeichenketten-Ressourcenbezeichners zu einem XAML-Element sicher, dass alle Eigenschaftenbezeichner für diesen Bezeichner für das XAML-Element geeignet sind. Wenn Sie z.B. für einen TextBlock x:Uid="Greeting" festlegen, wird „Greeting.Text“ aufgelöst, da der TextBlock-Typ eine Texteigenschaft aufweist. Wenn Sie jedoch x:Uid="Greeting" auf einer Schaltfläche festlegen, führt „Greeting.Text“ zu einem Laufzeitfehler, da der Schaltflächentyp keine Texteigenschaft aufweist. Eine Lösung für diesen Fall besteht darin, einen Eigenschaftenbezeichner mit dem Namen „ButtonGreeting.Content“ zu erstellen und x:Uid="ButtonGreeting" für die Schaltfläche festzulegen.

Anstatt Breite aus einer Ressourcendatei festzulegen, werden Sie wahrscheinlich erlauben wollen, dass sich die Größe der Steuerelemente dynamisch an den Inhalt anpasst.

Notiz Für angefügte Eigenschaften benötigen Sie eine spezielle Syntax in der Spalte Name einer .resw-Datei. Wenn Sie z.B. einen Wert für die angefügte Eigenschaft AutomationProperties.Name für den Bezeichner „Greeting“ festlegen möchten, geben Sie dies in die Spalte Name ein.

Greeting.[using:Windows.UI.Xaml.Automation]AutomationProperties.Name

Beziehen Sie sich auf einen Zeichenketten-Ressourcenbezeichner aus Code

Sie können eine Zeichenkettenressource basierend auf einem einfachen Zeichenketten-Ressourcenbezeichner explizit laden.

Hinweis

Wenn Sie eine GetForCurrentView-Methode aufrufen, die auf einem Hintergrund-/Arbeitsthread ausgeführt werden könnte, sollten Sie diesen Aufruf mit einem if (Windows.UI.Core.CoreWindow.GetForCurrentThread() != null) Test schützen. Das Aufrufen von GetForCurrentView aus einem Hintergrund-/Arbeitsthread führt zu der Ausnahme „<Typname> kann nicht für Threads erstellt werden, die nicht über einen CoreWindow verfügen.

var resourceLoader = Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView();
this.myXAMLTextBlockElement.Text = resourceLoader.GetString("Farewell");
auto resourceLoader{ Windows::ApplicationModel::Resources::ResourceLoader::GetForCurrentView() };
myXAMLTextBlockElement().Text(resourceLoader.GetString(L"Farewell"));
auto resourceLoader = Windows::ApplicationModel::Resources::ResourceLoader::GetForCurrentView();
this->myXAMLTextBlockElement->Text = resourceLoader->GetString("Farewell");

Sie können diesen Code aus einer Klassenbibliothek (Universal Windows) oder einer Windows-Runtime Library (Universal Windows)-Projekt verwenden. In der Runtime werden die Ressourcen der App, die die Bibliothek hostet, geladen. Es wird empfohlen, dass eine Bibliothek Ressourcen aus der App lädt, die sie hostet, da die App wahrscheinlich einen größeren Lokalisierungsgrad aufweist. Wenn eine Bibliothek Ressourcen bereitstellen muss, sollte sie ihrer Hosting-App die Option zur Verfügung stellen, diese Ressourcen als Eingabe zu ersetzen.

Wenn ein Ressourcenname segmentiert ist (er enthält „.“-Zeichen), ersetzen Sie Punkte durch Schrägstriche („/“) im Ressourcennamen. Eigenschaftsbezeichner enthalten z. B. Punkte; Daher müssen Sie diese Ersetzung durchführen, um eines dieser Elemente aus Code zu laden.

this.myXAMLTextBlockElement.Text = resourceLoader.GetString("Fare/Well"); // <data name="Fare.Well" ...> ...

Im Zweifelsfall können Sie MakePri.exe verwenden, um die PRI-Datei Ihrer App zu dumpen. Jede Ressource uri wird in der gedumpten Datei angezeigt.

<ResourceMapSubtree name="Fare"><NamedResource name="Well" uri="ms-resource://<GUID>/Resources/Fare/Well">...

Verweisen Sie im App-Paketmanifest auf einen Zeichenfolgenressourcenbezeichner.

  1. Öffnen Sie die Quelldatei des App-Paketmanifests (die Package.appxmanifest Datei), in der die App Display name standardmäßig als Zeichenfolgenliteral ausgedrückt wird.

    Screenshot der Datei

  2. Um eine lokalisierbare Version dieser Zeichenkette zu erstellen, öffnen Sie Resources.resw und fügen Sie eine neue Zeichenfolgenressource mit dem Namen „AppDisplayName“ und dem Wert „Adventure Works Cycles“ hinzu.

  3. Ersetzen Sie das Zeichenfolgenliteral des Anzeigenamens durch eine Referenz auf den Zeichenketten-Ressourcenbezeichner, den Sie soeben erstellt haben („AppDisplayName“). Dazu verwenden Sie das ms-resource URI-Schema (Uniform Resource Identifier).

    Screenshot der Datei

  4. Wiederholen Sie diesen Vorgang für jede Zeichenkette in Ihrem Manifest, die Sie lokalisieren möchten. Beispielsweise den Kurznamen Ihrer App (den Sie so konfigurieren können, dass er auf der Kachel Ihrer App auf der Startseite angezeigt wird). Eine Liste aller Elemente im App-Paketmanifest, die Sie lokalisieren können, finden Sie unter Lokalisierbare Manifestelemente.

Lokalisieren der Zeichenkettenressourcen

  1. Erstellen Sie eine Kopie Ihrer Ressourcendatei (.resw) für eine andere Sprache.

    1. Erstellen Sie unter „Zeichenketten“ einen neuen Unterordner, und nennen Sie ihn „de-DE“ für Deutsch (Deutschland).
      Notiz Für den Ordnernamen können Sie ein beliebiges BCP-47-Sprachtag verwenden. Unter Anpassen Ihrer Ressourcen an Sprache, Skalierung und andere Qualifizierer finden Sie Einzelheiten zum Sprachqualifizierer und eine Liste gängiger Sprach-Tags.
    2. Erstellen Sie eine Kopie von Strings/en-US/Resources.resw im Strings/de-DE Ordner.
  2. Übersetzen Sie die Zeichenketten.

    1. Öffnen Sie Strings/de-DE/Resources.resw und übersetzen Sie die Werte in der Spalte Wert. Die Kommentare müssen Sie nicht übersetzen.

    Strings/de-DE/Resources.resw

    Ressource hinzufügen, deutsch

Wenn Sie möchten, können Sie die Schritte 1 und 2 für eine weitere Sprache wiederholen.

Strings/fr-FR/Resources.resw

Ressource hinzufügen, französisch

Testen Sie Ihre App

Testen Sie die App für Ihre Standardanzeigesprache. Anschließend können Sie die Anzeigesprache in Einstellungen> Time & Language>Region & Language>Languages ändern und Ihre App erneut testen. Sehen Sie sich Zeichenketten auf Ihrer Benutzeroberfläche und auch in der Shell an (z.B. die Titelleiste - also Ihren Anzeigenamen - und den Kurznamen auf ihren Kacheln).

Notiz Wenn ein Ordnername gefunden werden kann, der den Einstellungen der Anzeigesprache entspricht, wird die Ressourcendatei innerhalb dieses Ordners geladen. Andernfalls findet ein Fallback statt, der mit den Ressourcen für die Standardsprache Ihrer App endet.

Aufteilen von Zeichenketten in mehrere Ressourcendateien

Sie können alle Zeichenketten in einer einzelnen Ressourcendatei (resw) speichern, oder Sie können sie über mehrere Ressourcendateien hinweg aufteilen. Sie könnten zum Beispiel Ihre Fehlermeldungen in einer Ressourcendatei, die Zeichenketten des App-Paketmanifests in einer anderen und die Zeichenketten der Benutzeroberfläche in einer dritten Datei speichern wollen. In diesem Fall würde ihre Ordnerstruktur so aussehen.

Screenshot des Bereichs

Um einen Zeichenketten-Ressourcenbezeichner auf eine bestimmte Datei zu beschränken, fügen Sie /<resources-file-name>/ direkt vor dem Bezeichner hinzu. Im folgenden Markupbeispiel wird davon ausgegangen, dass ErrorMessages.resw eine Ressource enthält, deren Name „PasswordTooWeak.Text“ lautet und dessen Wert den Fehler beschreibt.

<TextBlock x:Uid="/ErrorMessages/PasswordTooWeak"/>

Sie müssen nur vor dem Zeichenfolgenressourcenbezeichner für ressourcendateien Resources.reswals ./<resources-file-name>/ Der Grund dafür ist, dass „Resources.resw“ der Standarddateiname ist, der angenommen wird, wenn Sie einen Dateinamen weglassen (wie in den vorherigen Beispielen in diesem Thema beschrieben).

Das folgende Codebeispiel geht davon aus, dass ErrorMessages.resw eine Ressource mit dem Namen „MismatchedPasswords“ enthält, deren Wert den Fehler beschreibt.

Hinweis

Wenn Sie eine GetForCurrentView-Methode aufrufen, die auf einem Hintergrund-/Arbeitsthread ausgeführt werden könnte, sollten Sie diesen Aufruf mit einem if (Windows.UI.Core.CoreWindow.GetForCurrentThread() != null) Test schützen. Das Aufrufen von GetForCurrentView aus einem Hintergrund-/Arbeitsthread führt zu der Ausnahme „<Typname> kann nicht für Threads erstellt werden, die nicht über einen CoreWindow verfügen.

var resourceLoader = Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView("ErrorMessages");
this.myXAMLTextBlockElement.Text = resourceLoader.GetString("MismatchedPasswords");
auto resourceLoader{ Windows::ApplicationModel::Resources::ResourceLoader::GetForCurrentView(L"ErrorMessages") };
myXAMLTextBlockElement().Text(resourceLoader.GetString(L"MismatchedPasswords"));
auto resourceLoader = Windows::ApplicationModel::Resources::ResourceLoader::GetForCurrentView("ErrorMessages");
this->myXAMLTextBlockElement->Text = resourceLoader->GetString("MismatchedPasswords");

Wenn Sie Ihre „AppDisplayName“-Ressource aus Resources.resw und in ManifestResources.resw verschieben würden, dann würden Sie in Ihrem App-Paketmanifest ms-resource:AppDisplayName zu ms-resource:/ManifestResources/AppDisplayName ändern.

Wenn der Name einer Ressourcendatei segmentiert ist (er enthält „.“-Zeichen), dann lassen Sie die Punkte im Namen, wenn Sie darauf verweisen. Ersetzen Sie keine Punkte durch Schrägstrich-Zeichen („/“), wie sie für einen Ressourcennamen verwendet werden sollen.

var resourceLoader = Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView("Err.Msgs");

Im Zweifelsfall können Sie MakePri.exe verwenden, um die PRI-Datei Ihrer App zu dumpen. Jede Ressource uri wird in der gedumpten Datei angezeigt.

<ResourceMapSubtree name="Err.Msgs"><NamedResource name="MismatchedPasswords" uri="ms-resource://<GUID>/Err.Msgs/MismatchedPasswords">...

Laden einer Zeichenkette für eine bestimmte Sprache oder einen anderen Kontext

Der standardmäßige ResourceContext (erhalten von ResourceContext.GetForCurrentView) enthält für jeden Qualifizierer-Namen einen Qualifizierer-Wert, der den Standard-Laufzeitkontext darstellt (mit anderen Worten: die Einstellungen für den aktuellen Benutzer und Computer). Ressourcendateien (.resw) werden – basierend auf den Qualifizierern in ihren Namen – mit den Qualifiziererwerten in diesem Laufzeitkontext übereinstimmen.

Es kann jedoch vorkommen, dass Sie möchten, dass Ihre App die Systemeinstellungen außer Kraft setzt und explizit die Sprache, die Skalierung oder einen anderen Qualifizierungswert angibt, der bei der Suche nach einer passenden Ressourcendatei zum Laden verwendet werden soll. Sie möchten zum Beispiel, dass Ihre Benutzer eine andere Sprache für Tooltips oder Fehlermeldungen auswählen können.

Sie können dies tun, indem Sie einen neuen ResourceContext (anstelle des Standardmäßigen) erstellen, dessen Werte übergehen und dann dieses Kontextobjekt in Ihren Zeichenketten-Verweisen verwenden.

var resourceContext = new Windows.ApplicationModel.Resources.Core.ResourceContext(); // not using ResourceContext.GetForCurrentView
resourceContext.QualifierValues["Language"] = "de-DE";
var resourceMap = Windows.ApplicationModel.Resources.Core.ResourceManager.Current.MainResourceMap.GetSubtree("Resources");
this.myXAMLTextBlockElement.Text = resourceMap.GetValue("Farewell", resourceContext).ValueAsString;

Die Verwendung von QualifierValues wie im obigen Codebeispiel funktioniert für jeden Qualifizierer. Für den speziellen Fall der Sprache können Sie dies alternativ verwenden.

resourceContext.Languages = new string[] { "de-DE" };

Für denselben Effekt auf globaler Ebene können Sie die Qualifiziererwerte im Standardmäßigen ResourceContext überschreiben. Wir empfehlen Ihnen jedoch, ResourceContext.SetGlobalQualifierValue aufzurufen. Sie legen die Werte einmalig mit einem Aufruf von SetGlobalQualifierValue fest und diese Werte gelten dann jedes Mal für den Standard-ResourceContext, wenn Sie diesen für Suchvorgänge verwenden.

Windows.ApplicationModel.Resources.Core.ResourceContext.SetGlobalQualifierValue("Language", "de-DE");
var resourceLoader = Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView();
this.myXAMLTextBlockElement.Text = resourceLoader.GetString("Farewell");

Einige Qualifizierer verfügen über einen Systemdatenanbieter. Statt SetGlobalQualifierValue aufzurufen, könnten Sie den Anbieter stattdessen über eine eigene API anpassen. Dieser Code zeigt beispielsweise, wie PrimaryLanguageOverride festgelegt wird.

Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = "de-DE";

Aktualisieren von Zeichenketten als Reaktion auf Änderungsereignisse für Qualifiziererwerte

Ihre ausgeführte App kann auf Änderungen der Systemeinstellungen reagieren, die sich auf die Qualifiziererwerte im Standardmäßigen ResourceContext auswirken. Jede dieser Systemeinstellungen ruft das MapChanged-Ereignis auf ResourceContext.QualifierValues auf.

Als Reaktion auf dieses Ereignis können Sie Ihre Zeichenketten aus dem Standardmäßigen ResourceContext neu laden.

public MainPage()
{
    this.InitializeComponent();

    ...

    // Subscribe to the event that's raised when a qualifier value changes.
    var qualifierValues = Windows.ApplicationModel.Resources.Core.ResourceContext.GetForCurrentView().QualifierValues;
    qualifierValues.MapChanged += new Windows.Foundation.Collections.MapChangedEventHandler<string, string>(QualifierValues_MapChanged);
}

private async void QualifierValues_MapChanged(IObservableMap<string, string> sender, IMapChangedEventArgs<string> @event)
{
    var dispatcher = this.myXAMLTextBlockElement.Dispatcher;
    if (dispatcher.HasThreadAccess)
    {
        this.RefreshUIText();
    }
    else
    {
        await dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => this.RefreshUIText());
    }
}

private void RefreshUIText()
{
    var resourceLoader = Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView();
    this.myXAMLTextBlockElement.Text = resourceLoader.GetString("Farewell");
}

Laden von Zeichenketten aus einer Klassenbibliothek oder einer Windows-Runtime Bibliothek

Die Zeichenkettenressourcen einer referenzierten Klassenbibliothek (Universal Windows) oder Windows-Runtime Library (Universal Windows) werden in der Regel in einen Unterordner des Pakets eingefügt, in das sie während des Build-Prozesses aufgenommen werden. Der Ressourcenbezeichner einer solchen Zeichenkette verwendet in der Regel die Form LibraryName/ResourcesFileName/ResourceIdentifier.

Eine Bibliothek kann einen ResourceLoader für eigene Ressourcen abrufen. Der folgende Code veranschaulicht beispielsweise, wie eine Bibliothek oder eine App, die darauf verweist, einen ResourceLoader für die Zeichenkettenressourcen der Bibliothek abrufen kann.

var resourceLoader = Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView("ContosoControl/Resources");
this.myXAMLTextBlockElement.Text = resourceLoader.GetString("exampleResourceName");

Bei einer Windows-Runtime-Bibliothek (Universal Windows) verwenden Sie Punkte im Ressourcenzuordnungsnamen, wenn der Standardnamespace segmentiert ist (er enthält „.“-Zeichen).

var resourceLoader = Windows.ApplicationModel.Resources.ResourceLoader.GetForCurrentView("Contoso.Control/Resources");

Sie müssen dies nicht für eine Klassenbibliothek (Universal Windows) tun. Wenn Sie Zweifel haben, können Sie MakePri.exe-Befehlszeilenoptionen angeben, um die PRI-Datei Ihrer Komponente oder Bibliothek zu dumpen. Jede Ressource uri wird in der gedumpten Datei angezeigt.

<NamedResource name="exampleResourceName" uri="ms-resource://Contoso.Control/Contoso.Control/ReswFileName/exampleResourceName">...

Laden von Zeichenketten aus anderen Paketen

Die Ressourcen für ein App-Paket werden verwaltet und über die eigene ResourceMap auf oberster Ebene des Pakets aufgerufen, auf die über den aktuellen ResourceManager zugegriffen werden kann. Innerhalb jedes Pakets können verschiedene Komponenten über eigene ResourceMap-Unterstrukturen verfügen, auf die Sie über ResourceMap.GetSubtree zugreifen können.

Ein Frameworkpaket kann auf eigene Ressourcen mit einem absoluten Ressourcenbezeichner-URI zugreifen. Siehe auch URI-Schemata.

Laden von Zeichenketten in ungepackten Anwendungen

Ab Windows Version 1903 (Update vom Mai 2019) können ungepackte Anwendungen auch das Ressourcenverwaltungssystem nutzen.

Erstellen Sie einfach Ihre UWP-Benutzersteuerelemente/-bibliotheken, und speichern Sie alle Zeichenketten in einer Ressourcendatei. Sie können dann auf einen Zeichenketten-Ressourcenbezeichner aus XAML verweisen, auf einen Zeichenketten-Ressourcenbezeichner aus dem Code verweisen oder Zeichenketten aus einer Klassenbibliothek oder einer Windows-Runtime-Bibliothek laden.

Wenn Sie Ressourcen in ungepackten Anwendungen verwenden möchten, sollten Sie einige Aktionen ausführen:

  1. Verwenden Sie GetForViewIndependentUse anstelle von GetForCurrentView, wenn Ressourcen aus Code aufgelöst werden, da in entpackten Szenarien keine aktuelle Ansicht vorhanden ist. Die folgende Ausnahme tritt auf, wenn Sie GetForCurrentView in entpackten Szenarien aufrufen: Ressourcenkontexte werden möglicherweise nicht für Threads erstellt, die keinen CoreWindow haben.
  2. Verwenden Sie MakePri.exe, um die Datei resources.pri Ihrer App manuell zu generieren.
    • Ausführen von makepri new /pr <PROJECTROOT> /cf <PRICONFIG> /of resources.pri
    • Der <PRICONFIG> muss den Abschnitt „<Packaging>“ weglassen, damit alle Ressourcen in einer einzigen resources.pri-Datei gebündelt werden. Wenn Sie die Standard MakePri.exe Konfigurationsdatei verwenden, die von createconfig erstellt wurde, müssen Sie den Abschnitt „<Verpackung>“ nach der Erstellung manuell löschen.
    • Der <PRICONFIG> muss alle relevanten Indexer enthalten, die zum Zusammenführen aller Ressourcen in Ihrem Projekt in einer einzigen resources.pri-Datei erforderlich sind. Die MakePri.exe-Standardkonfigurationsdatei, die von createconfig erstellt wird, enthält alle Indexer.
    • Wenn Sie die Standardkonfiguration nicht verwenden, stellen Sie sicher, dass der PRI-Indexer aktiviert ist (lesen Sie in der Standardkonfiguration nach, wie das geht), um PRIs aus UWP-Projektreferenzen, NuGet-Referenzen usw., die sich im Projektstamm befinden, zusammenzuführen.

      Hinweis

      Durch das Weglassen von /IndexName, und dadurch, dass das Projekt kein App-Manifest hat, wird der IndexName/Wurzel-Namensraum der PRI-Datei automatisch auf Application gesetzt, was die Laufzeitumgebung unter ungepackten Apps versteht (dadurch wird die vorherige harte Abhängigkeit von der Paket-ID aufgehoben). Bei der Angabe von Ressourcen-URIs schließen ms-resource:///-Referenzen, die den Root-Namespace auslassen, auf die Anwendung als Root-Namespace für ungepackte Anwendungen (oder Sie können die Anwendung explizit angeben, wie in ms-resource://Application/).

  3. Kopieren Sie die PRI-Datei in das Buildausgabeverzeichnis der .exe-Datei.
  4. Führen Sie die .exe-Datei aus

    Hinweis

    Das Ressourcenverwaltungssystem verwendet die Anzeigesprache des Systems und nicht die vom Benutzer bevorzugte Sprachliste, wenn es Ressourcen in ungepackten Anwendungen anhand der Sprache auflöst. Die vom Benutzer bevorzugte Sprachliste wird nur für verpackte UWP-Apps verwendet.

Wichtig

Sie müssen PRI-Dateien immer dann manuell neu erstellen, wenn Ressourcen geändert werden. Wir empfehlen die Verwendung eines Post-Build-Skripts, das den Befehl MakePri.exe verarbeitet und die resources.pri-Ausgabe in das Verzeichnis .exe kopiert.

Wichtige APIs