Локализация справа налево
Локализация справа налево поддерживает направление потока справа налево в приложениях Xamarin.Forms.
Примечание.
Локализация справа налево требует использования iOS 9 или более поздней версии и API 17 или более поздней версии в Android.
Направление потока — это направление, в котором глаз человека перемещается по элементам пользовательского интерфейса на странице. Некоторые языки, такие как арабский и иврит, требуют, чтобы элементы пользовательского интерфейса располагались в направлении справа налево. Чтобы реализовать это, можно задать свойство VisualElement.FlowDirection
. Оно возвращает или задает направление, в котором элементы пользовательского интерфейса следуют в родительском элементе, определяющем их размещение. Для этого свойства следует задать одно из значений перечисления FlowDirection
:
Установка для свойства FlowDirection
значения RightToLeft
в элементе в общем случае указывает выравнивание по правому краю, порядок чтения справа налево и поток элементов управления справа налево:
Совет
Сначала свойство FlowDirection
следует задать только в начальном макете. Изменение этого значения во время выполнения приводит к ресурсоемкому процессу, который негативно влияет на производительность.
Значением свойства FlowDirection
по умолчанию для элемента без родительского объекта является LeftToRight
, а FlowDirection
по умолчанию для элемента с родительским объектом — MatchParent
. Таким образом, элемент наследует значение свойства FlowDirection
от своего родительского элемента в визуальном дереве, и любой элемент может переопределить значение, которое он получает от своего родительского объекта.
Совет
При локализации приложения на языки с направлением потока справа налево задайте свойство FlowDirection
на странице или в корневом макете. В результате все элементы, содержащиеся на странице или в корневом макете, должным образом реагируют на направление потока.
Соблюдение направления потока устройства
Соблюдение направления потока устройства в зависимости от выбранного языка и региона является явным выбором разработчика и не происходит автоматически. Это можно сделать, задав для свойства FlowDirection
на странице или в корневом макете значение static
Device.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>
Подробнее об этом см. в разделе Основы локализации в 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 следующим образом:
Объявите функцию
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);
Перед возвратом из метода
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