Freigeben über


Lokalisierung

Browse sample. Beispiel ansehen

Lokalisierung ist der Prozess, bei dem eine Anwendung an die jeweilige Sprache oder die kulturellen Anforderungen eines Zielmarkts angepasst wird. Damit die Lokalisierung erfolgreich ist, müssen der Text und die Bilder in einer App möglicherweise in mehrere Sprachen übersetzt werden. Eine lokalisierte App zeigt den übersetzten Text automatisch basierend auf den Kultureinstellungen des Geräts an.

.NET enthält einen integrierten Mechanismus zum Lokalisieren von Apps mithilfe von Ressourcendateien. Eine Ressourcendatei speichert Text und andere Inhalte als Name/Wert-Paare, mit denen die Anwendung Inhalte für einen bereitgestellten Schlüssel abrufen kann. Mithilfe von Ressourcendateien können lokalisierte Inhalte vom App-Code getrennt werden. Neben Text können Ressourcendateien auch Bilder und binäre Daten speichern. Geräte verfügen jedoch über unterschiedliche Bildschirmgrößen und Bildschirmdichten und jede mobile Plattform hat Funktionen zum Anzeigen von dichteabhängigen Bildern. Deshalb sollten die Funktionen der Plattform verwendet werden, um Bilder zu lokalisieren, anstatt diese in Ressourcendateien zu speichern.

Um eine .NET Multi-Platform App UI (.NET MAUI)-App zu lokalisieren, sollten Sie:

  1. Ressourcendateien zum Speichern von Zeichenfolgen erstellen. Weitere Informationen finden Sie unter Ressourcendateien erstellen, um Zeichenfolgen zu speichern.
  2. Geben Sie die neutrale Sprache der App an. Weitere Informationen finden Sie unter Neutrale Sprache der App festlegen.
  3. Plattform einrichten. Weitere Informationen finden Sie unter Durchführen der Plattformeinrichtung.
  4. Text lokalisieren. Weitere Informationen finden Sie unter Text lokalisieren.
  5. Bilder lokalisieren. Weitere Informationen finden Sie unter Bilder lokalisieren.
  6. App-Namen lokalisieren. Weitere Informationen finden Sie unter App-Namen lokalisieren.
  7. Tests lokalisieren. Weitere Informationen finden Sie unter Tests lokalisieren.

Darüber hinaus kann die Layoutrichtung einer App angegeben werden. Weitere Informationen finden Sie unter Lokalisieren von links nach rechts.

Ressourcendateien zum Speichern von Zeichenfolgen erstellen

.NET-Ressourcendateien sind XML-Dateien mit der Erweiterung .resx, die während des Buildprozesses in binäre Ressourcendateien (.resources) kompiliert werden. Eine lokalisierte App enthält in der Regel eine Standard-Ressourcendatei mit allen in der Anwendung verwendeten Zeichenfolgen sowie Ressourcendateien für die einzelnen unterstützten Sprachen.

Ressourcendateien enthalten die folgenden Informationen für jedes Element:

  • Name gibt den Schlüssel für den Zugriff auf den Text im Code an.
  • Value (Wert) gibt den übersetzten Text an.
  • Comment (Kommentar) ist ein optionales Feld, das zusätzliche Informationen enthält.

Eine Ressourcendatei wird mit dem Dialogfeld Neues Element hinzufügen in Visual Studio hinzugefügt:

Screenshot of adding a resource file in Visual Studio.

Nachdem die Datei hinzugefügt wurde, können Zeilen für jede Textressource hinzugefügt werden:

Screenshot of the default strings for the app.

Die Dropdown-Einstellung Zugriffsmodifizierer bestimmt, wie Visual Studio die zum Zugriff auf Ressourcen verwendete Klasse generiert. Wenn der Zugriffsmodifizierer auf öffentlich oder intern festgelegt wird, wird eine generierte Klasse mit angegebener Zugriffsebene erstellt. Wenn der Zugriffsmodifizierer auf Keine Codegenerierung festgelegt wird, wird keine Klassendatei erstellt. Die Standard-Ressourcendatei sollte konfiguriert werden, um eine Klassendatei zu generieren. Das führt dazu, dass eine Datei mit der Erweiterung .designer.cs zum Projekt hinzugefügt wird.

Nachdem die Standard-Ressourcendatei erstellt wurde, können für jedes Gebietsschema, das von der App unterstützt wird, zusätzliche Dateien erstellt werden. Jede zusätzliche Ressourcendatei sollte denselben Stammdateinamen wie die Standard-Ressourcendatei aufweisen, aber auch die Sprache und optionale Kultur im Dateinamen enthalten. Wenn Sie z. B. eine Ressourcendatei mit dem Namen AppResources.resx hinzufügen, können Sie auch Ressourcendateien mit dem Namen AppResources.en-US.resx und AppResources.fr-FR.resx erstellen, um lokalisierte Ressourcen für die englische (USA) und französische (Frankreich) Kultur zu halten. Darüber hinaus sollten Sie den Zugriffsmodifizierer für jede zusätzliche Ressourcendatei auf Keine Codegenerierung festlegen.

Zur Runtime versucht die Anwendung, eine Ressourcenanforderung in der Spezifikationsreihenfolge aufzulösen. Wenn die Gerätekultur z. B. en-US ist, sucht die Anwendung nach Ressourcendateien in dieser Reihenfolge:

  1. AppResources.en-US.resx
  2. AppResources.en.resx
  3. AppResources.resx (Standard)

Der folgende Screenshot zeigt eine spanische Übersetzungsdatei mit dem Namen AppResources.es.resx:

Screenshot of the Spanish strings for the app.

Die lokalisierte Ressourcendatei verwendet dieselben Name-Werte, die in der Standarddatei angegeben sind, enthält aber spanische Zeichenfolgen in der Spalte Wert. Außerdem wird der Zugriffsmodifizierer auf Keine Codegenerierung festgelegt.

Festlegen der neutralen Sprache der App

Damit .NET-Ressourcendateien ordnungsgemäß funktionieren, muss für die App eine neutrale Sprache angegeben werden. Hierbei handelt es sich um die Sprache, deren Ressourcen verwendet werden, wenn keine Ressourcen für ein Gebietsschema gefunden werden können. So legen Sie die neutrale Sprache der App fest:

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf Ihr .NET MAUI-App-Projekt und wählen Sie Eigenschaften aus.

  2. Wählen Sie die Eigenschaftsseite Paket > Allgemein und wählen Sie die entsprechende Sprache und Kultur aus dem Dropdown-Menü Assemblyneutrale Sprache aus.

    Screenshot of setting the neutral language for the assembly.

  3. Speichern Sie die Änderungen.

Fügen Sie alternativ das <NeutralLanguage>-Element der ersten <PropertyGroup> in der Projektdatei hinzu und geben Sie das ausgewählte Gebietsschema als Wert an:

<NeutralLanguage>en-US</NeutralLanguage>

Warnung

Wenn Sie eine neutrale Sprache angeben, gibt die ResourceManager-Klasse null-Werte für alle Sprachen ohne Ressourcendatei zurück. Wenn eine neutrale Sprache angegeben wird, gibt die ResourceManager-Klasse Ergebnisse aus der Ressourcendatei für neutrale Sprachen für nicht unterstützte Sprachen zurück. Daher wird empfohlen, immer eine neutrale Sprache anzugeben, damit Text für nicht unterstützte Sprachen angezeigt wird.

Durchführen des Plattformsetups

Zusätzliche Einrichtungsschritte sind für iOS, Mac Catalyst und Windows erforderlich, sodass alle .NET MAUI-Steuerelemente lokalisiert werden.

iOS und Mac Catalyst

Unter iOS und Mac Catalyst müssen Sie für Ihr .NET MAUI-App-Projekt alle unterstützten Sprachen in der Datei Info.plist der Plattform deklarieren. Öffnen Sie dazu die Datei Info.plist für die ausgewählte Plattform in einem XML-Editor, und erstellen Sie ein Array für den Schlüssel CFBundleLocalizations. Stellen Sie dann Arraywerte bereit, die den Ressourcendateien entsprechen. Stellen Sie außerdem sicher, dass Sie eine erwartete Sprache über den CFBundleDevelopmentRegion-Schlüssel festlegen:

<key>CFBundleLocalizations</key>
<array>
    <string>de</string>
    <string>es</string>
    <string>fr</string>
    <string>ja</string>
    <string>pt</string> <!-- Brazil -->
    <string>pt-PT</string> <!-- Portugal -->
    <string>ru</string>
    <string>zh-Hans</string>
    <string>zh-Hant</string>
</array>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>

Sie können auch über den Projektmappen-Explorer in Visual Studio die Datei Info.plist für Ihre ausgewählte Plattform im generischen PList-Editor öffnen. Erstellen Sie dann ein Array für den Schlüssel CFBundleLocalizations und stellen Sie Arraywerte bereit, die den Ressourcendateien entsprechen. Stellen Sie außerdem sicher, dass Sie eine erwartete Sprache über den CFBundleDevelopmentRegion-Schlüssel festlegen:

Screenshot of the supported locales for the app in the generic Info.plist editor.

Weitere Informationen zur Datei Info.plist finden Sie in der Liste der Informationseigenschaften.

Windows

Um mehrere Sprachen in einer .NET MAUI-App unter Windows zu unterstützen, müssen Sie jede unterstützte Sprache in der Datei Platforms\Windows\Package.appxmanifest Ihres .NET MAUI-App-Projekts deklarieren:

  1. Öffnen Sie die Datei Package.appxmanifest in einem Texteditor, und suchen Sie den folgenden Abschnitt:

    <Resources>
        <Resource Language="x-generate"/>
    </Resources>
    
  2. Ersetzen Sie <Resource Language="x-generate"> durch <Resource />-Elemente für jede von Ihnen unterstützte Sprache:

    <Resources>
        <Resource Language="en-US"/>
        <Resource Language="de-DE"/>
        <Resource Language="es-ES"/>
        <Resource Language="fr-FR"/>
        <Resource Language="ja-JP"/>
        <Resource Language="pt-BR"/>
        <Resource Language="pt-PT"/>
        <Resource Language="ru-RU"/>
        <Resource Language="zh-CN"/>
        <Resource Language="zh-TW"/>
    </Resources>
    
  3. Speichern Sie die Änderungen.

Lokalisieren von Text

Text wird mithilfe einer Klasse lokalisiert, die aus der Standardressourcendatei generiert wird. Diese Klasse wird basierend auf dem Namen der Standardressourcendatei benannt. Bei einem Standard-Ressourcendateinamen von AppResources.resx generiert Visual Studio eine passende Klasse namens AppResources, die statische Eigenschaften für jeden Eintrag in der Ressourcendatei enthält.

In XAML kann lokalisierter Text mithilfe der x:Static-Markuperweiterung abgerufen werden, um auf die generierten statischen Eigenschaften zuzugreifen:

<ContentPage ...
             xmlns:strings="clr-namespace:LocalizationDemo.Resources.Strings">
    <VerticalStackLayout>
        <Label Text="{x:Static strings:AppResources.NotesLabel}" />
        <Entry Placeholder="{x:Static strings:AppResources.NotesPlaceholder}" />
        <Button Text="{x:Static strings:AppResources.AddButton}" />
    </VerticalStackLayout>
</ContentPage>

Weitere Informationen zur x:Static-Markuperweiterung finden Sie unter x:Static-Markuperweiterung.

Lokalisierter Text kann auch im Code abgerufen werden:

Label notesLabel = new Label();
notesLabel.Text = AppResources.NotesLabel,

Entry notesEntry = new Entry();
notesEntry.Placeholder = AppResources.NotesPlaceholder,

Button addButton = new Button();
addButton.Text = AppResources.AddButton,

Die Eigenschaften in der Klasse AppResources verwenden den Eigenschaftswert CurrentUICulture, um zu bestimmen, aus welcher Ressourcendatei Werte abgerufen werden sollen.

Lokalisieren von Bildern

Neben Text können Ressourcendateien auch Bilder und binäre Daten speichern. Geräte verfügen jedoch über unterschiedliche Bildschirmgrößen und Bildschirmdichten und jede mobile Plattform hat Funktionen zum Anzeigen von dichteabhängigen Bildern. Deshalb sollten die Funktionen der Plattform verwendet werden, um Bilder zu lokalisieren, anstatt diese in Ressourcendateien zu speichern.

Android

Unter Android werden lokalisierte Bilder, auch als zeichenbare Ressourcen bekannt, mithilfe einer ordnerbasierten Namenskonvention im Ordner Platforms\Android\Resources gespeichert. Ordner sollten den Namen drawable erhalten, mit einem Suffix für die jeweilige Sprache und Kultur. Zum Beispiel wird der Sprachordner für Spanisch drawable-es genannt. Der Ordnername drawable sollte die Bilder für Ihre Standardsprache und -kultur enthalten. Die Buildaktion jedes Bilds sollte auf AndroidResource festgelegt werden.

Hinweis

Anstatt einzelne Dateien auf die Buildaktion AndroidResource festzulegen, kann der Inhalt eines bestimmten Ordners auf diese Buildaktion festgelegt werden, indem der folgende XML-Code zur Projektdatei (.CSPROJ) Ihrer App hinzugefügt wird:

<ItemGroup Condition="$(TargetFramework.Contains('-android'))">
  <AndroidResource Include="Platforms\Android\Resources\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

In diesem Beispiel werden alle Inhalte im Ordner Platforms\Android\Resources, einschließlich Inhalten in Unterordnern, auf die AndroidResource-Buildaktion festgelegt. Außerdem wird mit dieser Buildaktion der Ausgabepfad für jede Datei festgelegt.

Beim Angeben einer Sprache auf oberster Ebene, z. B. es, sind nur zwei Zeichen im Ordnernamen erforderlich. Wenn Sie jedoch ein vollständiges Gebietsschema angeben, erfordert das Ordnernamenformat einen Gedankenstrich und einen Kleinbuchstaben r um die Sprache von der Kultur zu trennen. Beispielsweise sollte der Ordner für das Gebietsschema für Mexiko (es-MX) drawable-es-rMX genannt werden. Der Bilddateiname muss in jedem Gebietsschemaordner identisch sein.

Screenshot of the localized folder structure in Visual Studio for images on Android.

iOS

Unter iOS werden lokalisierte Bilder mithilfe einer ordnerbasierten Namenskonvention im Ordner Platforms\iOS\Resources gespeichert. Ordner sollten mit der Sprache und optionaler Kultur benannt werden, gefolgt von .lproj. Zum Beispiel wird der Sprachordner für Spanisch es.lproj genannt. Die Buildaktion jedes Bilds sollte auf BundleResource festgelegt werden.

Hinweis

Anstatt einzelne Dateien auf die BundleResource-Buildaktion festzulegen, kann der Inhalt eines bestimmten Ordners auf diese Buildaktion festgelegt werden, indem der folgende XML-Code zur Projektdatei ihrer App (.csproj) hinzugefügt wird:

<ItemGroup Condition="$(TargetFramework.Contains('-ios'))">
  <BundleResource Include="Platforms\iOS\Resources\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

In diesem Beispiel werden alle Inhalte im Ordner Platforms\iOS\Resources, einschließlich Inhalte in Unterordnern, auf die Buildaktion BundleResource festgelegt. Außerdem wird mit dieser Buildaktion der Ausgabepfad für jede Datei festgelegt.

Beim Angeben einer Sprache auf oberster Ebene, z. B. es, sind nur zwei Zeichen im Ordnernamen erforderlich. Beim Angeben eines vollständigen Gebietsschemas erfordert das Ordnernamenformat jedoch einen Gedankenstrich, um die Sprache von der Kultur zu trennen. Beispielsweise sollte der Gebietsschemaordner für Mexico (es-MX) es-MX.lproj heißen. Der Bilddateiname muss in jedem Gebietsschemaordner identisch sein.

Screenshot of the localized folder structure in Visual Studio for images on iOS.

Darüber hinaus müssen Sie in Ihrer Projektdatei die Buildeigenschaft IPhoneResourcePrefix auf den Ordner festlegen, der die lokalisierten Bildordner enthält:

<PropertyGroup Condition="$(TargetFramework.Contains('-ios'))">
  <IPhoneResourcePrefix>Platforms/iOS/Resources</IPhoneResourcePrefix>
</PropertyGroup>

Wenn ein Bild für eine bestimmte Sprache nicht vorhanden ist, greift iOS auf den Standardordner der nativen Sprache zurück und lädt das Bild von dort.

Mac Catalyst

Auf Mac Catalyst werden lokalisierte Bilder mithilfe einer ordnerbasierten Namenskonvention im Ordner Platforms\MacCatalyst\Resources gespeichert. Ordner sollten mit der Sprache und optionaler Kultur benannt werden, gefolgt von .lproj. Zum Beispiel wird der Sprachordner für Spanisch es.lproj genannt. Die Buildaktion jedes Bilds sollte auf BundleResource festgelegt werden.

Hinweis

Anstatt einzelne Dateien auf die BundleResource-Buildaktion festzulegen, kann der Inhalt eines bestimmten Ordners auf diese Buildaktion festgelegt werden, indem der folgende XML-Code zur Projektdatei ihrer App (.csproj) hinzugefügt wird:

<ItemGroup Condition="$(TargetFramework.Contains('-maccatalyst'))">
  <BundleResource Include="Platforms\MacCatalyst\Resources\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

In diesem Beispiel werden alle Inhalte im Ordner Platforms\MacCatalyst\Resources, einschließlich Inhalt in Unterordnern, auf die Buildaktion BundleResource festgelegt. Außerdem wird mit dieser Buildaktion der Ausgabepfad für jede Datei festgelegt.

Beim Angeben einer Sprache auf oberster Ebene, z. B. es, sind nur zwei Zeichen im Ordnernamen erforderlich. Beim Angeben eines vollständigen Gebietsschemas erfordert das Ordnernamenformat jedoch einen Gedankenstrich, um die Sprache von der Kultur zu trennen. Beispielsweise sollte der Gebietsschemaordner für Mexico (es-MX) es-MX.lproj heißen. Der Bilddateiname muss in jedem Gebietsschemaordner identisch sein.

Screenshot of the localized folder structure in Visual Studio for images on MacCatalyst.

Darüber hinaus müssen Sie in Ihrer Projektdatei die Buildeigenschaft IPhoneResourcePrefix auf den Ordner festlegen, der die lokalisierten Bildordner enthält:

<PropertyGroup Condition="$(TargetFramework.Contains('-maccatalyst'))">
  <IPhoneResourcePrefix>Platforms/MacCatalyst/Resources</IPhoneResourcePrefix>
</PropertyGroup>

Wenn ein Bild für eine bestimmte Sprache nicht vorhanden ist, greift Mac Catalyst auf den Standardordner der nativen Sprache zurück und lädt das Bild von dort.

Windows

Unter Windows werden lokalisierte Bilder mithilfe einer ordnerbasierten Namenskonvention im Ordner Platforms\Windows\Assets\Images gespeichert. Ordner sollten mit der Sprache und optionaler Kultur benannt werden. Beispielsweise wird der Ordner für Spanisch es genannt, und der Gebietsschemaordner für Mexiko sollte deshalb es-MX genannt werden. Die Buildaktion der einzelnen Bilder sollte auf Content festgelegt werden.

Hinweis

Anstatt einzelne Dateien auf die Buildaktion Content festzulegen, kann der Inhalt eines bestimmten Ordners auf diese Buildaktion festgelegt werden, indem der folgende XML-Code zur Projektdatei ihrer App (.csproj) hinzugefügt wird:

<ItemGroup Condition="$(TargetFramework.Contains('-windows'))">
  <Content Include="Platforms\Windows\Assets\Images\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

In diesem Beispiel werden alle Inhalte im Ordner Platforms\Windows\Assets\Images, einschließlich Inhalten in Unterordnern, auf die Buildaktion Content festgelegt. Außerdem wird mit dieser Buildaktion der Ausgabepfad für jede Datei festgelegt.

Beim Angeben einer Sprache auf oberster Ebene, z. B. es, sind nur zwei Zeichen im Ordnernamen erforderlich. Beim Angeben eines vollständigen Gebietsschemas erfordert das Ordnernamenformat jedoch einen Gedankenstrich, um die Sprache von der Kultur zu trennen. Beispielsweise sollte der Gebietsschemaordner für Mexico (es-MX) es-MX heißen. Der Bilddateiname muss in jedem Gebietsschemaordner identisch sein.

Screenshot of the localized folder structure in Visual Studio for images on Windows.

Nutzen lokalisierter Bilder

Unter Android, iOS, Mac Catalyst und Windows können lokalisierte Bilder genutzt werden, indem sie die Eigenschaft Source eines Image auf den Dateinamen des Bilds festlegen:

<Image Source="flag.png" />

Damit dies jedoch unter Windows funktioniert, müssen Sie die Projektdatei Ihrer App ändern, wenn Sie für jedes lokalisierte Bild ein <Content />-MSBuild-Element hinzugefügt haben. Dies kann erreicht werden, indem Sie Ihre CSPROJ-Datei ändern, um das <Content />-MSBuild-Element für jedes Bild zu entfernen. Fügen Sie dann das folgende MSBuild-Element hinzu:

<ItemGroup Condition="$(TargetFramework.Contains('-windows'))">
  <Content Include="Platforms\Windows\Assets\Images\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

Dadurch wird sichergestellt, dass alle Bilder in den Unterordnern des Ordners Platforms\Windows\Assets\Imagesin das Stammverzeichnis Ihres App-Pakets kopiert werden.

Lokalisieren des App-Namens

Plattformfunktionen sind erforderlich, um den Namen der App zu lokalisieren.

Android

Unter Android kann der lokalisierte App-Name mithilfe einer ordnerbasierten Namenskonvention im Ordner Platforms\Android\Resources gespeichert werden. Ordner sollten Werte mit einem Suffix für die Sprache und Kultur benannt werden. Zum Beispiel wird der Sprachordner für Spanisch Werte-es genannt. Fügen Sie eine Datei Strings.xml mit einer Buildaktion von AndroidResource zu jedem Ordner hinzu, der eine Zeichenfolge auf den lokalisierten App-Namen festlegt.

Hinweis

Anstatt einzelne Dateien auf die Buildaktion AndroidResource festzulegen, kann der Inhalt eines bestimmten Ordners auf diese Buildaktion festgelegt werden, indem der folgende XML-Code zur Projektdatei (.CSPROJ) Ihrer App hinzugefügt wird:

<ItemGroup Condition="$(TargetFramework.Contains('-android'))">
  <AndroidResource Include="Platforms\Android\Resources\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

In diesem Beispiel werden alle Inhalte im Ordner Platforms\Android\Resources, einschließlich Inhalten in Unterordnern, auf die AndroidResource-Buildaktion festgelegt. Außerdem wird mit dieser Buildaktion der Ausgabepfad für jede Datei festgelegt.

Beim Angeben einer Sprache auf oberster Ebene, z. B. es, sind nur zwei Zeichen im Ordnernamen erforderlich. Wenn Sie jedoch ein vollständiges Gebietsschema angeben, erfordert das Ordnernamenformat einen Gedankenstrich und einen Kleinbuchstaben r um die Sprache von der Kultur zu trennen. Beispielsweise sollte der Ordner für Mexiko (es-MX) values-es-rMX genannt werden.

Jede übersetzbare Zeichenfolge ist ein XML-Element mit der als name-Attribut angegebenen Ressourcen-ID und der übersetzten Zeichenfolge als Wert. Sie müssen die Zeichenfolge gemäß den normalen XML-Regeln escapen, und es muss sich bei name um eine gültige Android-Ressourcen-ID (keine Leerzeichen oder Gedankenstriche) handeln.

Erstellen Sie daher zum Lokalisieren des App-Namens eine Strings.xml-Datei, und fügen Sie ein <string>-Element als untergeordnetes Element eines <resources>-Elements hinzu. Legen Sie dann das name-Attribut auf eine geeignete ID mit der übersetzten Zeichenfolge als Wert fest:

<resources>
    <!-- French -->
    <string name="app_name">Maison</string>
</resources>

Um dann den lokalisierten App-Namen in Ihrer App zu verwenden, fügen Sie die Label-Eigenschaft zu der Activity der MainActivity-Klasse Ihrer App hinzu, und legen ihren Wert auf:@string/id fest:

[Activity(Label = "@string/app_name", Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)]
public class MainActivity : MauiAppCompatActivity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
    }
}

iOS

Unter iOS wird der lokalisierte App-Name mithilfe einer ordnerbasierten Benennungskonvention im Ordner Platforms\iOS\Resources gespeichert. Ordner sollten mit der Sprache und optionaler Kultur benannt werden, gefolgt von .lproj. Zum Beispiel wird der Sprachordner für Spanisch es.lproj genannt. Fügen Sie eine InfoPlist.strings-Datei mit einer Buildaktion von BundleResource zu jedem Ordner hinzu, der den CFBundleDisplayName-Schlüssel und den Wert festlegt.

Hinweis

Anstatt einzelne Dateien auf die BundleResource-Buildaktion festzulegen, kann der Inhalt eines bestimmten Ordners auf diese Buildaktion festgelegt werden, indem der folgende XML-Code zur Projektdatei ihrer App (.csproj) hinzugefügt wird:

<ItemGroup Condition="$(TargetFramework.Contains('-ios'))">
  <BundleResource Include="Platforms\iOS\Resources\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

In diesem Beispiel werden alle Inhalte im Ordner Platforms\iOS\Resources, einschließlich Inhalte in Unterordnern, auf die Buildaktion BundleResource festgelegt. Außerdem wird mit dieser Buildaktion der Ausgabepfad für jede Datei festgelegt.

Die Syntax für lokalisierte Zeichenfolgenwerte lautet:

/* comment */
"key"="localized-value";

Sie sollten die folgenden Zeichen in Zeichenfolgen escapen:

  • Zitat von \"
  • \\ umgekehrter Schrägstrich
  • \n Zeilenumbruch

Erstellen Sie daher zum Lokalisieren des App-Namens eine Datei InfoPlist.strings und fügen Sie einen Wert für den CFBundleDisplayName-Schlüssel zur Datei hinzu:

/* French */
CFBundleDisplayName="Maisons";

Andere Schlüssel, die Sie zum Lokalisieren appspezifischer Zeichenfolgen verwenden können, sind:

  • CFBundleName - gibt den Kurznamen des App-Bündels an, das Benutzern in Situationen angezeigt werden kann, z. B. das Fehlen eines Werts für CFBundleDisplayName.
  • CFBundleShortVersionString - gibt die Versionsnummer des App-Bündels an.
  • NSHumanReadableCopyright - der Copyright-Hinweis für das App-Bündel.

Darüber hinaus müssen Sie in Ihrer Projektdatei die IPhoneResourcePrefix Buildeigenschaft auf den Ordner festlegen, der die lokalisierten Ordner enthält:

<PropertyGroup Condition="$(TargetFramework.Contains('-ios'))">
  <IPhoneResourcePrefix>Platforms/iOS/Resources</IPhoneResourcePrefix>
</PropertyGroup>

Mac Catalyst

Auf Mac Catalyst wird der lokalisierte App-Name mithilfe einer ordnerbasierten Benennungskonvention im Ordner Platforms\MacCatalyst\Resourcesgespeichert. Ordner sollten mit der Sprache und optionaler Kultur benannt werden, gefolgt von .lproj. Zum Beispiel wird der Sprachordner für Spanisch es.lproj genannt. Fügen Sie eine InfoPlist.strings-Datei mit einer Buildaktion von BundleResource zu jedem Ordner hinzu, der den CFBundleDisplayName-Schlüssel und den Wert festlegt.

Hinweis

Anstatt einzelne Dateien auf die BundleResource-Buildaktion festzulegen, kann der Inhalt eines bestimmten Ordners auf diese Buildaktion festgelegt werden, indem der folgende XML-Code zur Projektdatei ihrer App (.csproj) hinzugefügt wird:

<ItemGroup Condition="$(TargetFramework.Contains('-maccatalyst'))">
  <BundleResource Include="Platforms\MacCatalyst\Resources\**" TargetPath="%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

In diesem Beispiel werden alle Inhalte im Ordner Platforms\MacCatalyst\Resources, einschließlich Inhalt in Unterordnern, auf die Buildaktion BundleResource festgelegt. Außerdem wird mit dieser Buildaktion der Ausgabepfad für jede Datei festgelegt.

Die Syntax für lokalisierte Zeichenfolgenwerte lautet:

/* comment */
"key"="localized-value";

Sie sollten die folgenden Zeichen in Zeichenfolgen escapen:

  • Zitat von \"
  • \\ umgekehrter Schrägstrich
  • \n Zeilenumbruch

Erstellen Sie daher zum Lokalisieren des App-Namens eine Datei InfoPlist.strings und fügen Sie einen Wert für den CFBundleDisplayName-Schlüssel zur Datei hinzu:

/* French */
CFBundleDisplayName="Maisons";

Andere Schlüssel, die Sie zum Lokalisieren appspezifischer Zeichenfolgen verwenden können, sind:

  • CFBundleName - gibt den Kurznamen des App-Bündels an, der Benutzern in Situationen wie z. B. das Fehlen eines Werts für CFBundleDisplayName angezeigt werden kann.
  • CFBundleShortVersionString - gibt die Versionsnummer des App-Bündels an.
  • NSHumanReadableCopyright - der Copyright-Hinweis für das App-Bündel.

Darüber hinaus müssen Sie in Ihrer Projektdatei die IPhoneResourcePrefix Buildeigenschaft auf den Ordner festlegen, der die lokalisierten Ordner enthält:

<PropertyGroup Condition="$(TargetFramework.Contains('-maccatalyst'))">
  <IPhoneResourcePrefix>Platforms/MacCatalyst/Resources</IPhoneResourcePrefix>
</PropertyGroup>

Windows

Unter Windows wird der App-Name im App-Paketmanifest definiert. Zum Lokalisieren des App-Namens müssen Sie zuerst die Standardsprache für die App angeben und dann eine Zeichenfolgenressourcendatei für jedes Gebietsschema erstellen, das Sie unterstützen möchten. Die Zeichenfolgenressource, die den lokalisierten App-Namen darstellt, kann dann im App-Paketmanifest mithilfe des ms-resource-URI-Schemas verwendet werden.

Weitere Informationen zum Lokalisieren von Zeichenfolgen im App-Paketmanifest finden Sie unter Lokalisieren von Zeichenfolgen in der Benutzeroberfläche und im App-Paketmanifest.

Angeben der Standardsprache

Um einen App-Namen zu lokalisieren, muss für ihre Windows-App zuerst eine Standardsprache angegeben sein. Die Ressourcen dieser Sprache werden verwendet, wenn keine lokalisierten Ressourcen für eine bestimmte Sprache gefunden werden. So geben Sie die Standardsprache an:

  1. Um den Lösungsexplorer anzuzeigen, öffnen Siedie Datei Packageappxmanifest im .Paketmanifest-Editor.

  2. Legen Sie im Paketmanifest-Editor auf der Registrierkarte Anwendung dasFeld Standardsprache auf die ausgewählte Standardsprache fest:

    Screenshot of setting the default language of a Windows app in the package manifest.

  3. Speichern Sie die Änderungen.

Sie müssen mindestens eine Zeichenfolgenressource für den App-Namen für die Standardsprache angeben. Dies ist die Ressource, die geladen wird, wenn für die bevorzugten Sprach- oder Anzeigespracheneinstellungen des Benutzers keine bessere Übereinstimmung gefunden werden kann.

Erstellen von Windows-Ressourcendateien

Unter Windows sollte der lokalisierte App-Name in einer Windows-Ressourcendatei für jedes Gebietsschema gespeichert werden. Eine Windows-Ressourcendatei ist eine XML-Datei mit der Erweiterung .resw, die in einem Binärformat kompiliert und in einer .pri-Datei gespeichert ist. Die .resw-Datei für jedes Gebietsschema sollte den Namen Resources.resw haben und mithilfe einer ordnerbasierten Benennungskonvention im Ordner Platforms\Windows\Strings gespeichert werden. Ordner sollten mit der Sprache und optionaler Kultur benannt werden. Beispielsweise wird der Ordner für Spanisch es genannt, und der Gebietsschemaordner für Mexiko sollte deshalb es-MX genannt werden.

Zurzeit gibt es keine Visual Studio-Elementvorlage zum Erstellen einer Windows-Ressourcendatei in einer .NET MAUI-App. So erstellen Sie eine Windows-Ressourcendatei für jedes Gebietsschema:

  1. Erstellen Sie im Ordner Plattformen\Windows Ihres .NET MAUI-App-Projekts einen Ordner Strings.

  2. Erstellen Sie im Ordner Strings einen Ordner für jedes Gebietsschema.

  3. Erstellen Sie im Ordner für jedes Gebietsschema eine Datei namens Resources.resw, die den folgenden XML-Code enthält:

    <?xml version="1.0" encoding="utf-8"?>
    <root>
      <!--
        Microsoft ResX Schema
    
        Version 2.0
    
        The primary goals of this format is to allow a simple XML format
        that is mostly human readable. The generation and parsing of the
        various data types are done through the TypeConverter classes
        associated with the data types.
    
        Example:
    
        ... ado.net/XML headers & schema ...
        <resheader name="resmimetype">text/microsoft-resx</resheader>
        <resheader name="version">2.0</resheader>
        <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
        <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
        <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
        <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
        <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
            <value>[base64 mime encoded serialized .NET Framework object]</value>
        </data>
        <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
            <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
            <comment>This is a comment</comment>
        </data>
    
        There are any number of "resheader" rows that contain simple
        name/value pairs.
    
        Each data row contains a name, and value. The row also contains a
        type or mimetype. Type corresponds to a .NET class that support
        text/value conversion through the TypeConverter architecture.
        Classes that don't support this are serialized and stored with the
        mimetype set.
    
        The mimetype is used for serialized objects, and tells the
        ResXResourceReader how to depersist the object. This is currently not
        extensible. For a given mimetype the value must be set accordingly:
    
        Note - application/x-microsoft.net.object.binary.base64 is the format
        that the ResXResourceWriter will generate, however the reader can
        read any of the formats listed below.
    
        mimetype: application/x-microsoft.net.object.binary.base64
        value   : The object must be serialized with
                : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
                : and then encoded with base64 encoding.
    
        mimetype: application/x-microsoft.net.object.soap.base64
        value   : The object must be serialized with
                : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
                : and then encoded with base64 encoding.
    
        mimetype: application/x-microsoft.net.object.bytearray.base64
        value   : The object must be serialized into a byte array
                : using a System.ComponentModel.TypeConverter
                : and then encoded with base64 encoding.
        -->
      <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
        <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
        <xsd:element name="root" msdata:IsDataSet="true">
          <xsd:complexType>
            <xsd:choice maxOccurs="unbounded">
              <xsd:element name="metadata">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element name="value" type="xsd:string" minOccurs="0" />
                  </xsd:sequence>
                  <xsd:attribute name="name" use="required" type="xsd:string" />
                  <xsd:attribute name="type" type="xsd:string" />
                  <xsd:attribute name="mimetype" type="xsd:string" />
                  <xsd:attribute ref="xml:space" />
                </xsd:complexType>
              </xsd:element>
              <xsd:element name="assembly">
                <xsd:complexType>
                  <xsd:attribute name="alias" type="xsd:string" />
                  <xsd:attribute name="name" type="xsd:string" />
                </xsd:complexType>
              </xsd:element>
              <xsd:element name="data">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                    <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
                  </xsd:sequence>
                  <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
                  <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
                  <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
                  <xsd:attribute ref="xml:space" />
                </xsd:complexType>
              </xsd:element>
              <xsd:element name="resheader">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                  </xsd:sequence>
                  <xsd:attribute name="name" type="xsd:string" use="required" />
                </xsd:complexType>
              </xsd:element>
            </xsd:choice>
          </xsd:complexType>
        </xsd:element>
      </xsd:schema>
      <resheader name="resmimetype">
        <value>text/microsoft-resx</value>
      </resheader>
      <resheader name="version">
        <value>2.0</value>
      </resheader>
      <resheader name="reader">
        <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
      </resheader>
      <resheader name="writer">
        <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
      </resheader>
    </root>
    

    Hinweis

    Windows-Ressourcendateien verwenden eine Buildaktion von PRIResource. Diese Buildaktion benötigt keine Einstellung für jede .resw-Datei in einer .NET MAUI-App, da sie implizit angewendet wird.

  4. Öffnen Sie jede Datei Resources.resw, und fügen Sie eine Zeichenfolgenressource hinzu, die den Namen der App darstellt:

    Screenshot of the resw file editor in Visual Studio on Windows.

    Hinweis

    Bei Ressourcenbezeichnern wird die Groß-/Kleinschreibung nicht beachtet und muss pro Ressourcendatei eindeutig sein.

  5. Speichern Sie jede Windows-Ressourcendatei.

Ein Beispiel für die erforderliche Ordner- und Dateistruktur ist im folgenden Screenshot dargestellt:

Screenshot of the localized folder structure in Visual Studio for strings on Windows.

Verwenden des lokalisierten App-Namens

Die Zeichenfolgenressource, die den lokalisierten App-Namen darstellt, kann mithilfe des ms-resource-URI-Schemas verwendet werden:

  1. Um den Lösungsexplorer anzuzeigen, öffnen Siedie Datei Packageappxmanifest im .Paketmanifest-Editor.

  2. Legen Sie im Paketmanifest-Editor auf der Registrierkarte Anwendung das Feld Anzeigename auf ms-resource: fest, gefolgt vom Namen der Zeichenfolgenressource, die Ihren App-Namen identifiziert:

    Screenshot of setting the localized app name in the package manifest on Windows.

  3. Speichern Sie die Änderungen.

Wichtig

Wenn Ihre RESW-Dateien in einer anderen Assembly in Ihrem .NET MAUI-App-Projekt gespeichert sind, müssen Sie einen vollqualifizierten Pfad zu Ihrem Ressourcennamen angeben. Dabei wird folgendes Format verwendet: ms-resource:Assembly/ResourceFilename/Resource.

Lokalisierung von rechts nach links

Die Flussrichtung oder Layout-Richtung ist die Richtung, in der Benutzeroberflächenelemente auf der Seite vom Auge abgelesen werden. In einigen Sprachen wie Arabisch und Hebräisch werden Benutzeroberflächenelemente von rechts nach links geschrieben. .NET MAUI-Apps respektieren die Flussrichtung des Geräts automatisch basierend auf der ausgewählten Sprache und Region. Informationen zum Abrufen der Flussrichtung des Geräts basierend auf dem Gebietsschema finden Sie unter Abrufen der Layoutrichtung.

Legen Sie die Eigenschaft Window.FlowDirection fest, um die Flussrichtung einer App außer Kraft zu setzen, Alternativ können Sie die Eigenschaft VisualElement.FlowDirection pro Element festlegen. Diese Eigenschaft ruft die Flussrichtung von Benutzeroberflächenelementen ab oder legt diese innerhalb aller übergeordneten Elemente fest, die das Layout steuern. Daher muss sie auf einen der FlowDirection-Enumerationswerte festgelegt werden:

  • LeftToRight
  • RightToLeft
  • MatchParent

Wenn Sie die Eigenschaft FlowDirection für ein Element auf RightToLeft festlegen, wird die Ausrichtung in der Regel rechtsseitig und die Leserichtung und das Layout des Steuerelements von rechts nach links festgelegt:

Warnung

Wenn die Eigenschaft FlowDirection zur Laufzeit geändert wird, hat dies einen teuren Layoutvorgang zur Folge, der die Leistung beeinträchtigt.

Der Standard-FlowDirection-Eigenschaftswert für ein Element ist MatchParent. Aus diesem Grund erbt ein Element den Wert der FlowDirection-Eigenschaft vom übergeordneten Element in der visuellen Struktur, und alle Elemente können den vom übergeordneten Element geerbten Wert auch überschreiben.

Tipp

Wenn Sie die Flussrichtung ändern müssen, legen Sie die Eigenschaft FlowDirection für ein Fenster, eine Seite oder ein Stammlayout fest. Dadurch werden alle Elemente auf der App, Seite oder im Stammlayout der Flussrichtung entsprechend ausgerichtet.

Plattformeinrichtung

Es ist eine bestimmte Plattformkonfiguration erforderlich, um die Gebietsschemas zu ermöglichen, in denen von rechts nach links gelesen wird.

Android

Apps, die mit der .NET MAUI-App-Projektvorlage erstellt wurden, enthalten automatisch Unterstützung für Gebietsschemas von rechts nach links. Diese Unterstützung wird durch das android:supportsRtl-Attribut aktiviert, das auf dem <application>-Knoten in der Datei AndroidManifest.xml der App auf true festgelegt wird:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application ... android:supportsRtl="true" />
    ...
</manifest>

Die Lokalisierung von rechts nach links kann getestet werden, indem das Gerät oder der Emulator auf die Verwendung der Sprache von rechts nach links umgestellt wird. Alternativ können Sie, wenn Sie Entwickleroptionen in der Einstellungen-App aktiviert haben, unter Einstellungen > Entwickleroptionen die Option RTL-Layoutrichtung erzwingen aktivieren. Informationen zum Konfigurieren von Entwickleroptionen finden Sie unter Konfigurieren von Entwickleroptionen auf dem Gerät auf developer.android.com.

iOS und Mac Catalyst

Das erforderliche Gebietsschema, in dem von rechts nach links gelesen wird, sollte als unterstützte Sprache zu den Arrayelementen für den CFBundleLocalizations-Schlüssel in Info.plist hinzugefügt werden. Im folgenden Beispiel wird gezeigt, wie dem Array für den CFBundleLocalizations-Schlüssel Arabisch hinzugefügt wurde:

<key>CFBundleLocalizations</key>
<array>
    <string>en</string>
    <string>ar</string>
</array>

Die Lokalisierung von rechts nach links kann dann getestet werden, indem Sie die Sprache und die Region auf dem Gerät/Simulator in ein Gebietsschema ändern, in dem von rechts nach links gelesen wird und das in Info.plist angegeben wurde.

Windows

Die erforderlichen Sprachressourcen sollten im <Resources>-Knoten der Datei Package.appxmanifest angegeben sein. Ersetzen Sie <Resource Language="x-generate"> für jede Ihrer unterstützten Sprachen durch <Resource />-Elemente. Das folgende Markup gibt beispielsweise an, dass lokalisierte Ressourcen für „en“ und „ar“ verfügbar sind:

<Resources>
    <Resource Language="en" />
    <Resource Language="ar" />
</Resources>

Die Lokalisierung von rechts nach links kann getestet werden, indem Sie die Sprache und die Region auf dem Gerät in das richtige Rechts-nach-Links-Gebietsschema ändern.

Lokalisieren von Tests

Zur Laufzeit werden von einer App die passenden lokalisierten Ressourcen auf Threadbasis entsprechend der Kultur geladen, die von der Eigenschaft CurrentUICulture angegeben wird.

Das Testen der Lokalisierung erfolgt am besten durch Ändern der Gerätesprache in der Einstellungs-App der einzelnen Geräte.

Warnung

Es ist möglich, den Wert von CurrentUICulture im Code zu setzen, jedoch ist das Verhalten plattformübergreifend inkonsistent und daher für Tests nicht empfehlenswert.