Какие плюсы от вынесения строк в ресурсы в Android
Что проверяют
Понимаете ли вы систему ресурсов Android и квалификаторы конфигурации, а не только слово «локализация». Следом часто просят показать строку с параметром или со множественным числом, или спрашивают, как получить строку во ViewModel.
Как отвечать
Базовая схема: строки лежат в res/values/strings.xml, переводы в каталогах с квалификатором, например values-ru/strings.xml. Система сама выбирает файл по языку, а при смене языка активность пересоздаётся и получает новые строки. Дальше плюсы:
- локализация без правки кода: переводчик работает с XML или через Translations Editor в Android Studio;
- форматирование:
getString(R.string.greeting, name)и позиционные аргументы%1$s,%2$d. Переводчик может переставить слова, склейка строк этого не позволяет; - множественное число:
<plurals>с количествамиone,few,many,otherиgetQuantityStringилиpluralStringResourceв Compose. Для русского «1 файл, 2 файла, 5 файлов» иначе правильно не сделать; - одна точка правки: строка переиспользуется на многих экранах, меняется в одном месте;
- проверки: Lint предупреждает о захардкоженном тексте в разметке (
HardcodedText) и о строках без перевода; - язык приложения: с Android 13 пользователь выбирает язык отдельно для приложения, для этого нужен список локалей в
locales_config.xml, а в кодеAppCompatDelegate.setApplicationLocales.
В Compose строки берутся через stringResource(R.string.title). То, что не переводится (ключи, форматы), помечают translatable="false".
Где спотыкаются
Склеивают фразу из кусков: getString(R.string.you_have) + count + getString(R.string.messages). Порядок слов в других языках другой, а множественное число ломается.
Достают строки во ViewModel через Context. Контекст активности там утекает, а строка, полученная заранее, переживёт смену конфигурации и останется на старом языке. Лучше отдавать в UI идентификатор ресурса или обёртку вроде UiText.
Кладут перевод в values/strings-ru.xml. Имя файла внутри values ничего не значит, он сольётся с остальными, и одинаковые имена строк дадут ошибку сборки. Квалификатор ставится у каталога.