Интернационализация программ
Download
Report
Transcript Интернационализация программ
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