В этой статье я расскажу вам как добавить поддержку различных языков в написанную в предыдущей статье программу.
В нашем проекте создаём новый package с именем «test.myfirstapp.lang» и в нём создаём файл: Language.rrh
Имя «Language» для файла выбрано произвольно, для наглядности. Расширение .rrh означает, что файл является заголовком языкового ресурса.
При создании Language.rrh автоматически будет создан файл Language.rrc
Language.rrc содержит в себе тело основного языкового ресурса. Файлов с расширением .rrc в наборе ресурсов может быть несколько. По одному для каждого поддерживаемого языка. Файл заголовка (.rrh) в ресурсе присутствует только в одном экземпляре.
Языковые ресурсы применяются для перевода интерфейса программы, её названия и описания на другие языки. В дескрипторе приложения можно указать языковый ресурс, который будет использоваться для отображения названия программы и её описания.
Если программа содержит языковые ресурсы, то при смене языка системы на устройстве произойдет автоматическая смена языка программы, если для текущего системного языка в программе есть соответствующий ресурс.
Если-же соответствующего системному языку ресурса в программе нет, то будет использован основной строковый ресурс, так называемый «Root locale».
Есть одна тонкость, на выявление которой я потратил много сил когда только начинал писать для BlackBerry.
Поначалу мне никак не удавалось запустить даже примеры из набора JDE. Я ничего не менял в них, просто устанавливал JDE, открывал в нём примеры и запускал компиляцию. После чего получал сообщение об ошибке сборки проекта, из которого никак нельзя было понять в чём причина.
В документации об этом нигде ничего не было сказано. Поддержка Research In Motion, куда я обратился, встретила мой вопрос с искренним изумлением, и мне было сказано, что всё должно работать, и они не могут приложить ума чего это вдруг у меня не собираются даже их примерные проекты. Говоря кратко — помочь они мне не смогли.
В итоге путём проб и ошибок я пришёл к выводу, что для корректной компиляции проекта, содержащего языковые ресурсы в виде .rrh и .rrc файлов в настройках операционной системы для не-unicode программ должен быть установлен язык, отличный от русского. В моём случае сработали варианты с английским и с немецким языками.
Если-же в качестве языка для не-unicode программ установлен «русский», то при компиляции .rrc и .rrh файлов будут сгенерированы файлы с неверными символами в именах, что в свою очередь приведёт к ошибке верификации проекта и ошибке сборки.
Позднее эта проблема перекочевала из Java Development Environment в Eclipse JDE plugin, где живёт и здравствует поныне. И новичку в программировании для BlackBerry совершенно неясно в чём дело и почему даже примеры от RIM не компилируются.
Вернёмся к нашей программе. Открываем файл «Language.rrh» и в окне справа, нажав на кнопку «Add key», создаём три пары ключ-значение.
NOTE_APP_TITLE – для названия программы
NOTE_APP_DESCRIPTION – для краткого описания программы
NOTE_HELLO_WORLD – с текстом приветствия
Теперь у нас есть основной языковый ресурс с тремя строковыми значениями.
Добавим теперь в языковый ресурс дополнительный файл для отображения интерфейса программы на русском языке.
Имя этого дополнительного файла должно начинаться так-же как и имя основного, но в дополнение к нему приписывается код языка.
В нашем случае имя этого файла будет «Language_ru.rrc»
В результате в самом низу окна с содержимым языкового ресурса рядом с закладкой «Root» появится дополнительная закладка «ru».
Открыв которую, мы укажем значения для всех ключей на русском языке.
При компиляции проекта файлы .rrc и .rrh превращаются в обычный java-интерфейс, имя которого формируется из имени основного языкового ресурса (в данном случае «Language») и слова «Resource», и который должен быть реализован тем классом, который использует языковые ресурсы. Этот сгенерированный интерфейс не виден явно в проекте, но он незримо присутствует там и его надо реализовать, чтобы получить доступ к объявленным внутри этого интерфейса константам.
Итак, вносим изменения в класс MyAppScreen.
По-умолчанию в симуляторе не включена поддержка русского языка. Сделаем это, чтобы увидеть изменённую программу в работе.
Чтобы добавить поддержку русского языка в симулятор устройства (в данном случае Storm 9550 и API 5.0.0) надо открыть файл 9550.xml во внутренней папке Eclipse «plugins\net.rim.ejde.componentpack5.0.0_5.0.0.25\components\simulator» и добавить в него строчку:
<Application>net.rim.blackberry.lang.ru</Application>
На рисунке ниже показаны изменения в xml-файле конфигурации симулятора:
Всё, теперь можно запускать приложение на выполнение.
На нижеприведённой анимации показан процесс запуска нашей программы сперва с английским языком в качестве системного, после чего в настройках меняется язык на русский и программа запускается уже с русским языком как системным.
В симулятор можно добавить и другие языки. Ниже приведен список xml-выражений, которые надо добавить в конфигурационный файл симулятора для включения поддержки соответствующего языка.
Французский: <Application>net.rim.blackberry.lang.fr</Application>
Немецкий: <Application>net.rim.blackberry.lang.de</Application>
Итальянский: <Application>net.rim.blackberry.lang.it</Application>
Испанский: <Application>net.rim.blackberry.lang.es</Application>
Английский (Великобритания): <Application>net.rim.blackberry.lang.en_GB</Application>
Английский (США): <Application>net.rim.blackberry.lang.en_US</Application>
Английский (Голландия): <Application>net.rim.blackberry.lang.en_NL</Application>
Португальский (Бразилия): <Application>net.rim.blackberry.lang.pt_BR</Application>
Польский: <Application>net.rim.blackberry.lang.pl</Application>
В нашем проекте создаём новый package с именем «test.myfirstapp.lang» и в нём создаём файл: Language.rrh
Имя «Language» для файла выбрано произвольно, для наглядности. Расширение .rrh означает, что файл является заголовком языкового ресурса.
При создании Language.rrh автоматически будет создан файл Language.rrc
Language.rrc содержит в себе тело основного языкового ресурса. Файлов с расширением .rrc в наборе ресурсов может быть несколько. По одному для каждого поддерживаемого языка. Файл заголовка (.rrh) в ресурсе присутствует только в одном экземпляре.
Языковые ресурсы применяются для перевода интерфейса программы, её названия и описания на другие языки. В дескрипторе приложения можно указать языковый ресурс, который будет использоваться для отображения названия программы и её описания.
Если программа содержит языковые ресурсы, то при смене языка системы на устройстве произойдет автоматическая смена языка программы, если для текущего системного языка в программе есть соответствующий ресурс.
Если-же соответствующего системному языку ресурса в программе нет, то будет использован основной строковый ресурс, так называемый «Root locale».
Есть одна тонкость, на выявление которой я потратил много сил когда только начинал писать для BlackBerry.
Поначалу мне никак не удавалось запустить даже примеры из набора JDE. Я ничего не менял в них, просто устанавливал JDE, открывал в нём примеры и запускал компиляцию. После чего получал сообщение об ошибке сборки проекта, из которого никак нельзя было понять в чём причина.
В документации об этом нигде ничего не было сказано. Поддержка Research In Motion, куда я обратился, встретила мой вопрос с искренним изумлением, и мне было сказано, что всё должно работать, и они не могут приложить ума чего это вдруг у меня не собираются даже их примерные проекты. Говоря кратко — помочь они мне не смогли.
В итоге путём проб и ошибок я пришёл к выводу, что для корректной компиляции проекта, содержащего языковые ресурсы в виде .rrh и .rrc файлов в настройках операционной системы для не-unicode программ должен быть установлен язык, отличный от русского. В моём случае сработали варианты с английским и с немецким языками.
Если-же в качестве языка для не-unicode программ установлен «русский», то при компиляции .rrc и .rrh файлов будут сгенерированы файлы с неверными символами в именах, что в свою очередь приведёт к ошибке верификации проекта и ошибке сборки.
Позднее эта проблема перекочевала из Java Development Environment в Eclipse JDE plugin, где живёт и здравствует поныне. И новичку в программировании для BlackBerry совершенно неясно в чём дело и почему даже примеры от RIM не компилируются.
Вернёмся к нашей программе. Открываем файл «Language.rrh» и в окне справа, нажав на кнопку «Add key», создаём три пары ключ-значение.
NOTE_APP_TITLE – для названия программы
NOTE_APP_DESCRIPTION – для краткого описания программы
NOTE_HELLO_WORLD – с текстом приветствия
Теперь у нас есть основной языковый ресурс с тремя строковыми значениями.
Добавим теперь в языковый ресурс дополнительный файл для отображения интерфейса программы на русском языке.
Имя этого дополнительного файла должно начинаться так-же как и имя основного, но в дополнение к нему приписывается код языка.
В нашем случае имя этого файла будет «Language_ru.rrc»
В результате в самом низу окна с содержимым языкового ресурса рядом с закладкой «Root» появится дополнительная закладка «ru».
Открыв которую, мы укажем значения для всех ключей на русском языке.
При компиляции проекта файлы .rrc и .rrh превращаются в обычный java-интерфейс, имя которого формируется из имени основного языкового ресурса (в данном случае «Language») и слова «Resource», и который должен быть реализован тем классом, который использует языковые ресурсы. Этот сгенерированный интерфейс не виден явно в проекте, но он незримо присутствует там и его надо реализовать, чтобы получить доступ к объявленным внутри этого интерфейса константам.
Итак, вносим изменения в класс MyAppScreen.
package test.myfirstapp.view;
import test.myfirstapp.lang.LanguageResource;
import net.rim.device.api.i18n.ResourceBundle;
import net.rim.device.api.ui.component.LabelField;
import net.rim.device.api.ui.container.MainScreen;
/**
* При компиляции rrc и rrh файлов автоматически создаётся
* файл LanguageResource.java в котором пары ключ-значение
* объявлены константами.
* Да, вы не ошиблись, это известный anti-pattern "Constant Interface",
* и RIM применяет его для поддержки многоязычности.
*/
public class MyAppScreen extends MainScreen implements LanguageResource {
/**
* BUNDLE_ID и BUNDLE_NAME - автоматически созданные константы в так-же
* автоматически сгенерированном интерфейсе LanguageResource.java
*/
private static ResourceBundle resources =
ResourceBundle.getBundle(BUNDLE_ID, BUNDLE_NAME);
public MyAppScreen() {
// формируем меню по-умолчанию, с пунктом для закрытия приложения
// для меню по-умолчанию нет необходимости задавать ресурс вручную
// текст для пункта меню будет взят из ресурсов операционной системы
super(DEFAULT_MENU | DEFAULT_CLOSE);
// устанавливаем заголовок в название программы
setTitle(resources.getString(NOTE_APP_TITLE));
// добавляем нередактируемое поле с надписью
this.add(new LabelField(resources.getString(NOTE_HELLO_WORLD)));
}
// обработка попытки закрытия экрана
public boolean onClose() {
// при закрытии экрана завершаем работу приложения
System.exit(0);
// true подтверждает, что экран будет закрыт.
return true;
}
}
По-умолчанию в симуляторе не включена поддержка русского языка. Сделаем это, чтобы увидеть изменённую программу в работе.
Чтобы добавить поддержку русского языка в симулятор устройства (в данном случае Storm 9550 и API 5.0.0) надо открыть файл 9550.xml во внутренней папке Eclipse «plugins\net.rim.ejde.componentpack5.0.0_5.0.0.25\components\simulator» и добавить в него строчку:
<Application>net.rim.blackberry.lang.ru</Application>
На рисунке ниже показаны изменения в xml-файле конфигурации симулятора:
Всё, теперь можно запускать приложение на выполнение.
На нижеприведённой анимации показан процесс запуска нашей программы сперва с английским языком в качестве системного, после чего в настройках меняется язык на русский и программа запускается уже с русским языком как системным.
В симулятор можно добавить и другие языки. Ниже приведен список xml-выражений, которые надо добавить в конфигурационный файл симулятора для включения поддержки соответствующего языка.
Французский: <Application>net.rim.blackberry.lang.fr</Application>
Немецкий: <Application>net.rim.blackberry.lang.de</Application>
Итальянский: <Application>net.rim.blackberry.lang.it</Application>
Испанский: <Application>net.rim.blackberry.lang.es</Application>
Английский (Великобритания): <Application>net.rim.blackberry.lang.en_GB</Application>
Английский (США): <Application>net.rim.blackberry.lang.en_US</Application>
Английский (Голландия): <Application>net.rim.blackberry.lang.en_NL</Application>
Португальский (Бразилия): <Application>net.rim.blackberry.lang.pt_BR</Application>
Польский: <Application>net.rim.blackberry.lang.pl</Application>