В этой статье я расскажу вам как добавить поддержку различных языков в написанную в предыдущей статье программу.
В нашем проекте создаём новый 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>
