Lokalisieren Sie Zeichenketten in der Benutzeroberfläche und im App-Paketmanifest
Weitere Informationen über den Mehrwert durch die Lokalisierung Ihrer Windows App SDK-App 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
Legen Sie die Standardsprache Ihrer Apps fest.
- Wenn Ihre Lösung in Visual Studio geöffnet ist, öffnen Sie
Package.appxmanifest
. - 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.
- Wenn Ihre Lösung in Visual Studio geöffnet ist, öffnen Sie
Erstellen Sie eine Ressourcendatei (.resw) für die Standardsprache.
- Erstellen Sie unter Ihrem Projektknoten einen neuen Ordner mit dem Namen
Strings
. - Erstellen Sie unter
Strings
einen neuen Unterordner, und nennen Sie ihnen-US
. - Erstellen Sie unter
en-US
eine neue Ressourcendatei (.resw) (unter den WinUI-Dateitypen im Dialogfeld Neues Element hinzufügen) und bestätigen Sie, dass sie den NamenResources.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.
- Erstellen Sie unter Ihrem Projektknoten einen neuen Ordner mit dem Namen
Öffnen Sie
Resources.resw
und fügen Sie diese Zeichenkettenressourcen hinzu.Strings/en-US/Resources.resw
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.
Hinweis
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:Microsoft.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.
var resourceLoader = new Microsoft.Windows.ApplicationModel.Resources.ResourceLoader();
this.myXAMLTextBlockElement.Text = resourceLoader.GetString("Farewell");
Sie können diesen Code in einem Klassenbibliothek-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.
Öffnen Sie die Quelldatei des App-Paketmanifests (die
Package.appxmanifest
Datei), in der die AppDisplay name
standardmäßig als Zeichenfolgenliteral ausgedrückt wird.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.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).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
Erstellen Sie eine Kopie Ihrer Ressourcendatei (.resw) für eine andere Sprache.
- Erstellen Sie unter „Zeichenketten“ einen neuen Unterordner, und nennen Sie ihn „de-DE“ für Deutsch (Deutschland).
Hinweis
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 OrdnerStrings/de-DE
.Übersetzen Sie die Zeichenketten.
- Ö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
- Öffnen Sie
Wenn Sie möchten, können Sie die Schritte 1 und 2 für eine weitere Sprache wiederholen.
Strings/fr-FR/Resources.resw
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).
Hinweis
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.
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.resw
als ./<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.
var resourceLoader = new Microsoft.Windows.ApplicationModel.Resources.ResourceLoader("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 = new Microsoft.Windows.ApplicationModel.Resources.ResourceLoader("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 (beim Erstellen eines ResourceLoader erhalten) enthält einen Qualifiziererwert für jeden Qualifizierernamen, der den Standardlaufzeitkontext darstellt (d.h. die Einstellungen für den aktuellen Benutzer und den aktuellen 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 erstellen, dessen Werte übergehen und dann dieses Kontextobjekt in Ihren Zeichenketten-Verweisen verwenden.
var resourceManager = new Microsoft.Windows.ApplicationModel.Resources.ResourceManager();
var resourceContext = resourceManager.CreateResourceContext();
resourceContext.QualifierValues["Language"] = "de-DE";
var resourceMap = resourceManager.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" };
Laden von Zeichenketten aus einer Klassenbibliothek
Die Zeichenfolgenressourcen einer referenzierten Klassenbibliothek werden in der Regel in einen Unterordner des Pakets hinzugefügt, in dem sie während des Buildprozesses enthalten sind. 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 = new Microsoft.Windows.ApplicationModel.Resources.ResourceLoader("ContosoControl/Resources");
this.myXAMLTextBlockElement.Text = resourceLoader.GetString("exampleResourceName");
Wenn Sie Zweifel an dem Pfad 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 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. Weitere Informationen finden Sie auch unter URI-Schemata in der UWP-Dokumentation.
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 Windows App SDK-Benutzersteuerelemente/-bibliotheken, und speichern Sie alle Zeichenketten in einer Ressourcendatei. Sie können dann auf einen Zeichenketten-Ressourcenbezeichner aus XAML verweisen, auf einen String-Ressourcenbezeichner aus dem Code verweisen oder Strings aus einer Klassenbibliothek laden.
Wenn Sie Ressourcen in ungepackten Anwendungen verwenden möchten, sollten Sie einige Aktionen ausführen:
- Verwenden Sie den überschriebenen Konstruktor von ResourceManager, um den Dateinamen der .pri-Datei Ihrer App zu übernehmen, wenn Sie Ressourcen aus dem Code auflösen, da es in ungepackten Szenarien keine Standardansicht gibt.
- 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 (überprüfen Sie die Standardkonfiguration für diese Vorgehensweise), um PRIs, die aus Projektverweise, NuGet-Verweisen usw. gefunden wurden, zusammenzuführen, die sich im Projektstamm befinden.
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/).
- Ausführen von
- Kopieren Sie die PRI-Datei in das Buildausgabeverzeichnis der .exe-Datei.
- 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 Windows App SDK-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
Siehe auch
Windows developer