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