Последовательности
Листинг 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", "\u24f64\u3055\u3093, \u3053\u3093\u306b\u3061\u306f"),
// "Мой третий MID-лет".
("greeting", "\u79cl\u306e 3 \u3063\u3081\u306e MIDlet"},
// "Кнопка нажата".
{"alert_title")
"\u30dc\u30bf\u30f3\u304c\u62bc\u3055\u308c\u307e\u3057\u305f"},
// "Кнопка была нажата".
"alert_text",
"\u30dc\u30bf\u30f3\u304c\u62bc\u3055\u308c\u3C7e\u3057\u305f!"}
// Пункт меню "Выход", {"exit", "\u51fa\53e3"},
// Экранная клавиша "Меню".
("menu", "\u30el\u30cb\u30e6\u30fc"),
// Пункт меню "Отмена".
("cancel", "\u3Cad\u30e4\u30f3\u30bb\u30eb"),
// Пункт меню "Стоп". {"stop", "\u505c\u6b62"),
// Пункт меню "ОК". ("ok", "OK"},
// Экранная клавиша "Предупреждение", {"alert", "Alert"),
// Пункт меню "Скажи привет", ("sayhi","\u30cf\u30a4"},
// Пункт меню "Экран".
{"screen", "\u30b9\u30af\u30ea\u30f3"),
// Пункт меню "Предмет", {"item", "\u9805\u76ee"),
// Пункт меню "Помощь".
("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.printStackTracef);
}
}
}
В листинге 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", "\u54c8\u7f57\u4el6\754c"),
// Текст формы "My third MIDlet".
("greeting", "\u62ll\u7684\7b2c\u4e09\u4187 MIDlet"},
// Заголовок уведомления "Button Pressed". ("alert_title", "\u6309\u4eOb\u6309\u9215"],
// Текст уведомления "A button was pressed!". ("alert_text", "\u6309\u4eOO\u4187\u6309\u9215!"},
// Пункт меню "Exit".
("exit", "\u767b\u51fa"},
// Экранная клавиша "Menu", ("menu", "\u76ee\u5f54"},
// Пункт меню "Cancel", {"cancel", "\u53d6\u6d88"j,
// Пункт меню "Stop", ("stop", "\u505c\u6b62"},
// Пункт меню "OK". {"ok", "OK"),
// Экранная клавиша "Alert", {"alert", "\u8b66\u793a"),
// Пункт меню "Say Hi", ("sayhi", "\u55e8"},
// Пункт меню "Screen". ("screen", "\u87a2\u5e55"),
// Пункт меню "Item", ("item", "\u9879\u76ee"},
// Пункт меню "Help", {"help", "\u8bf4\u660e"},
// Значок приложения. {"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, но это может быть неважно.