Android: создание ресурсов для разных языковых настроек

Создание ресурсов для разных языковых настроек и аппаратных конфигураций

Неважно, для какой системы ведётся разработка, такие ресурсы, как строковые константы и изображения, всегда лучше держать за пределами исходного кода. Android позволяет подобные вещи во внешних файлах хранить. Думаю, не стоит говорить, что это очень удобно, как для обновления, так и для контроля.

Это позволяет описывать уникальные значения для конкретных языков, аппаратуры и т.д. При запуске приложения Android автоматом всё делает. Картинки и подобные ресурсы не очень интересно рассматривать тут, а вот про языке стоит написать.

Вообще, ресурсы приложения хранятся в каталоге res/ внутри дерева вашего проекта. Каждый тип ресурсов представлен в виде подкаталога, содержащего соответствующие данные.

При создании проекта дополнение ADT автоматически добавит в него каталог res с подкаталогами values, drawable-ldpi, drawable-mdpi, drawable-hdpi (drawable-* содержит разные значки — для экранов с низким, средним и высоким значением DPI) и layout. В них будут храниться следующие ресурсы: разметка по умолчанию, значок приложения и определения строковых констант.

Создание ресурсов для разных языковых настроек

Как уже сказал, выгода от применения внешних ресурсов — возможность использовать механизм динамического выбора оных. Пользуясь определённой структурой каталогов, можно создавать ресурсы со значениями для конкретных языков. Во время выполнения программы Android сам динамически выберет подходящие значения.

Создание ресурсов для разных языковых настроек и аппаратных конфигураций

Собственно, примерно так будет выглядеть дерево. Естественно такие имена файлам даны не просто так. Необходимо следовать спецификациям. Полный список можно глянуть у того же Рето Майера. Там и спецификации языковые, и аппаратные.

  • Мобильный код страны и код мобильного оператора (MCC/MNC). Информация о стране и опционально о мобильной сети привязана к SIM-карте устройства. MCC состоит из символов mcc, за которыми следует трехзначный код страны. При желании можете добавить MNC, используя символы mnc и двузначный код мобильной сети (например, mcc234-mnc20 или mcc310). Список кодов MCC/MNC можно на Вики глянуть.
  • Язык и регион. Язык указывается с помощью языкового кода в формате ISO 639-1, состоящего из двух символов в нижнем регистре. В случае необходимости за ним может следовать обозначение региона в виде буквы r и двухсимвольного кода в формате ISO 3166-1-alpha-2, записанного в верхнем регистре (например, en, en-rUS или en-rGB).

Можно задать несколько спецификаторов для любого типа ресурсов, разделив их дефисами. Поддерживаются любые сочетания, однако они должны использоваться в порядке из вышеприведенного списка. В одном спецификаторе может применяться не более одного значения.

При извлечении ресурсов во время выполнения программы Android найдет самый подходящий вариант из всех доступных. Пройдясь по списку каталогов, где хранятся нужные значения, он выберет тот, у которого больше всего совпавших спецификаторов. Ну, очевидное примечание:

Если на заданном устройстве не обнаружено соответствующих ресурсов, то выползет эксепшен при попытке получения. Чтобы избежать подобного, добавляйте значения по умолчанию.

Пример реализации

Скажем, есть у вас обычный TextView, текст в котором должен быть различен в зависимости от языка.

Здесь нас интересует строка android:text="@string/my_number". Она указывает, что значения необходимо брать из ресурсов строковых, а именно из переменной my_title.

Вспоминаем ресурсы, папки в зависимости от языка названы, но названия файлов в них одинаковое. То есть, везде есть файл string.xml, из которого берётся значение переменной. Вот что в res -> values -> strings.xml:

А вот что в res -> values-ru -> strings.xml:

Суть, думаю, понятна. В strings.xml определены значения переменных, которые мы потом используем в layout’ах. Прелесть в том, что Android сам потом необходимые значения подставит в зависимости от того, какой язык выбран на телефоне.