PluralFormat
supports the creation of internationalized messages with plural inflection. It is based on plural selection, i.e. the caller specifies messages for each plural case that can appear in the users language and the PluralFormat
selects the appropriate message based on the number.
Different languages have different ways to inflect plurals. Creating internationalized messages that include plural forms is only feasible when the framework is able to handle plural forms of all languages correctly. ChoiceFormat
doesn't handle this well, because it attaches a number interval to each message and selects the message whose interval contains a given number. This can only handle a finite number of intervals. But in some languages, like Polish, one plural case applies to infinitely many intervals (e.g., paucal applies to numbers ending with 2, 3, or 4 except those ending with 12, 13, or 14). Thus ChoiceFormat
is not adequate.
PluralFormat
deals with this by breaking the problem into two parts:
PluralRules
that can define more complex conditions for a plural case than just a single interval. These plural rules define both what plural cases exist in a language, and to which numbers these cases apply. PluralFormat
This discussion assumes that you use PluralFormat
with a predefined set of plural rules. You can create one using one of the constructors that takes a ULocale
object. To specify the message pattern, you can either pass it to the constructor or set it explicitly using the applyPattern()
method. The format()
method takes a number object and selects the message of the matching plural case. This message will be returned.
The pattern text defines the message output for each plural case of the used locale. The pattern is a sequence of caseKeyword{message}
clauses, separated by white space characters. Each clause assigns the message message
to the plural case identified by caseKeyword
.
You always have to define a message text for the default plural case "other
" which is contained in every rule set. If the plural rules of the PluralFormat
object do not contain a plural case identified by caseKeyword
, an IllegalArgumentException
is thrown. If you do not specify a message text for a particular plural case, the message text of the plural case "other
" gets assigned to this plural case. If you specify more than one message for the same plural case, an IllegalArgumentException
is thrown.
Spaces between caseKeyword
and message
will be ignored; spaces within message
will be preserved.
The message text for a particular plural case may contain other message format patterns. PluralFormat
preserves these so that you can use the strings produced by PluralFormat
with other formatters. If you are using PluralFormat
inside a MessageFormat
pattern, MessageFormat
will automatically evaluate the resulting format pattern.
Thus, curly braces ({
, }
) are only allowed in message texts to define a nested format pattern.
The pound sign (#
) will be interpreted as the number placeholder in the message text, if it is not contained in curly braces (to preserve NumberFormat
patterns). PluralFormat
will replace each of those pound signs by the number passed to the format()
method. It will be formatted using a NumberFormat
for the PluralFormat
's locale. If you need special number formatting, you have to explicitly specify a NumberFormat
for the PluralFormat
to use.
MessageFormat msgFmt = new MessageFormat("{0, plural, " + "one{{0, number, C''''est #,##0.0# fichier}} " + "other {Ce sont # fichiers}} dans la liste.", new ULocale("fr")); Object args[] = {new Long(0)}; System.out.println(msgFmt.format(args)); args = {new Long(3)}; System.out.println(msgFmt.format(args));Produces the output:
C'est 0,0 fichier dans la liste.
Ce sont 3 fichiers dans la liste."
Note:
Currently PluralFormat
does not make use of quotes like MessageFormat
. If you use plural format strings with MessageFormat
and want to use a quote sign "'
", you have to write "''
". MessageFormat
unquotes this pattern and passes the unquoted pattern to PluralFormat
. It's a bit trickier if you use nested formats that do quoting. In the example above, we wanted to insert "'
" in the number format pattern. Since NumberFormat
supports quotes, we had to insert "''
". But since MessageFormat
unquotes the pattern before it gets passed to PluralFormat
, we have to double these quotes, i.e. write "''''
".
If you need to use PluralFormat
with custom rules, you can create a PluralRules
object and pass it to PluralFormat
's constructor. If you also specify a locale in this constructor, this locale will be used to format the number in the message texts.
For more information about PluralRules
, see {@link PluralRules}.
|
|
|
|
|
|