Текст книги "Платформа J2Me"
Автор книги: Автор Неизвестен
Жанр:
Программирование
сообщить о нарушении
Текущая страница: 17 (всего у книги 21 страниц)
@выдает экземпляр, созданный при запуске приложения.
*/
public static I18NDemo3 getlnstance()
{
if (instance == null)
{
instance – new I18NDemo3();
}
return instance;
}
/**
Получает пакет ресурсов, используемый данным MID-летом.
Этот метод полезен для других классов, которым необходим доступ к локализованным ресурсам приложения.
@выдает локализованные ресурсы MID-лета.
*/
public static ListResourceBundle getResourceBundle ()
{
return (ListResourceBundle) bundle;
}
/**
Запускает MID-лет. Определяет текущую региональную настройку среды исполнения и использует ее для создания имени пакета локализованных ресурсов. Использует это имя для создания имени класса Java, который затем загружается с помощью Class. Если нет соответствия пакету ресурсов, по умолчанию используется пакет ресурсов U.S. English.
*/
public void startApp()
{
// Извлекает региональную настройку из программного обеспечения
// AMS.Региональная настройка должна быть установлена
// до выполнения данного MID-лета.
locale = System.getProperty("microedition.locale");
bundle = null;
cry
{
bundle =
ResourceBundle.getBundle("IlSNDemoResources", locale);
if (bundle == null)
{
bundle =
ResourceBundle.getBundle("IlBNDemoResources", "en_US");
}
}
catch (MissingResourceException mre)
mre.printStackTrace();
}
try
}
/ Создаем элемент Displayable. Получаем локализованную
// String, которая представляет заголовок Form.
String formTitle = (String)
bundle.getObject("title");
form = new HelloForm3(formTitle);
}
catch (MissingResourceException mre)
{
rare.printStackTrace();
}
// Это приложение просто отображает одну форму, созданную ранее, display = Display.getDisplay(this); display.setCurrent(form);
}
/**
Выдает значение, связанное с указанным ключом из списка определяемых пользователем ресурсов MID-лета в файле JAD приложения.
@param key Ключ пары ключ-значение.
@выдает значение, связанное с указанным ключом.
*/
public Object getResource(String key)
}
Object resource = null;
try
{
resource = bundle.getObject(key);
}
catch (MissingResourceException mre)
}
}
return resource;
/**
Выход из MID-лета. Уведомляет реализацию, что она
может прервать работу всех ресурсов приложения.
Реализация вызывает destroyApp().
*/
public void quit()
{
notifyDestroyed();
/*
public void destroyApp(boolean destroy)
{
{
public void pauseApp()
{
}
}
На рисунке 9.1 показано основное окно, созданное программой I18NDemo3 при ее запуске в региональной настройке en_US. Программа динамически извлекает локализованные ресурсы, описанные в листинге 9.9. На рисунке 9.2 показан экран меню того же приложения, запущенного в региональной настройке fr_FR, которая использует локализованные ресурсы, описанные в листинге 9.10. Код приложения I18NDemo3 абсолютно не изменяется. Он просто динамически определяет контекст региональной настройки при инициализации и загружает соответствующий пакет ресурсов.
Рисунок 9.1. Весь текст, видимый пользователю, локализован. Программа извлекает локализованные англоязычные ресурсы с помощью того же механизма, что и для любой другой региональной настройки
Рисунок 9.2. Логическая схема приложения извлекает франкоязычные ресурсы из объекта, который определяет франкоязычные ресурсы приложения
Важным моментом этой разработки является прозрачность и организационная простота, осуществленная с помощью использования последовательностей переключения кода Unicode Java для кодирования не-ASCII строковых литералов в подклассах ListResourceBundle. Эти файлы содержат классы Java, которые вы откомпилировали вместе с остальным исходным кодом приложения. Компилятор преобразует последовательности переключения уникода в строковых литералах на двоичные значения уникода. Поскольку компиляторы Java понимают последовательности переключения уникода, вам не придется выполнять какое-либо преобразование кодировки для получения локализованного текста в форме, требуемой при выполнении, а именно в форме двоичных значений символьной кодировки уникода.
Исследование листингов 9.9 и 9.10 может не убедить вас в выгодах использования последовательностей переключения уникода. Как-никак, большинство текстовых редакторов и операционных систем изначально поддерживают западноевропейские языки, такие, как французский. По этой причине легче создавать локализованные ресурсы для западноевропейских региональных настроек без повторной сортировки последовательностей переключения уникода. Например, пользователи могут создавать французские символы, вводя двухклавишные последовательности переключения в большинстве текстовых редакторов или вставляя их с помощью специальной функции меню.
Возможно, следующий пример более явно отразит выгоды использования последовательностей переключения уникода. В листинге 9.12 показан класс I18NDemoResources_ru_RU, который определяет локализованные ресурсы для русского языка. На рисунке 9.3 показан внешний вид экрана, показанного на рисунке 9.2, когда региональная настройка устанавливается на ru_RU, которая представляет собой русский язык. Ввод русских символов с помощью системы западных языков более сложен, чем ввод французских символов. Однако структуру класса I18NDemoResources_ru_RU и инструменты, требуемые для его создания, не приходится изменять для поддержки использования кириллицы.
Рисунок 9.3. Последовательности переключения уникода легко поддерживают все письменные языки. С помощью простого текстового редактора вы можете создавать локализованные ресурсы для языков, которые не представлены на вашей компьютерной клавиатуре
Листинг 9.12. Файл русского локализированного ресурса также содержит последовательности переключения уникода, которые дают вам возможность представлять символы кириллицы без использования каких-либо специальных текстовых редакторов или инструментов
import javax.microedition.Icdui.Image;
import Java.io.lOException;
/*
Данный класс определяет локализованные ресурсы для приложения I18NDemo3. Вы извлекаете ресурс, вызывая метод getObject() в классе ResourceBundle.
*/
public class I18NDemoResources_ru_RU
extends ListResourceBundle
{
// Содержит один из локализованных ресурсов. Нам необходимо
// инициализировать эту переменную в статическом инициализаторе
// данного класса.
private static Image applcon;
private Object [][] contents =
// "Привет, мир".
("title", "u0417u0434u0440u0430u0441u0442u0432u0443u0439,
u041cu0446uO*440!"),
// "Мой третий MID-лет".
{"greeting", "u041c 43eu0439 u0442u0440u0435u0442u0438u0439 MIDlet!"},
// "Кнопка нажата".
{"alert_title",
"u041au043du043eu043fu043au0430 u041du0430u0436u0430u0442u0430"},
// "Кнопка была нажата!".
("alert_text", "u041au043eu043eu043fu043au0430
u0411u044bu043bu0430 u043du0430u0436u0430u0442u0430!"},
// Экранная клавиша «Выход».
("exit", "u0412u044bu0445u043eu0434"},
{
// Экранная клавиша «Меню».
("menu", "u041cu0435u043du044e"},
// Пункт меню «Отмена».
{"cancel",
"u041fu0440u0435u043au0440u0430u0442u0446u0442u044c"),
// Пункт меню «Стоп».
("stop", "u0421u0442u043eu043f"},
// Пункт меню «ОК». {"ok", "OK"},
// Экранная клавиша «Предупреждение».
("alert", "u0412u043du0446u043cu0430u043du0446u0435"),
// Пункт меню "Скажи привет".
("sayhi","u0421u043au0430u0436u0446
u043fu0440u0446u0432u0435u0442"),
it Пункт меню «Экран».
{"screen", "u042du043au0440u0430u043d"),
// Пункт меню «Предмет».
("item", "u041fu0440u0435u0434u04c3u0435u0442"),
// Пункт меню «Помощь».
("help", "u041fu043eu043cu043eu0449u044c"},
// Значок приложения. ("app_icon", applcon} };
/**
Конструктор No-arg.
*/
public I18NDemoResources_ru_RU()
super();
}
public Object [][] getContents()
}
return contents;
}
// Необходим статический инициализатор для инициализации
// переменной, которая не может быть инициализирована
// в массиве содержимого. Например, мы не можем выделить
// что-либо в массиве содержимого для создания изображения и
// выполнить требуемую обработку исключений.
static
{
try
{
applcon = Image.createlmage("i!8n-ru_RU.png");
}
catch (lOExce'ption ioe)
{
System.out.print In(ioe.getMessage());
ioe.printStackTrace();
}
}
}
Если вы все еще не убеждены, взгляните на листинг 9.13, который показывает ресурсы того же самого приложения, локализованные на японский язык. Класс I18NdemoResources_ja JP был создан с помощью того же текстового редактора, основанного на ASCII. Японские символы не могут быть введены в традиционном текстовом редакторе без поддержки IME. И, если вы используете IME, вы должны убедиться, что используете уникод для записи строковых литералов в файл. В противном случае вашему приложению придется выполнять преобразование посимвольной кодировки.
Листинг 9.13. Последовательности переключения уникода работают со всеми элементами всех письменных языков мира, включая восгочноазиатские языки, такие, как японский
import javax.microedition.Icdui.Image;
import Java.io.lOException;
/**
Данный класс определяет локализованные ресурсы для приложения I18NDemo3.
Вы извлекаете ресурс, вызывая метод getObject() в классе ResourceBundle.
*/
public class I18NDemoResources_ja_JP
extends ListResourceBundle
{
// Содержит один из локализованных ресурсов. Нам необходимо
// инициализировать эту переменную в статическом инициализаторе
// данного класса.
private static Image applcon;
private Object [][] contents =
{
// "Привет, мир"
{"title", "u24f64u3055u3093, u3053u3093u306bu3061u306f"),
// "Мой третий MID-лет".
("greeting", "u79clu306e 3 u3063u3081u306e MIDlet"},
// "Кнопка нажата".
{"alert_title")
"u30dcu30bfu30f3u304cu62bcu3055u308cu307eu3057u305f"},
// "Кнопка была нажата".
"alert_text",
"u30dcu30bfu30f3u304cu62bcu3055u308cu3C7eu3057u305f!"}
// Пункт меню «Выход», {"exit", "u51fa53e3"},
// Экранная клавиша «Меню».
("menu", "u30elu30cbu30e6u30fc"),
// Пункт меню «Отмена».
("cancel", "u3Cadu30e4u30f3u30bbu30eb"),
// Пункт меню «Стоп». {"stop", "u505cu6b62"),
// Пункт меню «ОК». ("ok", "OK"},
// Экранная клавиша «Предупреждение», {"alert", "Alert"),
// Пункт меню "Скажи привет", ("sayhi","u30cfu30a4"},
// Пункт меню «Экран».
{"screen", "u30b9u30afu30eau30f3"),
// Пункт меню «Предмет», {"item", "u9805u76ee"),
// Пункт меню «Помощь».
("help", "u308d"},
// Значок приложения.
{"app_icon", applcon)
/**
Конструктор No-arg.
*/
public I18NDemoResources_ja JP()
{
super();
)
public Object [][] getContents ()
{
return contents;
{
// Необходим статический инициализатор для инициализации
// переменной, которая не может быть инициализирована в
// массиве содержимого. Например, мы не можем выделить что-либо
// в массиве содержимого для создания изображения и выполнить
// требуемую обработку исключений.
static
{
try
{
applcon = Image.createlmage("i!8n-ja_JP.png");
{
catch (lOException ioe)
{
System.out.println(ioe.getMessage());
ioe.printStackTrace();
}
}
}
В листинге 9.14 показан файл I18NDemoResources_zh_CH. Java, который определяет локализованные ресурсы для упрощенного китайского языка.
Листинг 9.14. Этот файл определяет локализованные ресурсы для региональной настройки zh_CN, Китай, приложения I18NDemo3
import javax.microedition.Icdui.Image; import Java.io.lOException;
/**
Данный класс определяет локализованные ресурсы для приложения I18NDemo3.
Вы извлекаете ресурс, вызывая метод getObjectO в классе ResourceBundle.
*/
public class I18NDemoResources_zh_CN
extends ListResourceBundle
{
// Содержит один из локализованных ресурсов. Нам необходимо
// инициализировать эту переменную в статическом инициализаторе
// данного класса.
private static Image applcon;
private Object [][] contents =
{
// Заголовок формы "Hello, World".
("title", "u54c8u7f57u4el6754c"),
// Текст формы "My third MIDlet".
("greeting", "u62llu76847b2cu4e09u4187 MIDlet"},
// Заголовок уведомления "Button Pressed". ("alert_title", "u6309u4eObu6309u9215"],
// Текст уведомления "A button was pressed!". ("alert_text", "u6309u4eOOu4187u6309u9215!"},
// Пункт меню «Exit».
("exit", "u767bu51fa"},
// Экранная клавиша «Menu», ("menu", "u76eeu5f54"},
// Пункт меню «Cancel», {"cancel", "u53d6u6d88"j,
// Пункт меню «Stop», ("stop", "u505cu6b62"},
// Пункт меню «OK». {"ok", "OK"),
// Экранная клавиша «Alert», {"alert", "u8b66u793a"),
// Пункт меню "Say Hi", ("sayhi", "u55e8"},
// Пункт меню «Screen». ("screen", "u87a2u5e55"),
// Пункт меню «Item», ("item", "u9879u76ee"},
// Пункт меню «Help», {"help", "u8bf4u660e"},
// Значок приложения. {"app_icon", applcon}
};
/**
Конструктор No-arg.
*/
public I18NDemoResources_zh CN()
{
super!);
{
public Object [][] getContents ()
{
return contents;
}
// Необходим статический инициализатор для инициализации
// переменной, которая не может быть инициализирована в
// массиве содержимого. Например, мы не можем выделить что-либо
// в массиве содержимого для создания изображения и выполнить
// требуемую обработку исключений.
static
{
try
{
applcon = Imagb.createlraage("i!8n-zh_CN.png");
}
catch (lOException ioe)
{
System.out.println(ioe.getMessage!)); ioe.printStackTrace();
}
}
}
Использование классификационных файлов Java имеет несколько преимуществ перед двумя предыдущими разработками. Прежде всего, оно позволяет избежать создания комплексной структуры потоков и анализа текстовых файлов, которые вы видели в предыдущем подходе. Доступ к ресурсам так же прост, как создание экземпляра класса. Более важно то, что пакеты ресурсов могут быть легко приспособлены к любому из объектов Java – не только к строкам – как локализованные ресурсы. Первым двум подходам, представленным в этой главе, приходилось определять атрибуты, чьи значения были именами классов, экземпляры которых нужно было создавать, и затем создавать экземпляры данных классов после считывания и анализа файла ресурса. Подход, основанный на пакетах ресурсов, создает экземпляры всех объектов неявно, когда пакет ресурсов создан. И классы пакетов ресурсов оставляют небольшой след, используя меньше ресурсов рабочей памяти, чем предыдущий подход.
Подход пакетов ресурсов также содействует легкому переносу приложений в среду J2SE. Реализации классов пакетов ресурсов, показанных в листингах 9.7 и 9.8, создают только подмножество необходимых свойств. Но их строгое следование интерфейсам версий J2SE означает, что подклассы ListResourceBundle вашего приложения совместимы снизу вверх.
Пакеты ресурсов также способствуют лучшей восстанавливаемости и большей понятности. Зависящие от приложения подклассы ListResourceBundle могут быть легко восстановлены только лишь с помощью текстового редактора, основанного на ASCII. Любой ASCII-текстовой редактор может считывать и записывать символы ASCII или последовательности переключения кода Unicode Java, присутствующие в пакетах ресурсов. Кроме того, поскольку это исходные файлы Java, разработчики могут вставлять комментарии, которые ясно описывают каждый ресурс и контекст, в котором приложение его использует.
И последнее преимущество, предлагаемое подходом пакетов ресурсов, заключается в том, что вы можете очень просто определять несколько пакетов ресурсов на одну региональную настройку. Вы можете определить, например, один пакет для текста, который появляется на компонентах пользовательского интерфейса, другой специально для сообщений об ошибке, один для изображений и так далее. Конечно, вы можете систематизировать их в соответствии с вашим приложением.
Использование классификационных файлов Java для определения локализованных ресурсов предлагает прозрачность разработки, восстанавливаемость, расширяемость и приспособляемость к любому виду обьектов локализации Java. Несмотря на ати преимущества, однако, вы должны знать о компромиссных решениях, имеющихся наряду с этими двумя подходами, представленными в данной главе.
Установка нескольких файлов классов Java для локализованных ресурсов может потребовать больше ресурсов хранения устройства, чем вы можете себе позволить. Наиболее очевидной проблемой при разработке MIDP является потребление памяти. Хотя два первых подхода неудобны по нескольким причинам, они затрачивают меньше ресурсов памяти, чем подход классификационного файла Java. Иногда, когда вы не можете позволить себе лишние траты памяти, вы можете позволить приложению затратить несколько дополнительных секунд при запуске на считывание и анализ локализованных ресурсов. Одним из возможных компромиссов является игнорирование иерархии наследования ResourceBundle и предоставление единственного класса, который содержит локализованные ресурсы для каждой региональной настройки. Предоставьте соответствующий локализованный классификационный файл указанной региональной настройке приложения. Здесь вы жертвуете гибкостью ради производительности. Вы также теряете совместимость снизу вверх с J2SE, но это может быть неважно.
Инициализация приложения с локализованными ресурсами
Все три стратегии разработки, представленные в этой главе, включают добавление локализованных ресурсов к остальному коду приложения. В реальных средах беспроводных сетей все может работать по-другому. Некоторые беспроводные транспортировщики уже поддерживают системы инициализации приложений, которые поддерживают динамическое обнаружение, извлечение и установку приложений Java на мобильных устройствах. Возможно, что вскоре все транспортировщики будут иметь такие системы. Инициализация приложений является темой главы 10.
Скорее всего, эти системы будут предоставлять способ для устройств сообщения информации о среде их исполнения и получения от сервера нужных им ресурсов. Например, AMS устройства может указывать контекст региональной настройки устройства и загружать из инициализирующей системы только локализованные ресурсы для данной региональной настройки.
Данное взаимодействие между AMS устройства и инициализирующим сервером предотвращает необходимость установки локализованных ресурсов для многочисленных региональных настроек на устройстве. Оно также обеспечивает способ для AMS, с помощью которого можно показывать пользователю, поддерживается ли региональная настройка, до запуска приложения. Тем не менее, разработчики могут найти, что легче упаковать откомпилированные локализованные файлы классов вместе с остальным кодом приложения. Проблемы разработки приложения, его установки, доставки и восстановления должны рассматриваться как часть каждой разработки.
Выводы по главе
Интернационализация – это действия по предоставлению приложению возможности динамического извлечения и использования чувствительных к региональным настройкам ресурсов при работе. Интернационализация является важным свойством приложений MIDP. Интернационализированное приложение предназначено для большей пользовательской аудитории.
Интернационализация приложения означает предоставление ему при выполнении возможности извлечения ресурсов, которые совместимй с контекстом региональной настройки, в которой приложение работает. Локализация – это процесс предоставления ресурсов одному или нескольким контекстам региональной настройки.
Локализация – это деятельность по созданию определяемых региональной настройкой ресурсов для интернационализированных программ, к которым приложение получает доступ при выполнении. Работы по интернационализации и локализации сходны. Организация и задание формата локализованных ресурсов должны отражать схему и проектирование интернационализации. Решения всесторонней интернационализации и локализации должны обращаться к чувствительным к региональным настройкам операциям в следующих областях приложения:
– работа с сообщениями;
– задание формата даты, времени, числовых и денежных значений;
– поддержка календаря;
– чувствительные к региональной специфике значки, изображения и цвета.
Возможности, доступные в платформе MIDP, влияют на выбор варианта разработки интернационализации и затрагивают осуществимость реализации определенных разработок приложений MIDP. Платформа MIDP предоставляет три следующих основных механизма, которые могут быть использованы для создания возможностей интернационализации:
– определяемые пользователем атрибуты набора MID-летов:
– файл дескриптора приложения; поддержка извлечения ресурсов (файлов) из файла JAR набора MID-летов: Class. getResourceAsStream(StringresourceName);
– преобразование символьных кодировок: пакет java.io.
Разработчики приложений MIDP должны также учитывать факторы производительности, восстанавливаемости и установки при разработке решений интернационализации и локализации.