Локализация Android-приложения: от strings.xml до публикации в новых странах

Ошибка Resources.NotFoundException на устройстве с французской локалью — типичный первый сигнал того, что локализация Android-приложения выполнена неполностью: система не нашла нужный строковый ресурс и упала при отрисовке экрана. Причина почти всегда одна — часть строк осталась жёстко зашитой в коде или не переведена в соответствующем файле strings.xml. Именно поэтому локализацию нужно планировать как отдельный этап разработки, а не как «перевести текст перед релизом».

Локализация — это не только перевод слов. Это адаптация форматов дат и чисел, направления письма (RTL для арабского и иврита), правил множественного числа, длины строк под конкретный язык и даже визуальных элементов. Ниже разберём весь процесс: от подготовки ресурсов до тестирования и публикации в Google Play для новых регионов.

Что такое локализация и чем она отличается от интернационализации

В разработке принято разделять два понятия. Интернационализация (i18n) — это подготовка кодовой базы: вынос всех строк в ресурсы, использование системных классов форматирования, поддержка разных локалей на архитектурном уровне. Локализация (l10n) — это уже сама адаптация под конкретный язык и регион: перевод строк, подбор графики, настройка форматов.

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

Подготовка строковых ресурсов

Основа локализации в Android — каталог res/values/ с файлом strings.xml для языка по умолчанию и каталоги вида res/values-ru/, res/values-de/, res/values-fr/ для остальных языков. Система автоматически подбирает ресурс под локаль устройства, а при отсутствии перевода откатывается к языку по умолчанию.

Ключевое требование: никаких строк в коде и разметке. Все тексты, включая подсказки, сообщения об ошибках и пункты меню, должны быть вынесены в ресурсы:

<string name="welcome_message">Добро пожаловать!</string>

<string name="items_count">Найдено: %1$d</string>

  • 🔤 Используйте осмысленные имена ключей (checkout_button, а не str_17) — переводчикам так проще понять контекст.
  • 📦 Не склеивайте строки конкатенацией: порядок слов в других языках отличается, используйте плейсхолдеры %1$s, %2$d.
  • 🧩 Добавляйте комментарии к строкам через атрибут translatable и XML-комментарии с описанием контекста.
  • 🚫 Строки, которые переводить не нужно (названия брендов, технические константы), помечайте translatable="false".
⚠️ Внимание: если строка с плейсхолдером переведена без учёта типа аргумента (например, %d заменён на %s), приложение упадёт с IllegalFormatException только на этой локали. Такие ошибки не ловятся при тестировании на основном языке.

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

Русский язык имеет три формы множественного числа («1 файл», «2 файла», «5 файлов»), английский — две, а в некоторых языках их до шести. Простой перебор через if здесь не работает. Для этого в Android предусмотрен механизм plurals:

<plurals name="files_count">

<item quantity="one">%d файл</item>

<item quantity="few">%d файла</item>

<item quantity="many">%d файлов</item>

<item quantity="other">%d файлов</item>

</plurals>

Даты, время, валюты и числа форматируйте только системными средствами — DateFormat, NumberFormat, SimpleDateFormat с явной локалью или классами из java.time. Ручная сборка строк вида day + "." + month сломается в США, где принят формат «месяц/день/год».

Адаптация интерфейса и RTL-языки

Текст на немецком в среднем длиннее английского, на финском — ещё длиннее. Кнопки и заголовки с фиксированной шириной начнут обрезаться. Поэтому вёрстку нужно изначально строить на ConstraintLayout с гибкими ограничениями, а не на жёстких размерах.

Для арабского и иврита интерфейс должен зеркально отразиться. Для этого в манифесте указывается android:supportsRtl="true", а в разметке вместо left/right используются атрибуты start/end. Иконки-стрелки и изображения с направлением тоже требуют зеркальных версий или атрибута autoMirrored.

☑️ Проверка UI перед отправкой на перевод

Выполнено: 0 / 6
⚠️ Внимание: включение supportsRtl влияет на всё приложение сразу. Если часть экранов свёрстана через left/right, после включения флага они могут отобразиться некорректно на RTL-локалях. Проверяйте каждый экран в режиме «Force RTL layout» в параметрах разработчика эмулятора.

Инструменты и организация перевода

В Android Studio встроен Translations Editor — табличный редактор, где видны все локали сразу и подсвечиваются непереведённые строки. Для небольших проектов его достаточно. Для команд с профессиональными переводчиками обычно используют внешние платформы локализации, которые синхронизируются с репозиторием и отдают переводчикам контекст и скриншоты.

Как выбрать подход — смотрите по масштабу проекта:

ПодходКому подходитПлюсыМинусы
Translations Editor в Android StudioСоло-разработчики, 2–3 языкаБесплатно, без интеграцийНет контекста для переводчика
Платформы локализации (Crowdin, Lokalise и аналоги)Команды, много языковПамять переводов, скриншоты, CIПлатно при росте объёма
Машинный перевод + ручная вычиткаMVP, проверка спросаБыстро и дёшевоОшибки в терминологии и тоне
Профессиональные переводчики-носителиПродукты с платной аудиториейКачество и культурная адаптацияДороже и дольше

Независимо от инструмента давайте переводчикам контекст: скриншоты экранов, ограничения по длине строк, описание, где текст появляется. Слово «Save» в банковском приложении — это «Сохранить» или «Накопить»? Без контекста переводчик угадает не всегда.

📊 Как вы переводите свои Android-приложения?
Самостоятельно, знаю языки
Машинный перевод + правка
Фрилансеры-переводчики
Платформа локализации с командой

Тестирование локализованной версии

Перед релизом полезно прогнать псевдолокализацию — автоматическую подмену строк на удлинённые версии с диакритикой (в Android Studio доступна как локаль en-XA). Она мгновенно показывает, где текст обрезается, где остались хардкод-строки и где ломается вёрстка.

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

  • 🧪 Прогоните UI-тесты (Espresso, Compose Test) минимум на двух локалях — короткой и длинной.
  • 🌍 Проверьте RTL-режим, если поддерживаете арабский или иврит.
  • 🔢 Убедитесь, что plurals корректны для чисел 1, 2, 5, 21 — они покрывают все формы в русском.
  • 📱 Проверьте обрезку текста на маленьком экране, а не только на флагмане.
Как включить псевдолокаль en-XA

В Android Studio откройте эмулятор, перейдите в настройки языка системы и добавьте English (XA) — псевдолокаль появляется в списке, если в проекте собран debug-вариант. Все переведённые строки отобразятся удлинёнными с диакритическими символами, непереведённые останутся как есть — так сразу видно пропуски.

Публикация и локализация страницы в Google Play

Перевод самого приложения — только половина работы. Страница в Google Play Console тоже локализуется: название, краткое и полное описание, скриншоты, промо-тексты. Пользователь из Бразилии, видящий описание на английском, с заметно меньшей вероятностью установит приложение.

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

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

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

Можно ли перевести приложение без программиста?

Частично. Если все строки уже вынесены в strings.xml, переводчик может работать напрямую с файлами или через платформу локализации. Но plurals, форматы дат и RTL-разметку должен настроить разработчик.

Что будет, если перевод строки отсутствует?

Android подставит строку из каталога values/ по умолчанию — приложение не упадёт, просто покажет текст на основном языке. Падение возможно только при ошибках в плейсхолдерах или при обращении к несуществующему ресурсу из кода.

Сколько языков добавлять на старте?

Универсального числа нет. Разумная стратегия — начать с языков рынков, где планируется продвижение, и расширять список по данным аналитики. Каждая новая локаль — это постоянные затраты на перевод будущих обновлений.

Нужно ли локализовать название приложения?

Зависит от бренда. Если название — осмысленное слово, перевод для Google Play часто улучшает поиск и конверсию. Если это имя бренда, его обычно оставляют без изменений, но локализуют подзаголовок и описание.

Как переводить строки, которых нет в интерфейсе (push-уведомления, ошибки сервера)?

Тексты push-уведомлений, формируемые на сервере, локализуются на стороне сервера по локали устройства клиента. Сообщения об ошибках лучше передавать кодами, а текст подставлять на клиенте из локальных ресурсов — так перевод контролируется в одном месте.