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