|
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. В этом разделе Вы изучите, как иметь дело со множественными числами в сообщении, ступая через вызванный пример программы
Во-первых, идентифицируйте переменные в сообщении:

Затем, замените переменные в сообщении с параметрами, создавая образец, которому можно примениться к a MessageFormat объект:
There {0} on {1}.
Параметр за дисковое имя, которое представляется{1}, достаточно легко иметь дело с. Вы только обрабатываете это как любой другой String переменная в a MessageFormat образец. Этот параметр соответствует, элемент в индексируют 1 в массиве значений аргументов. (См. шаг 7.)
Контакт с параметром{0} более сложно, по нескольким причинам:
String. Например, номер 1 отобразится на String содержа фразу is one file. ChoiceFormat class позволяет Вам выполнять необходимое отображение.MessageFormat class позволяет Вам вставлять число во фразу.Поскольку текст сообщения должен быть преобразован, изолируйте его в 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
В этом шаге Вы инстанцируете MessageFormat и набор Locale:
MessageFormat messageForm = new MessageFormat("");
messageForm.setLocale(currentLocale);
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);
Помните образец, который Вы создали в шаге 1? Пора получить образец от ResourceBundle и примените это к MessageFormat объект:
String pattern = bundle.getString("pattern");
messageForm.applyPattern(pattern);
В этом шаге Вы присваиваетесь к 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} |
Во время выполнения программа присваивает переменные массиву параметров, которые это передает к 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);
}
Сравните сообщения, выведенные на экран программой с фразами в 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.