Spec-Zone .ru
спецификации, руководства, описания, API
След: Интернационализация
Урок: Форматирование
Раздел: сообщения
Обработка Множественных чисел
Домашняя страница > Интернационализация > Форматирование

Обработка Множественных чисел

Слова в сообщении могут измениться, если и множественные и исключительные словоформы возможны. С ChoiceFormat class, можно отобразить число на слово или фразу, разрешая Вам создать грамматически корректные сообщения.

На английском языке формы множественного числа и формы единственного числа слова обычно отличаются. Это может представить проблему, когда Вы создаете сообщения, которые относятся к количествам. Например, если Ваше сообщение сообщает о числе файлов на диске, следующие изменения возможны:

There are no files on XDisk.
There is one file on XDisk.
There are 2 files on XDisk.

Самый быстрый способ решить эту проблему состоит в том, чтобы создать a MessageFormat образец как это:

There are {0,number} file(s) on {1}.

К сожалению, предыдущий образец приводит к неправильной грамматике:

There are 1 file(s) on XDisk.

Можно добиться большего успеха чем это, при условии, что Вы используете ChoiceFormat class. В этом разделе Вы изучите, как иметь дело со множественными числами в сообщении, ступая через вызванный пример программы ChoiceFormatDemo. Эта программа также использует MessageFormat class, который обсуждается в предыдущем разделе, Контакте с Составными сообщениями.

1. Определите сообщение Образец

Во-первых, идентифицируйте переменные в сообщении:

Три строки текста, с переменными в каждой строке выделялись.

Затем, замените переменные в сообщении с параметрами, создавая образец, которому можно примениться к a MessageFormat объект:

There {0} on {1}.

Параметр за дисковое имя, которое представляется{1}, достаточно легко иметь дело с. Вы только обрабатываете это как любой другой String переменная в a MessageFormat образец. Этот параметр соответствует, элемент в индексируют 1 в массиве значений аргументов. (См. шаг 7.)

Контакт с параметром{0} более сложно, по нескольким причинам:

2. Создайте ResourceBundle

Поскольку текст сообщения должен быть преобразован, изолируйте его в a ResourceBundle:

ResourceBundle bundle = ResourceBundle.getBundle(
    "ChoiceBundle", currentLocale);

Пример программы отступает ResourceBundle с файлами свойств. ChoiceBundle_en_US.propertiesсодержит следующие строки:

pattern = There {0} on {1}.
noFiles = are no files
oneFile = is one file
multipleFiles = are {2} files

Содержание этого шоу файла свойств, как сообщение будет создано и отформатировано. Первая строка содержит образец для MessageFormat . (См. шаг 1.) Другие строки содержат фразы, которые заменят параметр {0} в образце. Фраза для multipleFiles ключ содержит параметр {2}, который будет заменен числом.

Вот французская версия файла свойств, ChoiceBundle_fr_FR.properties

pattern = Il {0} sur {1}.
noFiles = n'y a pas de fichiers
oneFile = y a un fichier
multipleFiles = y a {2} fichiers

3. Создайте сообщение Средство форматирования

В этом шаге Вы инстанцируете MessageFormat и набор Locale:

MessageFormat messageForm = new MessageFormat("");
messageForm.setLocale(currentLocale);

4. Создайте Средство форматирования Выбора

ChoiceFormat объект позволяет Вам выбирать, основанный на a double число, деталь String. Диапазон double числа, и String объекты, на которые они отображаются, определяются в массивах:

double[] fileLimits = {0,1,2};
String [] fileStrings = {
    bundle.getString("noFiles"),
    bundle.getString("oneFile"),
    bundle.getString("multipleFiles")
};

ChoiceFormat карты каждый элемент в double выстройте к элементу в String массив, у которого есть то же самое, индексирует. В примере кода 0 карт к String возвращенный, вызывая bundle.getString("noFiles"). По совпадению индексирование является тем же самым как значением в fileLimits массив. Если код установил fileLimits[0] к семь, ChoiceFormat отобразил бы номер 7 на fileStrings[0].

Вы определяете double и String массивы, инстанцируя ChoiceFormat:

ChoiceFormat choiceForm = new ChoiceFormat(fileLimits, fileStrings);

5. Примените Образец

Помните образец, который Вы создали в шаге 1? Пора получить образец от ResourceBundle и примените это к MessageFormat объект:

String pattern = bundle.getString("pattern");
messageForm.applyPattern(pattern);

6. Присвойте Форматы

В этом шаге Вы присваиваетесь к MessageFormat возразите ChoiceFormat объект создал в шаге 4:

Format[] formats = {choiceForm, null, NumberFormat.getInstance()};
messageForm.setFormats(formats);

setFormats метод присваивается Format объекты к параметрам в образце сообщения. Следует вызвать applyPattern метод прежде, чем Вы вызовете setFormats метод. Следующая таблица показывает как элементы Format массив соответствует параметрам в образце сообщения:

Format Массив ChoiceFormatDemo Программа

Элемент массива Параметр образца
choiceForm {0}
null {1}
NumberFormat.getInstance() {2}

7. Установите Параметры и Формат сообщение

Во время выполнения программа присваивает переменные массиву параметров, которые это передает к MessageFormat объект. Элементы в массиве соответствуют параметрам в образце. Например, messageArgument[1] карты, чтобы скопировать параметр {1}, который является a String содержа имя диска. В предыдущем шаге программа присвоенный a ChoiceFormat возразите против параметра {0} из образца. Поэтому число, присвоенное messageArgument[0] определяет который String ChoiceFormat объект выбирает. Если messageArgument[0] больше чем или равен 2, String содержа фразу are {2} files параметр замен {0} в образце. Число, присвоенное messageArgument[2] будет заменен вместо параметра образца {2}. Вот код, который испытывает это:

Object[] messageArguments = {null, "XDisk", null};

for (int numFiles = 0; numFiles < 4; numFiles++) {
    messageArguments[0] = new Integer(numFiles);
    messageArguments[2] = new Integer(numFiles);
    String result = messageForm.format(messageArguments);
    System.out.println(result);
}

8. Выполните Демонстрационную Программу

Сравните сообщения, выведенные на экран программой с фразами в ResourceBundle из шага 2. Заметьте что ChoiceFormat объект выбирает корректную фразу, который MessageFormat возразите использованию, чтобы создать надлежащее сообщение. Вывод ChoiceFormatDemo программа следующие:

currentLocale = en_US
There are no files on XDisk.
There is one file on XDisk.
There are 2 files on XDisk.
There are 3 files on XDisk.

currentLocale = fr_FR
Il n'y a pas des fichiers sur XDisk.
Il y a un fichier sur XDisk.
Il y a 2 fichiers sur XDisk.
Il y a 3 fichiers sur XDisk.

Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Контакт с Составными сообщениями
Следующая страница: Работа с текстом