LTR и RTL: что это и как задать направление текста на сайте и в Android

LTR и RTL обозначают направление письма: слева направо и справа налево.

Разбираем, как задать его атрибутом dir, перевести отступы на логические свойства CSS, исправить «прыгающие» знаки через тег bdi и включить отражение интерфейса в Android.

Статью написал:
Ваня Буявец, продюсер, основатель Checkroi
Ваня Буявец
Основатель Checkroi, продюсер, эксперт в выборе онлайн-курсов
Все 2891 статья автора Подписаться на Телеграм-канал
Одобрено экспертом:
Наташа Буявец, основатель Checkroi, эксперт по онлайн-курсам
Наташа Буявец
Основательница Checkroi, продюсер Youtube-каналов, эксперт по онлайн-курсам
Все 3545 экспертных мнений Подписаться на Телеграм-канал
Обложка: LTR и RTL: что это и как задать направление текста на сайте и в Android

LTR и RTL обозначают направление письма. LTR (left-to-right) значит «слева направо», так пишут по-русски и по-английски. RTL (right-to-left) значит «справа налево», так устроены арабское письмо, иврит, персидский и урду. В вёрстке направление задают атрибутом dir="rtl" в HTML, а в Android-приложении флагом android:supportsRtl="true" и атрибутами start/end.

В анкетах на сайтах знакомств у LTR другое значение: long-term relationship, «долгие отношения». А «RTL» в прайсах на видеокарты означает retail, коробочную версию товара. Ниже речь только о тексте и интерфейсах.

CheckroiCheckroiПодборка курсов по CSS182 курса • 37 школСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить→

Что значат LTR и RTL

Рой показывает две стрелки направления текста у доски

Обе аббревиатуры описывают одно: с какой стороны строки начинается текст и куда он течёт. От этого зависит всё остальное. Где стоит выравнивание по умолчанию, с какой стороны иконка в поле ввода, куда указывает стрелка «Назад».

Термин Расшифровка Направление Примеры языков
LTR left-to-right слева направо русский, английский, греческий, хинди
RTL right-to-left справа налево арабский, иврит, персидский, урду, идиш
bidi bidirectional оба направления в одной строке арабская фраза с английским названием или номером телефона

Третья строка таблицы и создаёт большую часть проблем. Чистый RTL-текст браузер и Android отрисуют правильно сами. Ломается смешанный текст, где в арабском или ивритском предложении встречаются латиница, цифры и знаки препинания.

Какие языки пишутся справа налево

Консорциум W3C в руководстве по разметке RTL-текста называет такие письменности с направлением справа налево:

  • арабское письмо: арабский, персидский (фарси), урду, пушту, синдхи;
  • еврейское письмо: иврит и идиш;
  • сирийское письмо;
  • тана (мальдивский язык дивехи);
  • нко и адлам (языки Западной Африки, например мандинка и пулар).

RTL понадобится, если продукт выходит на рынки ОАЭ, Саудовской Аравии, Израиля или Ирана. Перевести строки мало: интерфейс приходится отражать целиком. Этим занимаются вместе разработчик и локализатор.

Канал основателя Checkroi Вани Буявца3 700 человек читают мой Телеграм-канал про нейросетиСобрал промпты для Claude Code и ChatGPT, разборы ИИ-инструментов и лайфхаки по продвижению бизнеса в одном местеПрисоединиться

Как задать направление текста в HTML

Направление в вебе задают разметкой. W3C прямо советует не ставить базовое направление через CSS: оно должно работать, даже если стили не загрузились.

Атрибут dir на всю страницу

Если весь документ на арабском или иврите, атрибут ставят на корневой тег вместе с языком:

<html lang="ar" dir="rtl">

Все блоки внутри наследуют направление. Отдельный фрагмент на другом языке получает свой dir, например <p dir="ltr"> для цитаты на английском внутри арабской страницы.

Вот как атрибут работает в Chrome 154. Одинаковые строки на русском и иврите выведены в двух блоках: слева с dir="ltr", справа с dir="rtl".

Атрибут dir в HTML: одинаковые строки на русском и иврите в блоках LTR и RTL
В RTL-блоке восклицательный знак и точка у русских фраз ушли в начало строки, а ивритская фраза ломается так же в LTR-блоке. Кадр из Chrome 154.

Обратите внимание на знаки в конце строк. В RTL-блоке русская фраза превратилась в «!Привет, мир», а точка уехала в начало строки «Заказ № 15 готов». Ивритская фраза в LTR-блоке ломается зеркально. Почему так происходит, разберём ниже.

Значение auto для текста пользователей

Отзывы, сообщения в чате и поля форм заранее неизвестно на каком языке. Для них есть значение auto: браузер берёт направление по первой «сильной» букве.

<p dir="auto">Отзыв на русском языке</p>      <!-- ltr -->
<p dir="auto">مراجعة باللغة العربية</p>       <!-- rtl -->
<p dir="auto">2026 — שנה טובה</p>           <!-- rtl -->

Третья строка показательна. Она начинается с цифр, но цифры направления не задают, поэтому браузер смотрит дальше и находит иврит. В Chrome 154 вычисленное значение direction у трёх строк ровно такое, как в комментариях.

Решение подходит не всегда. Если сообщение начинается с арабского слова, а дальше идёт английский текст, auto развернёт всю строку справа налево.

Тег bdi для вставленных имён

<bdi> изолирует кусок текста: его направление не влияет на соседей. Это главный инструмент для имён пользователей, названий товаров и любых строк, которые подставляет сервер. Справка MDN описывает элемент bdi на таком же примере.

Тег bdi в HTML: арабское имя без изоляции и внутри bdi
Без bdi цифра 3 уехала в начало строки, с bdi порядок правильный.

Слева строка без изоляции: арабское имя притянуло к себе двоеточие и цифру, и «3» уехала в начало строки. Справа то же имя внутри <bdi>, и порядок правильный. Разметка исправленной строки:

<p><bdi>إيان</bdi>: 3 комментария</p>

Для обратной задачи есть <bdo dir="rtl">. Он принудительно разворачивает символы и нужен редко, например для демонстрации или когда текст уже хранится в «визуальном» порядке.

Атрибуты dir, lang и теги вроде <bdi> относятся к базовой семантической разметке. Если хотите разобрать её системно, посмотрите курсы по HTML.

Направление в CSS: direction и логические свойства

Свойство direction: rtl в CSS существует, но для контента его не используют: направление уже задано атрибутом dir. Основная работа CSS в RTL другая. Отступы и выравнивание должны переворачиваться вместе с текстом. Для этого есть логические свойства. Как они работают, хорошо видно в справке MDN по margin-inline-start.

Физическое свойство Логическая замена Что значит
margin-left margin-inline-start отступ с начала строки
margin-right margin-inline-end отступ с конца строки
padding-left / padding-right padding-inline-start / padding-inline-end внутренние поля по направлению текста
left: 0 inset-inline-start: 0 позиция от начала строки
text-align: left text-align: start выравнивание по началу строки
border-top-left-radius border-start-start-radius скругление в начальном углу

Разницу видно на простой карточке с иконкой. В левой колонке отступ задан через margin-right, в правой через margin-inline-end.

Логические свойства CSS: margin-right и margin-inline-end в карточке RTL
С margin-right текст в RTL-карточке прилип к иконке, с margin-inline-end отступ в 16 px встал между ними сам.

В RTL-версии с физическим свойством отступ остался справа от круга, то есть снаружи карточки, и текст прилип к иконке: зазор между ними 0 px. С логическим свойством отступ в 16 px переехал на нужную сторону без отдельного правила для RTL.

Flexbox и Grid уже логические. justify-content: flex-start и порядок колонок сетки сами следуют направлению текста. Ломаются обычно старые правила на left/right, абсолютное позиционирование и иконки, нарисованные «стрелкой вправо». Если вы адаптируете вёрстку медиа-запросами, логические свойства пишутся внутри них так же. Подробнее о самом языке стилей мы рассказывали в статье «Что такое CSS».

Как проверить зеркальную вёрстку сайта в браузере

Арабский перевод для первой проверки не нужен. Достаточно перевернуть направление у готовой страницы и посмотреть, что сломалось.

  1. Откройте страницу в Chrome и нажмите F12, чтобы открыть инструменты разработчика.
  2. Перейдите на вкладку Console и выполните команду document.documentElement.dir = "rtl".
  3. Пройдите по странице сверху вниз: шапка, меню, формы, карточки, подвал.
  4. Верните направление командой document.documentElement.dir = "ltr" или просто обновите страницу.

Русский текст останется русским, а раскладка перевернётся так же, как у арабской версии. Сразу видно три типа поломок:

  • блоки, которые остались прижаты к левому краю: у них физические left, margin-left или text-align: left;
  • иконки, которые наехали на текст или ушли за край карточки;
  • стрелки и шевроны, которые теперь показывают не туда.

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

Почему «прыгают» знаки препинания и цифры

Порядок символов в строке определяет алгоритм двунаправленного текста Unicode, UAX #9. Он делит символы на группы:

  • сильные: буквы, у каждой своё направление (кириллица и латиница LTR, арабские и ивритские буквы RTL);
  • слабые: цифры и некоторые знаки, они подстраиваются под окружение;
  • нейтральные: пробелы и большая часть пунктуации, они берут направление соседей или всего абзаца.

Восклицательный знак в конце «Привет, мир!» нейтрален. В RTL-абзаце его не с чем связать справа, поэтому он получает направление абзаца и встаёт в его конец, а конец RTL-строки находится слева.

Решение: дать фрагменту правильное направление разметкой (dir, <bdi>). Если разметку поставить нельзя (заголовок окна, push-уведомление, строка в базе), помогают невидимые символы Unicode:

Символ Код HTML Когда ставить
Left-to-right mark (LRM) U+200E &lrm; после LTR-фрагмента внутри RTL-текста, чтобы знак остался с ним
Right-to-left mark (RLM) U+200F &rlm; после RTL-фрагмента внутри LTR-текста
Ваня БуявецКанал основателя Checkroi Вани БуявцаЗабирайте промпты и обучение по нейросетям в моём Телеграм-каналеБольше 3 700 человек уже применяют Claude Code, ChatGPT и другие нейросети в работе, учёбе, бизнесе и жизниПерейти в канал

Как отразить интерфейс Android-приложения

Рой радуется, что интерфейс на телефоне отразился правильно

Встроенное отражение интерфейса появилось в Android 4.2 (API 17). По умолчанию оно выключено, и без флага приложение на арабском языке останется в LTR-раскладке. Работа с локализацией входит в обычные задачи Android-разработчика. Порядок действий по документации Android:

  1. В AndroidManifest.xml добавьте атрибут в тег application: android:supportsRtl="true".
  2. В разметке замените left/right на start/end. Так раскладка будет следовать языку пользователя.
  3. Простые векторные иконки со стрелками пометьте android:autoMirrored="true" (с Android 4.4). Сложные рисунки, где отражение меняет смысл, готовьте отдельной версией.
  4. Строки, которые подставляются в шаблон перевода, оборачивайте через BidiFormatter.unicodeWrap(). Пример на Kotlin ниже.

Соответствие атрибутов в разметке:

Было (только LTR) Стало (LTR и RTL)
android:paddingLeft android:paddingStart
android:layout_marginRight android:layout_marginEnd
android:gravity="left" android:gravity="start"
android:drawableLeft android:drawableStart
android:layout_alignParentRight android:layout_alignParentEnd
android:layout_toLeftOf android:layout_toStartOf

Если в разметке заданы обе пары и приложение нацелено на API 17 и выше, Android использует start/end, а left/right игнорирует.

Зачем BidiFormatter

Документация разбирает случай с адресом «15 Bay Street, Laurel, CA» внутри фразы на иврите. Система не знает, к какой части относится «15», и номер дома уезжает не туда. Это та же проблема, что с «3 комментария» в вебе, и лечится она так:

val mySuggestion = "15 Bay Street, Laurel, CA"
val myBidiFormatter: BidiFormatter = BidiFormatter.getInstance()

String.format(getString(R.string.did_you_mean), myBidiFormatter.unicodeWrap(mySuggestion))

unicodeWrap() определяет направление строки и обрамляет её служебными символами Unicode. Исключений два: машинные строки вроде URI и SQL-запросов и текст, который уже обёрнут.

Ресурсы и локализацию Android подробно разбирают на курсах по Android-разработке.

Как проверить отражение без знания арабского

  • Псевдолокаль AR (XB) разворачивает обычные английские строки справа налево. Включается в build.gradle для отладочной сборки: pseudoLocalesEnabled true (в Kotlin DSL isPseudoLocalesEnabled = true), работает с Android 4.3.
  • Принудительное отражение в параметрах разработчика, с Android 4.4. В английском интерфейсе пункт называется Force RTL layout direction, в русской локализации AOSP «Отразить интерфейс». У прошивок производителей подпись может отличаться.

Что отражать в интерфейсе, а что оставить как есть

Зеркальный макет интерфейса со стрелками и часами

Переворачивать нужно не всё. В рекомендациях Material Design о двунаправленности элементы делятся на две группы.

Отражаются:

  • порядок навигационных кнопок и вкладок;
  • иконки в полях ввода, они переходят на другую сторону;
  • стрелки и всё, что показывает направление движения: «Назад», «Вперёд», хлебные крошки;
  • прогресс-бары, они заполняются в сторону чтения;
  • отступы вокруг иконок и текста.

Не отражаются:

  • цифры, в том числе на часах и в номерах телефонов;
  • непереведённый текст: адрес сайта или английское название остаются LTR;
  • графики и диаграммы.

Частые ошибки при вёрстке справа налево

Симптом Причина Что сделать
Знак препинания в начале строки нейтральный символ взял направление абзаца правильный dir у фрагмента или символ LRM/RLM
Цифра или имя «уехали» в строке подставленная строка смешалась с окружением <bdi> в вебе, BidiFormatter.unicodeWrap() в Android
Текст прилип к иконке отступ задан через margin-left/margin-right логические свойства margin-inline-*
Флаг supportsRtl стоит, а раскладка не отражается в разметке остались left/right заменить на start/end
Стрелка «Назад» показывает вперёд иконка не помечена для отражения autoMirrored или отдельная RTL-версия
Направление пропадает без стилей RTL задан только через direction в CSS атрибут dir в HTML

Ещё одна частая ошибка относится к тестированию: интерфейс проверяют только на коротких английских строках. Перевод бывает заметно длиннее оригинала, а списки и таблицы с длинными ячейками в RTL ломаются заметнее всего. Проверяйте на реальных переводах или хотя бы на псевдолокали.

Где освоить вёрстку системно

Направление текста стоит на стыке CSS, разметки и локализации. Если хочется разобраться в вёрстке целиком, от основ HTML до логических свойств и адаптивности, посмотрите программы с отзывами и ценами в каталоге курсов по CSS.

КурсШколаСтоимость со скидкойВ рассрочкуДлитель­ностьОбзор курса от Checkroi
HTML и CSS с нуля
Перейти на сайт курса
SkillboxSkillbox91 626 ₽7635 ₽/мес.11 месяцевОбзор курса
HTML и CSS. Адаптивная вёрстка и автоматизация
Перейти на сайт курса
HTMLAcademyHTML Academy23 400 ₽3900 ₽/мес.2 месяцаОбзор курса
Основы вёрстки HTML и CSS
Перейти на сайт курса
Академия СинергияАкадемия Синергия32 676 ₽2723 ₽/мес.3 месяцаОбзор курса
HTML и CSS с нуляSkyproSkypro195 160 ₽7972 ₽/мес.12 месяцевОбзор курса
Frontend-разработчик: сайты на HTML/CSS/JavaScript
Перейти на сайт курса
CoddyCoddy9200 ₽ - 3 месяцаОбзор курса

Больше программ — в полном каталоге курсов по CSS

Часто задаваемые вопросы

Что значит LTR?

LTR (left-to-right) означает направление письма слева направо, так пишут по-русски и по-английски. В вёрстке это значение по умолчанию для атрибута dir. В анкетах на сайтах знакомств у аббревиатуры другое значение: long-term relationship, долгие отношения.

Что такое RTL в программировании?

RTL (right-to-left) обозначает направление текста справа налево для арабского, иврита, персидского и урду. На сайте его задают атрибутом dir="rtl" на теге html, в Android-приложении включают флагом android:supportsRtl="true" и атрибутами start/end в разметке.

Какие языки пишутся справа налево?

Арабский, персидский (фарси), урду, пушту, синдхи, иврит, идиш, сирийский, дивехи, а также языки на письменностях нко и адлам. Список письменностей приводит W3C в руководстве по разметке RTL-текста.

Чем атрибут dir отличается от свойства direction в CSS?

Атрибут dir задаёт направление в самой разметке и работает, даже если стили не загрузились, поэтому W3C советует использовать для контента именно его. Свойство direction в CSS делает то же визуально, но зависит от таблицы стилей. Отступы под RTL лучше переводить на логические свойства CSS.

Что значит RTL на видеокарте или в прайсе магазина?

В названиях комплектующих RTL означает retail, коробочную версию товара с упаковкой и комплектом поставки. К направлению текста это обозначение отношения не имеет.

Как быстро проверить сайт в режиме RTL?

Откройте страницу в Chrome, нажмите F12 и выполните в консоли document.documentElement.dir = "rtl". Раскладка перевернётся, и сразу станет видно блоки с физическими отступами, наехавшие иконки и стрелки, которые смотрят не туда.

Читайте Checkroi первым в Google
Добавьте Checkroi в избранные источники — и наши разборы курсов и обзоры школ будут показываться выше в вашей выдаче Google.
Оставить комментарий
0 комментариев
Форма комментария

Оставьте комментарий

Напишите, что думаете. Нам важно ваше мнение!