Чтение онлайн

на главную

Жанры

Шрифт:

Листинг 9.З. Класс HelloForm определяет объект формы и использует ту же самую схему, что и основной класс МID-лета

1 import javax.raicroedition.midlet.MIDlet;

2

3 import javax.microedition.Icdui.Alert;

4 import javax.microedition.Icdui.AlertType;

5 import javax.microedition.Icdui.Command;

6 import javax.microedition.Icdui.CommandListener;

7 import javax.microedition.Icdui.Display;

8 import javax.microedition.Icdui.Displayable;

9 import javax.microedition.Icdui.Form;

10

11 /*

12 Данный класс определяет Form, которая отображает

13 простой текст и меню команд. Цель данного класса

14 заключается в демонстрации i18n и 110n

15 видимых пользователю атрибутов. Класс извлекает

16 локализованные ресурсы из программного обеспечения

17 управления приложениями.

18 */

19 открытый HelloForm дополняет Form

20 {

21 // Заголовок данной Form,

устанавливаемый по умолчанию.

22 private static final String DEFAULT_TITLE =

23 "Hello, World";

24

25 // Блок прослушивания команд, который обрабатывает

26 // командные события в данной Form.

27 private MyCommandListener cl = new

28 MyCommandListener ;

29

30 //. Экземпляр дисплея, связанный с

31 // данным MID-летом.

32 Display display;

33

34 // Ссылка на связанный с данным объектом

35 // объект MID-лета.

36 I18NDemo midlet;

37

38 // Уведомление, отображаемое в ответ на

39 // активацию некоторых команд данной Form.

40 Alert alert;

41

42 // Команды, размещаемые в данной форме.

43 private Command showAlert;

44 private Command sayHi;

45 private Command cancel;

46 private Command exit;

47 private Command help;

48 private Command item;

49 private Command ok;

50 private Command screen;

51 private Command stop;

52

53 /**

54 Конструктор No-arg. Устанавливает заголовок по умолчанию

55 для данной формы.

56 */

57 HelloForm

58 {

59 this(DEFAULT_TITLE);

60 }

61

62 /**

63 Конструктор.

64

65 @param title — заголовок Form.

66 */

67 HelloForm(String title)

68 {

69 super(title);

70

71 midlet = IISNDemo.get Instance

72

73 // Добавляет строковый элемент в форму.

74 String msg = midlet.getResource("greeting");

75 append(msg);

76

77 display = Display.getDisplay(midlet);

78

79 // Добавляет MyCommandListener в Form для прослушивания

80 // события нажатия клавиши «Back», которое должно

81 // создавать всплывающее диалоговое уведомление Alert.

82 setCommandListener(cl);

83

84 showAlert = new

85 Command(midlet.getRe source("alert"),

86 Command.SCREEN, 1);

87 addCommand(showAlert);

88

89 sayHi = new.

9 °Command(midiet.getResource("sayhi"),

91 Command.SCREEN, 1);

92 addCommand(sayHi);

93

94 cancel = new

95 Command{midlet.getResource("cancel"),

96 Command. SCREEN, 1);

97 addCommand(cancel);

98

99 exit = new

10 °Command(midlet.getResource("exit"),

101 Command.SCREEN, 1);

102 addCommand(exit);

103

104 help = new

105 Command(midlet.getResource("help"),

106 Command.SCREEN, 1);

107 addCommand(help);

108

109 item = new

11 °Command(midiet.getResource("item"),

111 Command.SCREEN, 1);

112 addCommand(item);

113

114 ok = new

115 Command(midlet.getResource("ok"),

116 Command.SCREEN, 1);

117 addCommand(ok);

118

119 screen = new

12 °Command(midlet.getResource("screen"),

121 Command.SCREEN, 1);

122 addCommand(screen);

123

124 stop = new

125 Command(midlet.getResource("stop"),

126 Command.SCREEN, 1);

127 addCommand(stop);

128 }

129

130 // Данный класс просто прослушивает активацию

131 // какой-либо команды. Экземпляр HelloForm

132 // устанавливает экземпляр данного класса как

133 // свой блок прослушивания команд. Экземпляр

134 // объекта не проверяет информацию команды, а

135 // просто отображает модальное Ale показывающее,

136 // что экранная клавиша была активирована пользователем.

137 private class MyCoramandListener

138 implements CommandLister.er

139 {

140 public void commandAction(Command c,

141 Displayable d)

142 {

143 String title =

144 midlet.getResource("alert_title");

145 String msg = null;

146

147 if (c == showAlert)

148 {

149 msg = midlet.getResource("alert_text");

150 alert = new Alert(title,

151 msg,

152 null, AlertType.INFO);

153 alert.setTimeout(Alert.FOREVER);

154 display.setCurrer.t (alert, HelloForm.this);

155 }

156 else if (c == sayHi)

157 {

158 alert = new Alert("Button pressed",

159 msg,

160 r.ull, AlertType.INFO);

161 alert.setTimeout(Alert.FOREVER);

162 display.setCurrent(alert, HelloForm.this);

163 }

164

165 if (c == exit)

166 {

167 IISNDemo.get Instance. destroyApp (true);

168 }

169 }

170 }

171 }

Проблема разработки интернационализации заключается в схеме поиска, используемой для нахождения локализованных строк в файле JAD. Программно определяемый метод getResource (String key), заданный в строках с 103 по 115, на самом деле определяет и реализует схему поиска. Чтобы обнаружить ресурс, метод getResource (String key) создает имя атрибута, а затем ищет сам атрибут.

Например, следующие два оператора, показанные в строках 84 и 85, выбирают строку заголовка Form, использующейся в приложении.

String formTitle = getResource("title");

form = new HelloForm(formTitle);

Метод

создает полное имя атрибута, объединяя три строки: 118NDemo — префикс атрибута для данного приложения, идентификатор атрибута ресурса без какой-либо меняющейся в зависимости от региональной настройки информации и обозначение региональной настройки. Параметр строки title является идентификатором атрибута ресурса, а не заголовком формы.

В строке 36 MID-лет определяет префикс атрибута I18NDemo-. Метод startApp извлекает информацию о контексте региональной настройки, в котором исполняется приложение, из системного свойства microedition.locale и сохраняет его как экземпляр атрибута.

Объект HelloForm использует значение, выданное вызовом getResource, как его заголовок. Класс HelloForm в листинге 9.3 повторяет этот сценарий. Он просто вызывает getResource для поиска локализованных значений всех текстов, которые пользователь видит во время исполнения приложения.

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

Альтернативный подход заключается в создании нескольких версий файла JAD приложения так, чтобы каждая версия содержала атрибуты для каждой региональной настройки. Добавьте соответствующую версию JAD для требуемого контекста региональной настройки. Конечно, вам понадобится определить контекст локальной настройки, в которой будет использоваться телефон, или просто местные настройки пользователя.

В листинге 9.2 используется системное свойство microedition.locale для извлечения региональной настройки для того, чтобы акцентировать внимание на понятии динамически определяемого контекста региональной настройки и ресурсов, связанных с контекстами региональных настроек. Разграничение ресурсов для различных региональных настроек может помочь пониманию вашей разработки и сделать ваше программное обеспечение более восстанавливаемым. Не забывайте, что в будущем, когда устройства станут более мощными, реализации MIDP смогут очень хорошо поддерживать множество региональных настроек. Когда это произойдет, подход, показанный в листинге 9.2, станет более предпочтительным.

Взглянув на метод getResource, показанный в строчках с 103 по 115, вы увидите, что он использует метод MIDlet.getAppProperty для извлечения ресурсов из файла дескриптора приложения и файла манифеста. Если атрибут существует в обоих файлах с абсолютно одинаковыми именами ключа, тогда значение извлекается из файла дескриптора приложения и значение в файле манифеста игнорируется. Если не найдено ни одного атрибута или если для ключа не найдено ни одного значения, выдается значение ноль. Если вводимый ключ не найден, сбрасывается NullPointerException.

Значения атрибутов в файле JAD (или манифеста) должны быть кодированы с помощью символьной кодировки, которая поддерживает нужный язык. Существует два способа выполнения этого:

Кодировать значения атрибутов с помощью символьной кодировки, предназначенной для языка региональной настройки. Символьная кодировка может быть той, что соответствует более чем одному лишь нужному языку, как, например, LJTF-8. Кодировать значения атрибутов с помощью последовательностей переключения кода Уникод, например \u4EA9. Файл все равно состоит только из символов ASCII, но последовательности переключения уникода могут представлять любой символ любого письменного языка.

Листинг 9.2 включает поддержку английской и французской региональных настроек. Символьная кодировка ISO8859-1 может представлять английский и французский алфавиты. Если вы желаете локализовать данное приложение на языки, не поддерживаемые семейством ISO8859 (китайский, например), вам придется кодировать значения атрибутов с помощью соответствующей многобайтовой символьной кодировки.

Если вы выбрали первый из только что описанных подходов (кодирование с помощью символьной кодировки, предназначенной для языка региональной настройки), вам понадобится найти текстовой редактор, который поддерживает методы ввода китайского языка и записывает символы в соответствующую кодировку. Либо вы можете использовать второй подход и вводить последовательности переключения уникода Java для каждого символа. Просто найдите точку кодирования уникода для каждого символа в вашей строке. Этот подход работает, поскольку класс Java.lang.String знает, как создавать строковые объекты из последовательностей переключения уникода. Ваше приложение может затем считывать значения атрибутов и создавать из них объекты String.

Вы можете определить имена атрибутов с помощью панели Settings J2MEWTK. Поскольку WTK не поддерживает ввод не-ASCII текста, однако, вы не можете определить не английский локализованный текст значений атрибутов. Чтобы ввести не английские символы, вам придется использовать текстовой редактор для ввода символов непосредственно в файл JAD. Вы можете использовать тот, что поддерживает редакторы методов ввода (IME) для назначенного языка, или вводить последовательности переключения уникода.

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

Поделиться:
Популярные книги

Набирая силу

Каменистый Артем
2. Альфа-ноль
Фантастика:
фэнтези
боевая фантастика
рпг
6.29
рейтинг книги
Набирая силу

Сердце Дракона. Том 11

Клеванский Кирилл Сергеевич
11. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
6.50
рейтинг книги
Сердце Дракона. Том 11

Польская партия

Ланцов Михаил Алексеевич
3. Фрунзе
Фантастика:
попаданцы
альтернативная история
5.25
рейтинг книги
Польская партия

Восьмое правило дворянина

Герда Александр
8. Истинный дворянин
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восьмое правило дворянина

Ты предал нашу семью

Рей Полина
2. Предатели
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Ты предал нашу семью

Как я строил магическую империю 2

Зубов Константин
2. Как я строил магическую империю
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Как я строил магическую империю 2

Наследник старого рода

Шелег Дмитрий Витальевич
1. Живой лёд
Фантастика:
фэнтези
8.19
рейтинг книги
Наследник старого рода

Возвращение Низвергнутого

Михайлов Дем Алексеевич
5. Изгой
Фантастика:
фэнтези
9.40
рейтинг книги
Возвращение Низвергнутого

Лорд Системы

Токсик Саша
1. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
4.00
рейтинг книги
Лорд Системы

Довлатов. Сонный лекарь 2

Голд Джон
2. Не вывожу
Фантастика:
альтернативная история
аниме
5.00
рейтинг книги
Довлатов. Сонный лекарь 2

Дурашка в столичной академии

Свободина Виктория
Фантастика:
фэнтези
7.80
рейтинг книги
Дурашка в столичной академии

Барон диктует правила

Ренгач Евгений
4. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон диктует правила

Кодекс Охотника. Книга XIII

Винокуров Юрий
13. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XIII

Удобная жена

Волкова Виктория Борисовна
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Удобная жена