Работа с языками с письмом справа налево
Compose Multiplatform поддерживает языки с письмом справа налево (RTL), такие как арабский, иврит и персидский. Фреймворк автоматически обрабатывает большинство требований RTL и при использовании языков с письмом справа налево корректирует макеты, выравнивание и поведение ввода текста в соответствии с настройками локали системы.
Зеркальное отображение макета
Если в системе настроена локаль языка с письмом справа налево, Compose Multiplatform автоматически зеркально отображает большинство компонентов пользовательского интерфейса. Корректировки включают изменение внутренних отступов, выравнивания и положения компонентов:
Внутренние и внешние отступы, выравнивание
Стандартные внутренние отступы и выравнивание меняются на противоположные. Например, вModifier.padding(start: Dp, top: Dp, end: Dp, bottom: Dp)внутренний отступstartдля LTR соответствует левой стороне, а отступend— правой; в языках RTLstartсоответствует правой стороне, аend— левой.Выравнивание компонентов
Для таких элементов пользовательского интерфейса, как текст, элементы навигации и значки, стандартное выравниваниеStartв режиме RTL меняется наEnd.Горизонтально прокручиваемые списки
В горизонтальных списках меняются на противоположные выравнивание элементов и направление прокрутки.Расположение кнопок
Типичные шаблоны пользовательского интерфейса, например расположение кнопок Отмена и Подтвердить, адаптируются к требованиям RTL.
Принудительное задание направления макета
Иногда необходимо сохранять исходную ориентацию некоторых элементов пользовательского интерфейса, например логотипов или значков, независимо от направления макета. Можно явно задать направление макета для всего приложения или отдельных компонентов, переопределив стандартное поведение макета, основанное на локали системы.
Чтобы исключить элемент из автоматического зеркального отображения и задать для него определенную ориентацию, используйте LayoutDirection.Rtl или LayoutDirection.Ltr. Чтобы задать направление макета в рамках области видимости, используйте CompositionLocalProvider(): это гарантирует, что направление макета будет применяться ко всем дочерним компонентам композиции.
CompositionLocalProvider(LocalLayoutDirection provides LayoutDirection.Ltr) {
Column(modifier = Modifier.fillMaxWidth()) {
// Components in this block will be laid out left-to-right
Text("LTR Latin")
TextField("Hello world\nHello world")
}
}
Ввод текста в макетах RTL
Compose Multiplatform поддерживает различные сценарии ввода текста в макетах RTL, включая содержимое со смешанным направлением, специальные символы, числа и эмодзи.
При разработке приложения с поддержкой макета RTL учитывайте следующие аспекты. Их тестирование поможет выявить потенциальные проблемы локализации.
Поведение курсора
Курсор должен предсказуемо вести себя в макетах RTL и перемещаться в соответствии с логическим направлением символов. Например:
При вводе текста на арабском курсор перемещается справа налево, а при вставке текста LTR — слева направо.
Операции выделения, удаления и вставки текста учитывают естественное направление текста.
Двунаправленный текст
Compose Multiplatform использует алгоритм двунаправленного текста Unicode для обработки и отображения двунаправленного текста (BiDi), корректно выравнивая знаки препинания и числа.
Текст должен отображаться в ожидаемом визуальном порядке: знаки препинания и числа должны быть правильно выровнены, арабское письмо должно идти справа налево, а английское — слева направо.
В следующем тестовом примере содержится текст с латинскими и арабскими буквами, а также их двунаправленное сочетание:
Compose Multiplatform также обеспечивает правильное выравнивание и интервалы в сложных случаях BiDi, в том числе при переносе текста на несколько строк и вложении двунаправленного текста.
Числа и эмодзи
Отображение чисел должно соответствовать направлению окружающего текста. Восточно-арабские цифры естественно выравниваются в тексте RTL, а западно-арабские цифры ведут себя как обычно в тексте LTR.
Эмодзи должны адаптироваться к контекстам RTL и LTR, сохраняя правильное выравнивание и интервалы в тексте.
В следующем тестовом примере используются эмодзи, восточно- и западно-арабские цифры, а также двунаправленный текст:
Шрифты для веб-платформ
Веб-платформы не имеют встроенных шрифтов для отображения символов некоторых языков, например арабского и китайского. Чтобы решить эту проблему, необходимо добавить резервные шрифты в ресурсы и предварительно загрузить их, поскольку автоматически они не подключаются.
Чтобы предварительно загрузить резервные шрифты, используйте метод FontFamily.Resolver.preload(). Например:
val fontFamilyResolver = LocalFontFamilyResolver.current
val fontsLoaded = remember { mutableStateOf(false) }
if (fontsLoaded.value) {
app.Content()
}
LaunchedEffect(Unit) {
val notoEmojisBytes = loadEmojisFontAsBytes()
val fontFamily = FontFamily(listOf(Font("NotoColorEmoji", notoEmojisBytes)))
fontFamilyResolver.preload(fontFamily)
fontsLoaded.value = true
}
Подробные сведения о предварительной загрузке ресурсов для веб-платформ см. в разделе о API предварительной загрузки.
Специальные возможности в макетах RTL
Compose Multiplatform поддерживает специальные возможности для макетов RTL, включая правильное направление и порядок текста для программ экранного доступа, а также обработку жестов.
Программы экранного доступа
Программы экранного доступа автоматически адаптируются к макетам RTL, сохраняя логический порядок чтения для пользователей:
Текст RTL читается справа налево, а текст со смешанным направлением — в соответствии со стандартными правилами BiDi.
Знаки препинания и числа озвучиваются в правильной последовательности.
В сложных макетах необходимо задавать семантику обхода, чтобы программы экранного доступа соблюдали правильный порядок чтения.
Навигация с помощью фокуса
Навигация с помощью фокуса в макетах RTL следует зеркально отображенной структуре макета:
Фокус перемещается справа налево и сверху вниз, следуя естественному потоку содержимого RTL.
Жесты, например свайпы или касания, автоматически адаптируются к зеркально отображенному макету.
Также можно задать семантику обхода, чтобы обеспечить правильную навигацию между различными группами обхода с помощью жестов специальных возможностей — свайпов вверх или вниз.
Подробные сведения о том, как задавать семантику обхода и устанавливать индексы обхода, см. в разделе «Специальные возможности».
Известные проблемы
Мы продолжаем улучшать поддержку языков RTL и планируем устранить следующие известные проблемы:
© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/multiplatform/compose-rtl.html