ChoiceFormat converts between ranges of numeric values and string
names for those ranges.
A ChoiceFormat splits the real number line -Inf to +Inf into two or
more contiguous ranges. Each range is mapped to a string.
ChoiceFormat is generally used in a MessageFormat for displaying
grammatically correct plurals such as "There are 2 files."
$string = '[0] are no files |[1] is one file |(1,Inf] are {number} files';
$formatter = new MessageFormat(...); //init for a source
$translated = $formatter->format($string);
$choice = new ChoiceFormat();
echo $choice->format($translated, 0); //shows "are no files"
The message/string choices are separated by the pipe "|" followed
by a set notation of the form
# [1,2] -- accepts values between 1 and 2, inclusive.
# (1,2) -- accepts values between 1 and 2, excluding 1 and 2.
# {1,2,3,4} -- only values defined in the set are accepted.
# [-Inf,0) -- accepts value greater or equal to negative infinity
and strictly less than 0
Any non-empty combinations of the delimiters of square and round brackets
are acceptable.
Since version 3.1.2 the following set notation is also possible.
# {n: n % 10 > 1 && n % 10 < 5} -- matches numbers like 2, 3, 4, 22, 23, 24
Where set is defined by the expression after n:. In particular, the expression
accepts the following mathematical/logical operators to form a set of logical conditions
on the value given by n:
# < -- less than.
# <= -- less than equals.
# > -- greater than.
# >= -- greater than equals.
# == -- of equal value.
# % -- modulo, e.g., 1 % 10 equals 1, 11 % 10 equals 1.
# - -- minus, negative.
# + -- addition.
# & -- conditional AND.
# && -- condition AND with short circuit.
# | -- conditional OR.
# || -- conditional OR with short circuit.
# ! -- negation.
Additional round brackets can also be used to perform grouping.
function test_english() { $choice = new ChoiceFormat(); $string = '[0] none |{n: n % 10 == 1} 1st |{n: n % 10 == 2} 2nd |{n: n % 10 == 3} 3rd |{n:n} th'; $wants = array('none' => array(0), '1st' => array(1, 11, 21), '2nd' => array(2, 12, 22), '3rd' => array(3, 13, 23), 'th' => array(4, 5, 6, 7, 14, 15)); foreach ($wants as $want => $numbers) { foreach ($numbers as $n) { $this->assertEquals($want, $choice->format($string, $n)); } } }
/** * Display the choosen translated string. * Overrides the parent method, also calls parent's renderBody to * translate. */ protected function translateText($text, $subs) { $text = parent::translateText($text, $subs); $choice = new ChoiceFormat(); $value = $this->getValue(); $string = $choice->format($text, $value); if ($string) { return strtr($string, array('{Value}' => $value)); } }