- PVSM.RU - https://www.pvsm.ru -

Android string.xml — несколько вещей, которые стоит помнить

Доброго времени суток! Представляю вашему вниманию вольный перевод статьи от GDE (Google developer expert) Dmytro Danylyk [1]. Собственно, вот оригинал [2]. Статья описывает правильные подходы для работы со strings.xml и особенно полезно это будет разработчикам, которые разрабатывают мультиязыковые приложения. Прошу под кат.

Эта статья о такой тривиальной вещи android как string.xml.

Не используйте повторно

Не используйте повторно строки для разных экранов

Давайте представим, что у вас есть loading dialog на Sign In либо Sign Up экране. Так как оба экрана имеют loading dialog, вы решаете использовать те же строки — R.string.loading.

image

res/values/strings.xml.

Позже, если вы решите использовать различные, вам нужно будет создать 2 разные строки и модифицировать их, непосредственно, в .java классах. Если вы используете разные строки с начала — вам бы пришлось модифицировать лишь strings.xml файл.

image

res/values/strings.xml

Вы никогда не будете заранее знать поддержку и перевод какого языка вам предстоит добавить. Всё дело в контексте: в одном языке вы можете использовать тоже слово в одном контексте, но в другом — это слово по смыслу не будет подходить.

image

res/values/strings.xml

image

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.

Разделяйте

Разделяйте строки, которые относятся к одному экрану с помощью префиксов и комментариев

image

res/values/strings.xml

  1. Добавляйте префикс в виде имени экрана к каждой строке для более немедленного понимания к какому экрану относится данный ресурс.
  2. Чистый string.xml файл поможет достаточно легко поддерживать и переводить различные языки — экран за экраном.

Создание различных strings.xml для каждого экрана

Если вы хотите, вы можете создать string.xml файл для каждого экрана — settings-strings.xml, profile-strings.xml. Но обычно приложение имеет около 10-20 экранов, соответственно, нужно иметь 10-20 string.xml файлов в каждой языковой папке. Я думаю, что это будет сопряжено с беспорядком.

Форматирование

Используйте Resources#getString(int id, Object… formatArgs) для форматирования строк

Никогда не делайте конкатенацию через + оператор, поскольку в других языках порядок слов может варьироваться.

image

res/values/strings.xml

image

java code

Правильный путь — использовать Resources#getString(int id, Object… formatArgs) [3].

image

res/values/strings.xml

image

res/values-UA/strings.xml

image

java code

Множественное число

Используйте Resources#getQuantityString(int id, int quantity) для количественных строк

Не решайте проблемы с множественным числом в java коде, поскольку разные языки имеют разные правила для согласования множественного числа

image

res/values/strings.xml

image

java code

Правильный путь это использовать Resources#getQuantityString(int id, int quantity) [4]

image

res/values/strings.xml

image

java code

Подстветка слов

Используйте html text для подсветки статический слов

Если вы хотите изменить цвет некоторых слов в TextView — ForegroundColorSpan [5] не всегда лучший вариант, потому как подсветка выполняется через индекс и это не безопасно в мультиязыковом приложении. Лучше использовать html font color tags внутри вашего strings.xml файла.
Представим у вас есть текст “Discover and play games.” и вы хотите выделить “Discover” слово и “play” слово синим цветом.

image

res/values/strings.xml

image

java code

Автор: iamtodor

Источник [6]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/android-development/173396

Ссылки в тексте:

[1] Dmytro Danylyk: http://www.dmytrodanylyk.com/

[2] оригинал: https://medium.com/google-developer-experts/android-strings-xml-things-to-remember-c155025bb8bb#.joh3be6qo

[3] Resources#getString(int id, Object… formatArgs): https://developer.android.com/reference/android/content/res/Resources.html#getString%28int,%20java.lang.Object...%29

[4] Resources#getQuantityString(int id, int quantity): https://developer.android.com/reference/android/content/res/Resources.html#getQuantityString

[5] ForegroundColorSpan: https://developer.android.com/reference/android/text/style/ForegroundColorSpan.html

[6] Источник: https://habrahabr.ru/post/307798/?utm_source=habrahabr&utm_medium=rss&utm_campaign=sandbox