Локализация приложений

Определить системную локаль на устройстве

В статье, посвященной ресурсам, мы уже затрагивали эту тему с теоретической точки зрения. Разберем теперь практическую часть. Мы уже умеем пользоваться строковыми ресурсами и меняли строчки, например, Hello, World на Здравствуй, Мир! Но на самом деле это не совсем правильный подход. Для профессионально написанного приложения лучше использовать другой подход. А именно, локализацию.

Что это значит? Мы не будем менять строчку Hello, World, которая будет считаться строкой по умолчанию, а создадим новый локализованный ресурс. Это даст нам дополнительное преимущество, а именно, если пользователь запустит приложение на телефоне с английской локалью, то он увидит текст на знакомом ему языке. Если приложение запустит русский пользователь, то он увидит текст на русском языке. Согласитесь - очень удобно.

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

Чтобы не усложнять материал, воспользуемся стандартным приложением, который мы изучали в самом начале. Создадим новый проект LocaleApp, но на этот раз мы не будем трогать файл strings.xml в каталоге res/values, а создадим новый подкаталог values-ru в том же каталоге res. Скопируем в него файл strings.xml из каталога values и изменим его содержание.


<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Здравствуй, Мир!</string>
    <string name="app_name">Локализованное приложение</string>
</resources>

Запустим приложение и увидим, что текст выводится на русском, так как у меня настроены русские настройки.

Идем в Настройки→Язык и клавиатура→Выбрать язык. Выбираем английский язык English (United States). Снова запускаем приложение в эмуляторе или на телефоне. Теперь наше приложение будет выглядеть так:

Ресурсы из каталога res/values считаются ресурсами по умолчанию. Они отображаются в том случае, когда система не найдет ресурсы для текущей локали устройства. В нашем случае, при выборе любого языка, кроме русского будет использоваться res/values. Если мы захотим разделить англичан и американцев, тогда придется создавать два каталога: res/values-en-rUK и res/values-en-rUS. Обратите внимание, что перед кодом второй части ставится буква 'r'. Иными словами, мы определяем не только язык, но и регион.

Проведем несколько экспериментов. Удалим из файла res/values-ru/strings.xml строковый ресурс hello с текстом Здравствуй, Мир!. Сохраним изменения и запустим проект на устройстве с русским языком. Платформа заменила отсутствующий в локализации ресурс дефолтным.

Продолжим опыты и поступим наоборот - удалим теперь ресурс из файла res/values/strings.xml. На устройстве выберем какой-нибудь другой язык, например, итальянский. В этом случае вы увидите что-то непонятное, либо получите сообщение об ошибке.

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

На самом деле локализовать можно не только строковые ресурсы. В разных странах принято рисовать какой-нибудь объект в соответствии со своими традициями, например, изображение почтового ящика. В этом случае вы можете создать каталог /res/drawable-de, в котором будут находиться изображения, предназначенные для немцев.

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

Просмотр локализованных строк в режиме дизайна

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

Определить системную локаль на устройстве

Чтобы определить используемую локаль на устройстве, нужно воспользоваться методом getConfiguration() объекта Context и вызвать свойство locale:


TextView textInfo = (TextView)findViewById(R.id.textView1);
        
Configuration sysConfig = getResources().getConfiguration();
Locale curLocale = sysConfig.locale;

textInfo.setText(curLocale.toString()); // у меня выводит ru_RU