Как локализовать мобильное приложение на несколько языков
Практика3 минРедакция Innovialabs
Коротко
Вынесите все тексты в строковые ресурсы платформы с первого дня, используйте системные правила множественного числа и форматирования дат и чисел, заранее решите, как поддержать узбекский на латинице и кириллице, и локализуйте не только интерфейс, но и страницу в сторе.
Коротко о главном
Локализация — это не перевод готового приложения в конце проекта, а архитектурное решение. Если с первого дня все тексты лежат в ресурсах, а даты, числа и валюты форматируются с учётом локали, добавить новый язык — это работа переводчика, а не переделка экранов.
Где хранить строки
| Платформа | Формат | Множественные числа |
|---|---|---|
| iOS | String Catalog (.xcstrings); в старых проектах Localizable.strings | Внутри String Catalog; раньше .stringsdict |
| Android | res/values-<язык>/strings.xml | <plurals> в том же файле |
| Flutter | ARB-файлы и flutter gen-l10n | ICU-синтаксис в ARB |
| React Native | JSON через библиотеку вроде 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 отличается. Если нужного языка нет, главное донесите через тексты на скриншотах.
- Сверьте, что язык страницы совпадает с языками, которые реально поддерживает приложение.