Перейти к содержанию
Innovialabs

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

Практика3 мин

Коротко

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

Коротко о главном

Локализация — это не перевод готового приложения в конце проекта, а архитектурное решение. Если с первого дня все тексты лежат в ресурсах, а даты, числа и валюты форматируются с учётом локали, добавить новый язык — это работа переводчика, а не переделка экранов.

Где хранить строки

ПлатформаФорматМножественные числа
iOSString Catalog (.xcstrings); в старых проектах Localizable.stringsВнутри String Catalog; раньше .stringsdict
Androidres/values-<язык>/strings.xml<plurals> в том же файле
FlutterARB-файлы и flutter gen-l10nICU-синтаксис в ARB
React NativeJSON через библиотеку вроде i18nextПравила библиотеки

Правила, общие для всех платформ:

  • Ключ описывает смысл, а не текст: checkout_pay_button, а не button_text_1.
  • Не склеивайте фразы из кусочков: порядок слов в языках разный. Используйте плейсхолдеры: «Заказ %1$s доставлен».
  • Добавляйте комментарий для переводчика: где видна строка и сколько в ней места.
  • Не храните текст в картинках.

Множественные числа

В русском у существительного после числа три формы: «1 товар», «2 товара», «5 товаров». В английском две. В узбекском после числительного существительное остаётся в единственном числе: «5 ta mahsulot». Поэтому логику if (n == 1) писать нельзя — используйте системные правила.

Android:

<plurals name="items_count">
    <item quantity="one">%d товар</item>
    <item quantity="few">%d товара</item>
    <item quantity="many">%d товаров</item>
    <item quantity="other">%d товара</item>
</plurals>

Flutter (ARB):

{
  "itemsCount": "{count, plural, one{{count} товар} few{{count} товара} many{{count} товаров} other{{count} товара}}",
  "@itemsCount": {
    "placeholders": { "count": { "type": "int" } }
  }
}

Узбекский: латиница и кириллица

Официальная письменность — латиница, но часть аудитории, особенно старшего возраста, привыкла к кириллице. Решите заранее, нужны ли обе версии.

  • Коды локалей: uz (по умолчанию латиница) и uz-Cyrl для кириллицы. На Android папка для кириллицы — values-b+uz+Cyrl, во Flutter — файл вроде app_uz_Cyrl.arb.
  • Апострофы: в латинице правильно писать o‘, g‘ и ’ (тутук белгиси), а не обычный '. Обычный апостроф ломает поиск и выглядит небрежно.
  • Транслитерация автоматически даёт ошибки на заимствованных словах. Кириллическую версию всё равно стоит вычитать.
  • Системные компоненты: не все фреймворки имеют переводы встроенных диалогов и календарей для uz-Cyrl. Проверьте, что подставится на их место.
  • Длина строк: узбекские и русские тексты обычно длиннее английских. Проектируйте кнопки с запасом.

RTL: основы

Если в планах арабский, фарси или иврит, интерфейс должен уметь отражаться справа налево:

  • используйте leading/trailing и start/end вместо left/right;
  • на Android включите android:supportsRtl="true", во Flutter используйте EdgeInsetsDirectional;
  • отражайте направленные иконки (стрелки «назад»), но не логотипы и медиа-кнопки;
  • проверяйте вёрстку на псевдоязыках: в Xcode есть Right-to-Left и Double-Length Pseudolanguage, на Android — псевдолокали.

Смена языка внутри приложения

  • Android: начиная с Android 13 есть системный выбор языка для каждого приложения. Через AppCompatDelegate.setApplicationLocales() можно менять язык и на более старых версиях. Перечислите языки в locales_config.
  • iOS: пользователь выбирает язык приложения в системных Настройках. Из приложения можно открыть этот экран. Собственный переключатель без перезапуска потребует своей загрузки строк и часто даёт ошибки.
  • Flutter: меняйте locale у MaterialApp и сохраняйте выбор локально.

Язык по умолчанию берите из системы, а не из геолокации: в Узбекистане много людей с русским интерфейсом телефона.

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

  • Переведите название, подзаголовок, описание, ключевые слова и скриншоты — именно скриншоты видят первыми.
  • Подбирайте ключевые слова под то, как ищут на каждом языке, а не переводите их дословно.
  • Набор языков для страниц в App Store и Google Play отличается. Если нужного языка нет, главное донесите через тексты на скриншотах.
  • Сверьте, что язык страницы совпадает с языками, которые реально поддерживает приложение.

Частые вопросы

Чаще всего узбекский (латиница) и русский, английский — для иностранцев и международной аудитории. Кириллицу добавляйте, если она важна вашей аудитории.

Поможем с этим

Если хотите не разбираться самим, а получить результат — этим мы занимаемся каждый день.

Обсудить проект

Читайте также

Есть идея или задача? Расскажите нам

Ответим в течение рабочего дня и предложим решение. Консультация бесплатная.