Доброго времени суток! Представляю вашему вниманию вольный перевод статьи от GDE (Google developer expert) Dmytro Danylyk. Собственно, вот оригинал. Статья описывает правильные подходы для работы со strings.xml и особенно полезно это будет разработчикам, которые разрабатывают мультиязыковые приложения. Прошу под кат.
Эта статья о такой тривиальной вещи android как string.xml.
Не используйте повторно
Не используйте повторно строки для разных экранов
Давайте представим, что у вас есть loading dialog на Sign In либо Sign Up экране. Так как оба экрана имеют loading dialog, вы решаете использовать те же строки — R.string.loading.
res/values/strings.xml.
Позже, если вы решите использовать различные, вам нужно будет создать 2 разные строки и модифицировать их, непосредственно, в .java классах. Если вы используете разные строки с начала — вам бы пришлось модифицировать лишь strings.xml файл.
res/values/strings.xml
Вы никогда не будете заранее знать поддержку и перевод какого языка вам предстоит добавить. Всё дело в контексте: в одном языке вы можете использовать тоже слово в одном контексте, но в другом — это слово по смыслу не будет подходить.
res/values/strings.xml
res/values-UA/strings.xml
Обратите внимание, что в данном случае английская версия strings.xml использует тоже самое слово — “Yes” для обоих случаев R.string.download_file_yes и R.string.terms_of_use_yes strings.
Но украинский вариант strings.xml использует 2 разных слова — “Гаразд” для R.string.download_file_yes и “Так” для R.string.terms_of_use_yes.
Разделяйте
Разделяйте строки, которые относятся к одному экрану с помощью префиксов и комментариев
res/values/strings.xml
- Добавляйте префикс в виде имени экрана к каждой строке для более немедленного понимания к какому экрану относится данный ресурс.
- Чистый string.xml файл поможет достаточно легко поддерживать и переводить различные языки — экран за экраном.
Создание различных strings.xml для каждого экрана
Если вы хотите, вы можете создать string.xml файл для каждого экрана — settings-strings.xml, profile-strings.xml. Но обычно приложение имеет около 10-20 экранов, соответственно, нужно иметь 10-20 string.xml файлов в каждой языковой папке. Я думаю, что это будет сопряжено с беспорядком.
Форматирование
Используйте Resources#getString(int id, Object… formatArgs) для форматирования строк
Никогда не делайте конкатенацию через + оператор, поскольку в других языках порядок слов может варьироваться.
res/values/strings.xml
java code
Правильный путь — использовать Resources#getString(int id, Object… formatArgs).
res/values/strings.xml
res/values-UA/strings.xml
java code
Множественное число
Используйте Resources#getQuantityString(int id, int quantity) для количественных строк
Не решайте проблемы с множественным числом в java коде, поскольку разные языки имеют разные правила для согласования множественного числа
res/values/strings.xml
java code
Правильный путь это использовать Resources#getQuantityString(int id, int quantity)
res/values/strings.xml
java code
Подстветка слов
Используйте html text для подсветки статический слов
Если вы хотите изменить цвет некоторых слов в TextView — ForegroundColorSpan не всегда лучший вариант, потому как подсветка выполняется через индекс и это не безопасно в мультиязыковом приложении. Лучше использовать html font color tags внутри вашего strings.xml файла.
Представим у вас есть текст “Discover and play games.” и вы хотите выделить “Discover” слово и “play” слово синим цветом.
res/values/strings.xml
java code
Автор: iamtodor