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