[Из песочницы] Android string.xml — несколько вещей, которые стоит помнить
Доброго времени суток! Представляю вашему вниманию вольный перевод статьи от 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