Локализация справа налево

Локализация справа налево поддерживает направление потока справа налево в приложениях Xamarin.Forms.

Примечание.

Локализация справа налево требует использования iOS 9 или более поздней версии и API 17 или более поздней версии в Android.

Направление потока — это направление, в котором глаз человека перемещается по элементам пользовательского интерфейса на странице. Некоторые языки, такие как арабский и иврит, требуют, чтобы элементы пользовательского интерфейса располагались в направлении справа налево. Чтобы реализовать это, можно задать свойство VisualElement.FlowDirection. Оно возвращает или задает направление, в котором элементы пользовательского интерфейса следуют в родительском элементе, определяющем их размещение. Для этого свойства следует задать одно из значений перечисления FlowDirection:

Установка для свойства FlowDirection значения RightToLeft в элементе в общем случае указывает выравнивание по правому краю, порядок чтения справа налево и поток элементов управления справа налево:

TodoItemPage на арабском языке с написанием справа налево

Совет

Сначала свойство FlowDirection следует задать только в начальном макете. Изменение этого значения во время выполнения приводит к ресурсоемкому процессу, который негативно влияет на производительность.

Значением свойства FlowDirection по умолчанию для элемента без родительского объекта является LeftToRight, а FlowDirection по умолчанию для элемента с родительским объектом — MatchParent. Таким образом, элемент наследует значение свойства FlowDirection от своего родительского элемента в визуальном дереве, и любой элемент может переопределить значение, которое он получает от своего родительского объекта.

Совет

При локализации приложения на языки с направлением потока справа налево задайте свойство FlowDirection на странице или в корневом макете. В результате все элементы, содержащиеся на странице или в корневом макете, должным образом реагируют на направление потока.

Соблюдение направления потока устройства

Соблюдение направления потока устройства в зависимости от выбранного языка и региона является явным выбором разработчика и не происходит автоматически. Это можно сделать, задав для свойства FlowDirection на странице или в корневом макете значение staticDevice.FlowDirection:

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

После этого все дочерние элементы страницы или корневого макета по умолчанию унаследуют значение Device.FlowDirection.

Настройка платформы

Для включения языковых стандартов с направлением потока справа налево требуется настройка конкретной платформы.

iOS

Требуемый языковой стандарт с направлением потока справа налево необходимо добавить в качестве поддерживаемого языка в элементы массива для ключа CFBundleLocalizations в файле Info.plist. В следующем примере показано добавление арабского языка в массив для ключа CFBundleLocalizations:

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

Поддерживаемые языки Info.plist

Подробнее об этом см. в разделе Основы локализации в iOS.

После этого локализацию справа налево можно протестировать, изменив язык и регион на устройстве или симуляторе на языковой стандарт с направлением потока справа налево, который был указан в Info.plist.

Предупреждение

Следует учитывать, что при изменении языка и региона на языковой стандарт с направлением потока справа налево в iOS любые представления DatePicker вызовут исключение, если не включить ресурсы, необходимые для этого языкового стандарта. Например, при тестировании приложения на арабском языке, имеющего DatePicker, убедитесь, что в разделе Интернационализация области Сборка iOS выбрано значение Ближний Восток.

Android

Файл AndroidManifest.xml приложения нужно обновить, чтобы узел <uses-sdk> задавал значение 17 для атрибута android:minSdkVersion, а узел <application> задавал значение true для атрибута android:supportsRtl:

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

Затем можно протестировать локализацию справа налево, изменив устройство или эмулятор для использования языка справа налево или включив направлениемакета RTL в Параметры > параметрах разработчика.

Универсальная платформа Windows (UWP)

Необходимые языковые ресурсы следует указать в узле <Resources> файла Package.appxmanifest. В следующем примере показано добавление арабского языка в узел <Resources>:

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

Кроме того, универсальная платформа Windows требует, чтобы язык и региональные параметры приложения по умолчанию были явно определены в библиотеке .NET Standard. Это можно сделать, задав язык и региональные параметры по умолчанию для атрибута NeutralResourcesLanguage в AssemblyInfo.cs или в другом классе:

using System.Resources;

[assembly: NeutralResourcesLanguage("en")]

После этого локализацию справа налево протестировать, изменив язык и регион на устройстве на соответствующий языковой стандарт с направлением потока справа налево.

Ограничения

Сейчас локализация справа налево Xamarin.Forms имеет ряд ограничений:

  • Расположение кнопок NavigationPage, расположение элементов панели инструментов и анимация переходов определяются языковым стандартом устройства, а не свойством FlowDirection.
  • Направление прокрутки CarouselPage не перевертывается.
  • Визуальное содержимое Image не перевертывается.
  • Содержимое WebView не учитывает свойство FlowDirection.
  • Требуется добавить свойство TextDirection для управления выравниванием текста.

iOS

  • Ориентация Stepper определяется языковым стандартом устройства, а не свойством FlowDirection.
  • Выравнивание текста EntryCell определяется языковым стандартом устройства, а не свойством FlowDirection.
  • Жесты и выравнивание ContextActions невозможно обратить.

Android

  • Ориентация SearchBar определяется языковым стандартом устройства, а не свойством FlowDirection.
  • Расположение ContextActions определяется языковым стандартом устройства, а не свойством FlowDirection.

UWP

  • Выравнивание текста Editor определяется языковым стандартом устройства, а не свойством FlowDirection.
  • Свойство FlowDirection не наследуется дочерними объектами FlyoutPage.
  • Выравнивание текста ContextActions определяется языковым стандартом устройства, а не свойством FlowDirection.

Принудительное использование макета с написанием справа налево

В приложениях Xamarin.iOS и Xamarin.Android можно на постоянной основе принудительно использовать макет с написанием справа налево независимо от параметров устройства, изменив соответствующие проекты платформы.

iOS

В приложениях Xamarin.iOS можно на постоянной основе принудительно использовать макет с написанием справа налево, изменив класс AppDelegate следующим образом:

  1. Объявите функцию IntPtr_objc_msgSend как первую строку в классе AppDelegate:

    [System.Runtime.InteropServices.DllImport(ObjCRuntime.Constants.ObjectiveCLibrary, EntryPoint = "objc_msgSend")]
    internal extern static IntPtr IntPtr_objc_msgSend(IntPtr receiver, IntPtr selector, UISemanticContentAttribute arg1);
    
  2. Перед возвратом из метода FinshedLaunching вызовите функцию IntPtr_objc_msgSend из метода FinishedLaunching:

    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;
    

Такой подход удобен для приложений, которым постоянно требуется макет с написанием справа налево, и устраняет необходимость задавать свойство FlowDirection.

Дополнительные сведения о методе IntrPtr_objc_msgSend см. в разделе Селекторы Objective-C в Xamarin.iOS.

Android

В приложениях Xamarin.Android можно на постоянной основе принудительно использовать макет с написанием справа налево, включив в класс MainActivity следующую строку:

Window.DecorView.LayoutDirection = LayoutDirection.Rtl;

Примечание.

Этот подход требует, чтобы приложение было настроено для поддержки макета с написанием справа налево. Дополнительные сведения см. в разделе Настройка платформы Android.

Такой подход удобен для приложений, которым постоянно требуется макет с написанием справа налево, и устраняет необходимость задавать свойство FlowDirection для большинства элементов управления. Однако некоторые элементы управления, такие как CollectionView, не учитывают свойство LayoutDirection, и для них по-прежнему необходимо задавать свойство FlowDirection.

Поддержка языков с направлением потока справа налево с использованием Xamarin.University

Видеоролик о поддержке написания справа налево в Xamarin.Forms 3.0