Как устроена локализация в Android
Строки интерфейса хранятся в файлах res/values/strings.xml для базового языка и в res/values-ru/strings.xml, res/values-de/strings.xml и других папках для конкретных языков. Приложение подгружает строки из папки, которая соответствует локали устройства.
Пример структуры:
res/
values/
strings.xml # Базовый язык, обычно английский
values-ru/
strings.xml # Русский
values-de/
strings.xml # Немецкий
Каждый strings.xml содержит набор пар ключ и значение:
<resources>
<string name="menu_home">Home</string>
<string name="btn_save">Save</string>
<string name="msg_error">Something went wrong</string>
</resources>
Ключ это идентификатор строки в коде, значение это текст для отображения. Ключи не переводятся, они это ссылки в XML-коде. Переводятся только значения.
Почему локализация Android требует осторожности
Первая причина: структура файлов чувствительна к XML-разметке. Если при переводе поменять порядок тегов или исчезнет закрывающий тег, приложение не загрузит строки. Вторая: внутри значений могут быть подстановки, плейсхолдеры типа %1$s, %d, и они не переводятся и не меняют порядок. Третья: длина строки. В интерфейсе у кнопки есть ограничение по размеру, и если перевод длиннее, он вылезает.
Четвёртая: множественные формы. В русском языке у числительных три формы, и в Android для этого есть отдельные строки: plural с категориями one, few, many, other. Если их не учесть, приложение будет показывать неверные формы слов.
Что переводится, а что нет
В strings.xml переводятся значения, которые видит пользователь. Не переводятся ключи, они это идентификаторы. Не переводятся плейсхолдеры и ссылки на ресурсы. Не переводятся технические параметры.
На практике полезно заранее пометить, какие строки свободны, а какие содержат подстановки. Это экономит время и снижает риск сломать файл.
Как выстроить процесс локализации Android
Подход такой. Файлы strings.xml извлекаются, строки выгружаются в формат для перевода, например XLIFF. Перевод выполняется с учётом глоссария интерфейса, чтобы названия кнопок и разделов были единообразны. Множественные формы обрабатываются отдельно. После перевода строки возвращаются в strings.xml, файлы валидируются и приложение проверяется.
В Платформе перевода этот процесс автоматизирован. XML-файлы подключаются, строки извлекаются, переводятся с учётом глоссария и памяти переводов, проходят агентские проверки и возвращаются в исходную структуру. Плейсхолдеры и множественные формы обрабатываются корректно.
Для локализации мобильных приложений и локализации ПО Android это основной сценарий. Если вы локализуете приложение на Android, важно заранее определить, кто отвечает за структуру файлов и кто за текст, и как они согласуют изменения.
Частые ошибки
Типичная ошибка это перевод ключей вместо значений. Ключ это идентификатор, он должен остаться без изменений. Вторая: изменение порядка плейсхолдеров. Третья: отсутствие множественных форм для русского языка. Четвёртая: неучтённая длина строки, когда перевод не помещается в элемент интерфейса.
FAQ
Что такое локали Android?
Локали Android это набор файлов res/values-XX/strings.xml, в которых хранятся строки интерфейса приложения на разных языках. Приложение подгружает строки из папки, которая соответствует локали устройства.
Что нельзя переводить в strings.xml?
Ключи, плейсхолдеры типа %1$s, ссылки на ресурсы, технические параметры. Переводятся только значения, которые видит пользователь.
Что такое множественные формы в Android?
В русском языке у числительных три формы, и в Android для этого есть отдельные строки: plural с категориями one, few, many, other. Без них приложение будет показывать неверные формы слов.
Как Платформа перевода работает с локалями Android?
Платформа извлекает строки из XML-файлов, переводит их с учётом глоссария и памяти переводов, корректно обрабатывает плейсхолдеры и множественные формы, проходит агентские проверки и возвращает результат в исходную структуру.
Почему важна длина строки в интерфейсе Android?
В элементах интерфейса есть ограничения по размеру. Если перевод длиннее исходной строки, он может не поместиться в кнопку или заголовок. Это нужно проверять на этапе LQA.