Как стать автором
Обновить

Добавляем поддержку разных языков в программу для BlackBerry

Время на прочтение 5 мин
Количество просмотров 3.1K
В этой статье я расскажу вам как добавить поддержку различных языков в написанную в предыдущей статье программу.


В нашем проекте создаём новый package с именем «test.myfirstapp.lang» и в нём создаём файл: Language.rrh

Имя «Language» для файла выбрано произвольно, для наглядности. Расширение .rrh означает, что файл является заголовком языкового ресурса.

При создании Language.rrh автоматически будет создан файл Language.rrc

Language.rrc содержит в себе тело основного языкового ресурса. Файлов с расширением .rrc в наборе ресурсов может быть несколько. По одному для каждого поддерживаемого языка. Файл заголовка (.rrh) в ресурсе присутствует только в одном экземпляре.

Языковые ресурсы применяются для перевода интерфейса программы, её названия и описания на другие языки. В дескрипторе приложения можно указать языковый ресурс, который будет использоваться для отображения названия программы и её описания.

Application descriptor

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

Если-же соответствующего системному языку ресурса в программе нет, то будет использован основной строковый ресурс, так называемый «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».

Tabs

Открыв которую, мы укажем значения для всех ключей на русском языке.

English-Russian resources

При компиляции проекта файлы .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-файле конфигурации симулятора:

simulator config

Всё, теперь можно запускать приложение на выполнение.

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

Demonstration

В симулятор можно добавить и другие языки. Ниже приведен список 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>
Теги:
Хабы:
+4
Комментарии 0
Комментарии Комментировать

Публикации

Истории

Работа

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн