Поддержка RTL-языков (арабский, иврит) в мобильном приложении

Что нужно знать о поддержке RTL-языков в мобильном приложении Представьте: вы выходите на рынок ОАЭ, запускаете арабскую версию приложения — и получаете шквал негативных отзывов. Меню съехало, кнопки не нажимаются, текст обрезается. Запустив приложение на арабском языке, вы можете столкнуться с т

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

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

Услуги, которые мы предлагаем
Показано 1 из 1Все 1734 услуг
Поддержка RTL-языков (арабский, иврит) в мобильном приложении
Сложный
~3-5 дней

Наши компетенции:

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

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    894
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    782
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1216
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    1079
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    1002
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    597

Что нужно знать о поддержке RTL-языков в мобильном приложении

Представьте: вы выходите на рынок ОАЭ, запускаете арабскую версию приложения — и получаете шквал негативных отзывов. Меню съехало, кнопки не нажимаются, текст обрезается. Запустив приложение на арабском языке, вы можете столкнуться с тем, что кнопка «Назад» указывает вправо, а слайды приезжают слева. Пользователи привыкли к обратному порядку — и это вызывает когнитивный диссонанс. Без корректной RTL-поддержки даже функционально одинаковое приложение воспринимается как сломанное, что приводит к снижению удержания на 30% (данные наших проектов). Мы адаптировали более 20 проектов под арабский и иврит и знаем все подводные камни. Наша команда готова взять на себя полный аудит и реализацию RTL-поддержки под ключ.

Простая смена локали и установка layoutDirection = rtl — это лишь 20% работы. Остальное — ручная адаптация каждого компонента: иконок, анимаций, навигации, текста и даже жестов (например, свайпы). Вот что на самом деле ломается:

Компонент iOS Android Flutter React Native
Иконки SF Symbols с RTL-вариантом работают, но кастомные PNG — нет autoMirrored="true" для VectorDrawable, BitmapDrawable не зеркалится Directionality не влияет на CustomPainter I18nManager.isRTL для условного рендеринга
Анимации UIView.animate с абсолютными координатами Animator с translationX требует проверки layoutDirection SlideTransition с initialOffsetX — ручная логика Animated.timing с useNativeDriver не зеркалится
Текст NSTextAlignment.natural зеркалится, .left — нет textAlignment="viewStart" для TextView textDirection: TextDirection.rtl для Text textAlign: 'auto' вместо 'left'
Навигация UINavigationController зеркалит кнопку «назад» автоматически ActionBar требует android:supportsRtl="true" Navigator автоматически, но кастомные переходы — нет ReactNavigation требует ручной настройки

Наш подход с кастомными флиппинг-трансформами в 2 раза быстрее традиционного переписывания всех экранов под RTL с нуля и сокращает время доработки на 40%. Это позволяет сэкономить 30–50% бюджета по сравнению с полной переработкой. Мы используем автоматизированные тесты для проверки зеркальности, что позволяет выявлять ошибки на ранних этапах и снижать затраты на QA.

Почему стандартное RTL-решение не покрывает все кейсы?

Подробная таблица выше показывает типичные проблемы. Добавим, что на iOS кастомные draw() и Core Graphics требуют conditional flipping, чтобы зеркалировать содержимое. На Android autoMirrored работает только для VectorDrawable, но не для BitmapDrawable. В Flutter Directionality не влияет на CustomPainter, поэтому приходится вручную применять canvas.scale(-1, 1). В React Native важно проверять версию: на Android I18nManager.isRTL работает только в RN >=0.63, иначе нужен forceRTL с перезагрузкой.

Как мы реализуем RTL-поддержку?

  1. Аудит. Запускаем приложение на арабской локали через adb shell setprop persist.sys.locale ar-AE (Android) и Settings → General → Language & Region (iOS Simulator). Это выявляет 80% проблем. Фиксируем артефакты на каждом экране — в среднем 10–15 на приложение из 50 экранов.

  2. Классификация. Делим проблемы на 4 типа: layout, иконки, текст, анимации. Для каждого типа — свой рецепт исправления. Например, для иконок применяем conditional flipping, для анимаций — замену абсолютных координат на относительные.

  3. Правки. На iOS переписываем кастомные draw() под conditional flipping, используем UIView.appearance(whenContainedInInstancesOf:) для системного наследования semanticContentAttribute. На Android заменяем left/right на start/end в XML и программно через MarginLayoutParamsCompat. Для Flutter зеркалируем CustomPainter через canvas.scale(-1, 1). Для React Native — проверяем I18nManager.isRTL в каждом компоненте.

  4. Тестирование. Обязательно на реальных устройствах: Samsung с One UI меняет поведение VectorDrawable, а на старых версиях iOS UIView.appearance может не сработать. Добавляем скриншотные тесты с RTL-локалями в CI. Запускаем на 3–4 физических девайсах, чтобы покрыть 95% кейсов.

Подробнее о тестировании

Используем XCTest с XCUIRemote для симуляции жестов и проверки зеркальности. На Android — Espresso с DeviceLocale для переключения локали. Интегрируем Firebase Test Lab для тестирования на реальных устройствах в облаке.

Какие услуги входят в RTL-адаптацию?

  • Полный аудит кода и артефактов на всех экранах
  • Исправление layout, иконок, текста, анимаций
  • Адаптация кастомных компонентов (Canvas, Core Graphics, CustomPainter)
  • Настройка бэкенд-интеграции для передачи RTL-контекста
  • Ручное тестирование на 4+ реальных устройствах
  • Интеграция RTL-скриншот-тестов в CI/CD
  • Документация по поддержке RTL для команды

Сколько времени занимает RTL-доработка на каждой платформе?

Платформа Аудит (дни) Правки (дни) Тестирование (дни) Итого
iOS 1–2 2–3 1 4–6
Android 1–2 2–4 1 4–7
Flutter 1 1–2 0.5 2–3.5
React Native 1 2–3 0.5 3–4.5

Какие типичные ошибки допускают при RTL-разработке?

  • Жёстко заданный textAlign: 'left' в кастомных компонентах вместо 'auto' или 'start'
  • transform: [{scaleX: -1}] применён к иконке без проверки I18nManager.isRTL — иконка зеркалируется всегда
  • Локализация чисел: ١٢٣ (eastern arabic numerals) vs 123 — зависит от контекста отображения, нужно явно задавать NSLocale / Locale
  • Бидирекциональный текст (арабский + английское название): NSAttributedString с явным NSWritingDirectionAttributeName, иначе порядок слов ломается

Как закладывать RTL на этапе проектирования?

Лучший способ — использовать start/end вместо left/right с самого начала, избегать абсолютных координат в анимациях и проверять кастомные Drawable на autoMirrored. Если проект уже готов — мы проведём аудит и устраним все несоответствия. Наши инженеры гарантируют корректную работу на арабском и иврите на всех поддерживаемых устройствах с чистым сопровождаемым кодом.

Не дайте вашим пользователям потеряться в зеркальном лабиринте — свяжитесь с нами для консультации по RTL-аудиту. Закажите консультацию — мы рассчитаем сроки и стоимость. Инвестиции окупятся в течение 2-3 месяцев после выхода на рынок.

Apple рекомендует использовать UIView.appearance() для наследования семантических атрибутов; подробнее см. RTL (Right-to-Left) на Wikipedia.