Lokalisierung von rechts nach links

Durch die Lokalisierung von rechts nach links kann Text in Xamarin.Forms-Anwendungen in der Leserichtung von rechts nach links dargestellt werden.

Hinweis

Für die Lokalisierung von rechts nach links ist iOS 9 oder höher bzw. unter Android API 17 oder höher erforderlich.

Die Leserichtung ist die Richtung, in der Benutzeroberflächenelemente auf der Seite vom Auge wahrgenommen werden. In einigen Sprachen wie Arabisch und Hebräisch werden Benutzeroberflächenelemente von rechts nach links geschrieben. Dieses Verhalten wird erreicht, indem Sie die Eigenschaft VisualElement.FlowDirection festlegen. Diese Eigenschaft ruft die Leserichtung von Benutzeroberflächenelementen ab oder legt diese fest, und zwar innerhalb aller übergeordneten Elemente, die das Layout steuern. Daher muss sie auf einen der FlowDirection-Enumerationswerte festgelegt werden:

Wenn Sie die FlowDirection-Eigenschaft 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:

Seite „TodoItemPage“ auf Arabisch mit Leserichtung von rechts nach links

Tipp

Sie sollten nur die Eigenschaft FlowDirection auf das anfängliche Layout festlegen. Wenn dieser Wert zur Laufzeit geändert wird, hat dies einen teuren Layoutvorgang zur Folge, der die Leistung beeinträchtigt.

Der Standardwert der FlowDirection-Eigenschaft für ein Element ohne übergeordnetes Element lautet LeftToRight, während der Standardwert von FlowDirection für ein Element mit übergeordnetem Element MatchParent ist. 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 eine App für Sprachen mit einer Schreibrichtung von rechts nach links lokalisieren, legen Sie die Eigenschaft FlowDirection für die Seite oder das Rootlayout fest. Dadurch werden alle Elemente auf der Seite oder im Rootlayout der Schreibrichtung entsprechend ausgerichtet.

Beachtung der Schreibrichtung des Geräts

Dass die Schreibrichtung auf dem Geräts der ausgewählten Sprache und Region entsprechend beachtet wird, ist eine bewusste Entscheidung der Entwickler und passiert nicht automatisch. Für die richtige Schreibrichtung muss die FlowDirection-Eigenschaft für eine Seite oder ein Rootlayout auf den Wert static Device.FlowDirection festgelegt werden:

<ContentPage ... FlowDirection="{x:Static Device.FlowDirection}"> />
this.FlowDirection = Device.FlowDirection;

Alle untergeordneten Elemente auf der Seite oder im Rootlayout erben in diesem Fall standardmäßig den Device.FlowDirection-Wert.

Plattformeinrichtung

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

iOS

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>

Unterstützte Sprachen für „Info.plist“

Weitere Informationen finden Sie unter Grundlagen der Lokalisierung in iOS.

Die Lokalisierung von rechts nach links kann 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.

Warnung

Beachten Sie, dass beim Ändern der Sprache und der Region in ein Gebietsschema, das von rechts nach links gelesen wird, unter iOS alle DatePicker-Ansichten eine Ausnahme auslösen, wenn Sie die für das Gebietsschema erforderlichen Ressourcen nicht einfügen. Wenn Sie z. B. eine App auf Arabisch testen, die eine DatePicker-Ansicht hat, sollten Sie sicherstellen, dass mideast im Abschnitt Internationalisierung des Bereichs iOS-Build ausgewählt ist.

Android

Die Datei androidmanifest.xml der App sollte aktualisiert werden, damit der <uses-sdk>-Knoten das android:minSdkVersion-Attribut auf 17 und der <application>-Knoten das android:supportsRtl-Attribut auf true festlegt:

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <uses-sdk android:minSdkVersion="17" ... />
    <application ... android:supportsRtl="true">
    </application>
</manifest>

Die Lokalisierung von rechts nach links kann dann getestet werden, indem Sie das Gerät/den Emulator so ändern, dass die Sprache von rechts nach links verwendet wird, oder indem Sie die Layoutrichtung "Erzwingen" in den Entwickleroptionen für Einstellungen > aktivieren.

Universelle Windows-Plattform (UWP)

Die erforderlichen Sprachressourcen sollten im <Resources>-Knoten der Datei Package.appxmanifest angegeben sein. Im folgenden Beispiel wird gezeigt, wie auf dem <Resources>-Knoten Arabisch hinzugefügt wird:

<Resources>
    <Resource Language="x-generate"/>
    <Resource Language="en" />
    <Resource Language="ar" />
</Resources>

Darüber hinaus erfordert die UWP, dass die Standardkultur der Anwendung explizit in der .NET Standard-Bibliothek definiert ist. Legen Sie dazu das NeutralResourcesLanguage-Attribut in AssemblyInfo.cs oder einer anderen Klasse wie folgt auf die Standardkultur fest:

using System.Resources;

[assembly: NeutralResourcesLanguage("en")]

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.

Begrenzungen

Für die Lokalisierung von rechts nach links gelten in Xamarin.Forms derzeit die folgenden Einschränkungen:

  • Die Platzierung der NavigationPage-Schaltfläche, die Platzierung der Symbolleistenelemente und die Übergangsanimation werden durch das Gebietsschema des Geräts und nicht durch die FlowDirection-Eigenschaft gesteuert.
  • Die Wischrichtung von CarouselPage wird nicht umgestellt.
  • Der visuelle Inhalt von Image wird nicht umgestellt.
  • Der Inhalt von WebView berücksichtigt nicht die FlowDirection-Eigenschaft.
  • Für die Steuerung der Textausrichtung muss eine TextDirection-Eigenschaft hinzugefügt werden.

iOS

  • Die Ausrichtung von Stepper wird durch das Gebietsschema des Geräts gesteuert, nicht durch die FlowDirection-Eigenschaft.
  • Die Textausrichtung von EntryCell wird durch das Gebietsschema des Geräts gesteuert, nicht durch die FlowDirection-Eigenschaft.
  • Gesten und die Ausrichtung von ContextActions werden nicht umgekehrt.

Android

  • Die Ausrichtung von SearchBar wird durch das Gebietsschema des Geräts gesteuert, nicht durch die FlowDirection-Eigenschaft.
  • Die Platzierung von ContextActions wird durch das Gebietsschema des Geräts gesteuert, nicht durch die FlowDirection-Eigenschaft.

UWP

  • Die Textausrichtung von Editor wird durch das Gebietsschema des Geräts gesteuert, nicht durch die FlowDirection-Eigenschaft.
  • Die FlowDirection-Eigenschaft wird nicht von den untergeordneten FlyoutPage-Elementen geerbt.
  • Die Textausrichtung von ContextActions wird durch das Gebietsschema des Geräts gesteuert, nicht durch die FlowDirection-Eigenschaft.

Erzwingen des Layouts von rechts nach links

Für Xamarin.iOS- und Xamarin.Android-Anwendungen kann die Verwendung eines Layouts von rechts nach links unabhängig von den Geräteeinstellungen erzwungen werden, indem die entsprechenden Plattformprojekte geändert werden.

iOS

Wenn Sie bei Xamarin.iOS-Anwendungen die Verwendung des Layouts von rechts nach links erzwingen möchten, ändern Sie die Klasse AppDelegate folgendermaßen ab:

  1. Deklarieren Sie die Funktion IntPtr_objc_msgSend als erste Zeile Ihrer AppDelegate-Klasse:

    [System.Runtime.InteropServices.DllImport(ObjCRuntime.Constants.ObjectiveCLibrary, EntryPoint = "objc_msgSend")]
    internal extern static IntPtr IntPtr_objc_msgSend(IntPtr receiver, IntPtr selector, UISemanticContentAttribute arg1);
    
  2. Rufen Sie die Funktion IntPtr_objc_msgSend aus der FinishedLaunching-Methode vor der Rückgabe aus der FinshedLaunching-Methode ab:

    bool result = base.FinishedLaunching(app, options);
    
    ObjCRuntime.Selector selector = new ObjCRuntime.Selector("setSemanticContentAttribute:");
    IntPtr_objc_msgSend(UIView.Appearance.Handle, selector.Handle, UISemanticContentAttribute.ForceRightToLeft);
    
    return result;
    

Diese Vorgehensweise ist für Anwendungen geeignet, die immer ein Layout von rechts nach links benötigen. Dadurch entfällt die Anforderung, die FlowDirection-Eigenschaft festzulegen.

Weitere Informationen zur IntrPtr_objc_msgSend-Methode finden Sie unter Objective-C-Selektoren in Xamarin.iOS.

Android

Wenn Sie bei Xamarin.Android-Anwendungen die Verwendung des Layouts von rechts nach links erzwingen möchten, ändern Sie die Klasse MainActivity so ab, dass sie die folgende Zeile enthält:

Window.DecorView.LayoutDirection = LayoutDirection.Rtl;

Hinweis

Für diesen Ansatz muss die Anwendung so eingerichtet werden, dass sie das RTL-Layout (von rechts nach links) unterstützt. Weitere Informationen finden Sie unter Plattformeinrichtung: Android.

Diese Vorgehensweise ist für Anwendungen geeignet, die immer ein Layout von rechts nach links benötigen. Dadurch entfällt die Anforderung, die FlowDirection-Eigenschaft für die meisten Steuerelemente festzulegen. Einige Steuerelemente wie z. B. CollectionView berücksichtigen die LayoutDirection-Eigenschaft jedoch nicht und erfordern weiterhin, dass die FlowDirection-Eigenschaft festgelegt wird.

Unterstützung für Sprachen in der Xamarin.University, die von rechts nach links gelesen werden

Video zur Rechts-nach-Links-Unterstützung in Xamarin.Forms 3.0