Интернационализация программ

реклама
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
Скачать