8000 [Translator] fix handling plural for floating numbers · adamwojs/symfony@533cd7e · GitHub
[go: up one dir, main page]

Skip to content

Commit 533cd7e

Browse files
kylekatarnlsnicolas-grekas
authored andcommitted
[Translator] fix handling plural for floating numbers
1 parent 3257d4c commit 533cd7e

File tree

4 files changed

+21
-5
lines changed

4 files changed

+21
-5
lines changed

src/Symfony/Component/Translation/IdentityTranslator.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public function transChoice($id, $number, array $parameters = [], $domain = null
7070
return $this->trans($id, ['%count%' => $number] + $parameters, $domain, $locale);
7171
}
7272

73-
private function getPluralizationRule(int $number, string $locale): int
73+
private function getPluralizationRule(float $number, string $locale): int
7474
{
7575
return PluralizationRules::get($number, $locale, false);
7676
}

src/Symfony/Component/Translation/PluralizationRules.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,15 @@ class PluralizationRules
2525
/**
2626
* Returns the plural position to use for the given locale and number.
2727
*
28-
* @param int $number The number
28+
* @param float $number The number
2929
* @param string $locale The locale
3030
*
3131
* @return int The plural position
3232
*/
3333
public static function get($number, $locale/*, bool $triggerDeprecation = true*/)
3434
{
35+
$number = abs($number);
36+
3537
if (3 > \func_num_args() || func_get_arg(2)) {
3638
@trigger_error(sprintf('The "%s" class is deprecated since Symfony 4.2.', __CLASS__), \E_USER_DEPRECATED);
3739
}
@@ -144,7 +146,7 @@ public static function get($number, $locale/*, bool $triggerDeprecation = true*/
144146
case 'xbr':
145147
case 'ti':
146148
case 'wa':
147-
return ((0 == $number) || (1 == $number)) ? 0 : 1;
149+
return ($number < 2) ? 0 : 1;
148150

149151
case 'be':
150152
case 'bs':

src/Symfony/Component/Translation/Tests/TranslatorTest.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -612,6 +612,18 @@ public function getTransChoiceTests()
612612

613613
// Override %count% with a custom value
614614
['Il y a quelques pommes', 'one: There is one apple|more: There are %count% apples', 'one: Il y a %count% pomme|more: Il y a quelques pommes', 2, ['%count%' => 'quelques'], 'fr', ''],
615+
616+
// Floating values
617+
['1.5 liters', 'key', '%count% liter|%count% liters', 1.5, ['%count%' => 1.5], 'en', ''],
618+
['1.5 litre', 'key', '%count% litre|%count% litres', 1.5, ['%count%' => 1.5], 'fr', ''],
619+
620+
// Negative values
621+
['-1 degree', 'key', '%count% degree|%count% degrees', -1, ['%count%' => -1], 'en', ''],
622+
['-1 degré', 'key', '%count% degré|%count% degrés', -1, ['%count%' => -1], 'fr', ''],
623+
['-1.5 degrees', 'key', '%count% degree|%count% degrees', -1.5, ['%count%' => -1.5], 'en', ''],
624+
['-1.5 degré', 'key', '%count% degré|%count% degrés', -1.5, ['%count%' => -1.5], 'fr', ''],
625+
['-2 degrees', 'key', '%count% degree|%count% degrees', -2, ['%count%' => -2], 'en', ''],
626+
['-2 degrés', 'key', '%count% degré|%count% degrés', -2, ['%count%' => -2], 'fr', ''],
615627
];
616628
}
617629

src/Symfony/Contracts/Translation/TranslatorTrait.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,10 @@ public function trans($id, array $parameters = [], $domain = null, $locale = nul
136136
* which is subject to the new BSD license (http://framework.zend.com/license/new-bsd).
137137
* Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
138138
*/
139-
private function getPluralizationRule(int $number, string $locale): int
139+
private function getPluralizationRule(float $number, string $locale): int
140140
{
141+
$number = abs($number);
142+
141143
switch ('pt_BR' !== $locale && \strlen($locale) > 3 ? substr($locale, 0, strrpos($locale, '_')) : $locale) {
142144
case 'af':
143145
case 'bn':
@@ -205,7 +207,7 @@ private function getPluralizationRule(int $number, string $locale): int
205207
case 'pt_BR':
206208
case 'ti':
207209
case 'wa':
208-
return ((0 == $number) || (1 == $number)) ? 0 : 1;
210+
return ($number < 2) ? 0 : 1;
209211

210212
case 'be':
211213
case 'bs':

0 commit comments

Comments
 (0)
0