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}.
| |
| |
| |