Интернационализация программ
Java Advanced
Java Advanced / Интернационализация программ 2
СПбГУ ИТМО
Georgiy Korneev
Содержание
ЛокалиЛокализация данныхФорматированиеРабота с текстомЗаключение
Java Advanced / Интернационализация программ 3
СПбГУ ИТМО
Georgiy Korneev
Введение
Интернационализация программы Написание программы, работающий в
различных языковых окружениях
Локализация программы Адаптация интернационализированной
программы к конкретным языковым окружением
Пакеты java.util java.text
Java Advanced / Интернационализация программ 4
СПбГУ ИТМО
Georgiy Korneev
Область действия
СообщенияЧислаДата и времяЕдиницы измеренияАдресаНомера телефоновИнтерфейс…
ЛокалиЧасть 1
Java Advanced / Интернационализация программ 6
СПбГУ ИТМО
Georgiy Korneev
Локаль
Идентифицирует используемое языковое окружение
Класс Locale
Java Advanced / Интернационализация программ 7
СПбГУ ИТМО
Georgiy Korneev
Задание локали
Составные локали Язык getLanguage() Страна getCountry() Вариант getVariant()
Конструкторы класса Locale Locale(language) – по языку Locale(language, country) – по языку и стране Locale(language, country, variant) – по языку
стране и варианту
Java Advanced / Интернационализация программ 8
СПбГУ ИТМО
Georgiy Korneev
Пример: локализованные данные
en_UK_windowschoose the foldercontaining colourinformation
en_UK_unixchoose the directory
containing colourinformation
en_USchoose the foldercontaining colorinformation
ru_RU_unixВыберите каталог,содержащийцветовую информацию
Java Advanced / Интернационализация программ 9
СПбГУ ИТМО
Georgiy Korneev
Работа с локалями
Получение getAvailableLocales() – список доступных
локалей Поля UK, US, FRANCE, …
Локаль по умолчанию getDefault() – получение локали по умолчанию setDefault(Locale locale) – установка локали по
умолчанию
Вывод пользователю getDisplayName() – имя локали
Локализация данныхЧасть 2
Java Advanced / Интернационализация программ 11
СПбГУ ИТМО
Georgiy Korneev
Локализация данных
Хранение данных, зависящих от локали в одном месте
Класс ResourceBundle
Java Advanced / Collections Framework 12Georgiy Korneev
Операции с данными
Получение данных getObject(String key) – произвольный объект getString(String key) – в виде строки getStringArray(String[] key) – массив строк Исключение MissingResouceException
Получение информации о ресурсе getLocale() – локаль Enumeration<String> getKeys() – ключи
Java Advanced / Collections Framework 13Georgiy Korneev
Пример: Интернационализация
До интернационализации void printUsage() {
System.out.println(
"Usage: Test [<options>] <commands>\n" +
"Options:\n" +
" -o write output\n" +
"... "
);
}
Java Advanced / Collections Framework 14Georgiy Korneev
Пример: Интернационализация
После интернационализациияvoid printUsage(ResourceBundle bundle) { System.out.println(String.format( "%s Test [%s] %s\n" + "%s\n" + " -o %s\n"+ "...", bundle.getString("usage"), // Usage: bundle.getString("options"), // <options> bundle.getString("commands"), // <commands> bundle.getString("Options"), // Options: bundle.getString("-o") // Write output ));}
Java Advanced / Collections Framework 15Georgiy Korneev
Загрузка ресурсов
Методы getBundle(String baseName) – по имени getBundle(baseName, Locale) – по локали getBundle(baseName, Locale, ClassLoader) – из
заданного ClassLoader’а
Java Advanced / Collections Framework 16Georgiy Korneev
Порядок загрузки ресурсов
1 – указанная локаль
2– локаль по умолчанию baseName_language1_country1_variant1 baseName_language1_country1 baseName_language1 baseName_language2_country2_variant2 baseName_language2_country2 baseName_language2 baseName
Java Advanced / Collections Framework 17Georgiy Korneev
Пример: загрузка ресурса
Ресурс UsageResouceBundle
локаль en_US
ResourceBundle bundle =
ResourceBundle.getBundle(
"UsageResouceBundle",
Locale.US
);
printUsage(bundle);
Java Advanced / Collections Framework 18Georgiy Korneev
Задание ресурсов
Произвольные Класс ListResouceBundle
Строковые Класс PropertyResouceBundle
Java Advanced / Collections Framework 19Georgiy Korneev
ListResouceBundle
Данные задаются в классеМетод
Object[][] getContents() – локализованные данные
Java Advanced / Collections Framework 20Georgiy Korneev
Пример: ListResouceBundle
Данные для локали en_USpublic class UsageResouceBundle_en_US extends ListResourceBundle { private static final Object[][] CONTENTS = { {"usage", "Usage:"}, {"options", "<options>"}, {"commands", "<commands>"}, {"Options", "Options:"}, {"-o", "Write output"}, };
protected Object[][] getContents() {return CONTENTS;}}
Java Advanced / Collections Framework 21Georgiy Korneev
PropertyResouceBundle
Данные задаются в .property файлеСтруктура .property файла
key1 = value1
key2 : value2
key3 = very long value \
continues on next line
# Comment
…
Java Advanced / Collections Framework 22Georgiy Korneev
Пример: PropertyResouceBundle
Данные для локали en_USUsageResouceBundle_en_US.properties
usage =Usage:
options =<options>
Commands =<commands>
Options =Options:
-o =Write output
ФорматированиеЧасть 3
Java Advanced / Интернационализация программ 24
СПбГУ ИТМО
Georgiy Korneev
Форматирование
Вывод данных в соответствии с языковым контекстом
Типы данных Числа Время и дата Сообщения
Пакет java.text
Java Advanced / Интернационализация программ 25
СПбГУ ИТМО
Georgiy Korneev
Форматирование чисел
Класс NumberFormatМетоды
format(long) – форматировать целое число format(double) – форматировать число с
плавающей точкой Number parse(String) – разобрать
локализованное число
Исключение ParseException – ошибка разбора
Java Advanced / Интернационализация программ 26
СПбГУ ИТМО
Georgiy Korneev
Стандартные форматировщики чисел
Получение форматировщиков чиселМетоды
getNumberInstance(locale?) – обычные числа getIntegerIntance(locale?) – целые числа (с
округлением) getPercentInstance(locale?) – проценты getCurrencyInstance(locale?) – валюта
Java Advanced / Интернационализация программ 27
СПбГУ ИТМО
Georgiy Korneev
Свойства форматировщиков чисел
Свойства форматировщиков чисел Currency currency – тип валюты maximum(minimum)FractionDigits – число цифр
в дробной части maximum(minimum)IntegerDigits – число цифр в
целой части groupingUsed – группировка разрядов parseIntegerOnly – разбор только целых чисел
Java Advanced / Интернационализация программ 28
СПбГУ ИТМО
Georgiy Korneev
Специальное форматирование чисел
Класс DecimalFormat Шаблоны форматирования ###,###.###
Класс DecimalFormatSymbols – символы используемые при форматировании Десятичная запятая Разделители групп Бесконечности …
Java Advanced / Интернационализация программ 29
СПбГУ ИТМО
Georgiy Korneev
Специальное форматировани чисел
Класс ChoiceFormatКонструкторы
ChoiceFormat(double[] limits, String[] formats) –программно
ChoiceFormat(String pattern) – по шаблону
Использование форматов i-й если limits[i] <= n && n < limits[i + 1]
Формат шаблона limit # format | limit # format | …
Java Advanced / Интернационализация программ 30
СПбГУ ИТМО
Georgiy Korneev
Форматирование времени и дат
Класс DateFormatМетоды
format(date) – форматировать дату/время Date parse(String) – разобрать локализованную
дату/время
Исключение ParseException – ошибка разбора
Java Advanced / Интернационализация программ 31
СПбГУ ИТМО
Georgiy Korneev
Стандартные форматировщики
Получение форматировщиков времени и дат
Методы getDateInstance([dateStyle[, locale]]) – даты getTimeIntance([timeStyle[, locale]]) – времени getDateTimeIntance([dateStyle, timeStyle,
[locale]]) – даты и времени
Стили DEFAULT, FULL, LONG, MEDIUM, SHORT
Java Advanced / Интернационализация программ 32
СПбГУ ИТМО
Georgiy Korneev
Свойства форматировщиков
Свойства форматировщиков даты/времени calendar – тип календаря timeZone – временная зона
Java Advanced / Интернационализация программ 33
СПбГУ ИТМО
Georgiy Korneev
Специальное форматирование
Задание правил форматированияКласс SimpleDateFormat
Шаблоны форматирования
yyyy.MM.dd G 'at' HH:mm:ss z
Класс DateFormatSymbols – символы используемые при форматировании Дни недели Месяца …
Java Advanced / Интернационализация программ 34
СПбГУ ИТМО
Georgiy Korneev
Форматирование сообщений
Класс MessageFormatМетоды
format(Object[] arguments) – форматировать сообщение
Static format(String pattern, Object … arguments) – форматировать сообщение по шаблону
Java Advanced / Интернационализация программ 35
СПбГУ ИТМО
Georgiy Korneev
Шаблоны сообщений
Вид шаблон := (текст { параметр })* параметр := индекс[, тип[, стиль]] тип := number | date | time | choice
Пример// Aug 2, 2005: $10.80 available
MessageFormat.fomat(
"{0,date}: {1,number,currency} available“,
new Date(), amount
)
Работа с текстомЧасть 4
Java Advanced / Интернационализация программ 37
СПбГУ ИТМО
Georgiy Korneev
Сравнение строк
Лексикографический порядок зависит от языка
Класс Collator implements Comparator<String> getInstance([locale]) – получение экземпляра
Класс RuleBasedCollator Сравнивает строки в соответствии с
заданными правилами
Java Advanced / Интернационализация программ 38
СПбГУ ИТМО
Georgiy Korneev
Разбиение текста на элементы
Разбиение текста на символы, слова, предложения и строки зависит от языка
Класс BreakIteratorСоздание
get(
Character / Word / Line / Sentense
)Instance([locale]) – получение экземпляра
Методы first() / last() / next() / previous() – передвижение
итератора
Java Advanced / Интернационализация программ 39
СПбГУ ИТМО
Georgiy Korneev
Задание текста
Текст читается в кодировке Latin-1Программа native2ascii
Перекодирует в (из) Latin-1 native2ascii [options] [inputfile [outputfile]] Опции
-reverse – перекодирование из Latin-1 -encoding encoding – установка кодировки
Java Advanced / Интернационализация программ 40
СПбГУ ИТМО
Georgiy Korneev
Пример: сообщения на русском (1)
До перекодировкиusage=Применение
options=<Опции>
Commands=<команды>
Options=Опции:
-o=Запись выходного файла
Java Advanced / Интернационализация программ 41
СПбГУ ИТМО
Georgiy Korneev
Пример: сообщения на русском (2)
После перекодировкиusage=\u040f\u0430\u0401\u00ac\u0490\u00ad\
u0490\u00ad\u0401\u0490
options=<\u040b\u0407\u0436\u0401\u0401>
Commands=<\u0404\u00ae\u00ac\u00a0\u00ad\u00a4\u043b>
Options=\u040b\u0407\u0436\u0401\u0401:
-o=\u2021\u00a0\u0407\u0401\u0431\u043c \u045e\u043b\u0435\u00ae\u00a4\u00ad\u00ae\u0408\u00ae \u0434\u00a0\u00a9\u00ab\u00a0
ЗаключениеЧасть 6
Java Advanced / Интернационализация программ 43
СПбГУ ИТМО
Georgiy Korneev
Ссылки
Internationalization (guide) // http://java.sun.com/j2se/1.5.0/docs/guide/intl/
Trail: Internationalization (Java Tutorial) // http://java.sun.com/docs/books/tutorial/i18n/
Internationalization // http://java.sun.com/j2se/corejava/intl/
Properties // http://java.sun.com/j2se/1.5.0/docs/api/java/util/Properties.html
Java Advanced / Интернационализация программ 44
СПбГУ ИТМО
Georgiy Korneev
Вопросы