diff --git a/phpBB/includes/session.php b/phpBB/includes/session.php index 0733e4f7fb..3e3c9dc072 100644 --- a/phpBB/includes/session.php +++ b/phpBB/includes/session.php @@ -1869,7 +1869,7 @@ class user extends session // We now get the first number passed and will select the key based upon this number for ($i = 1, $num_args = sizeof($args); $i < $num_args; $i++) { - if (is_int($args[$i])) + if (is_int($args[$i]) || is_float($args[$i])) { $use_plural_form = $this->get_plural_form($args[$i]); $numbers = array_keys($lang); @@ -1905,12 +1905,14 @@ class user extends session * Determine which plural form we should use. * For some languages this is not as simple as for English. * - * @param $number int The number we want to get the plural case for + * @param $number int|float The number we want to get the plural case for * @param $force_rule mixed False to use the plural rule of the language package * or an integer to force a certain plural rule */ function get_plural_form($number, $force_rule = false) { + $number = (int) $number; + if ($number == 0) { // We use special language strings for 0, so it's "no users" instead of "0 users" diff --git a/tests/user/lang_test.php b/tests/user/lang_test.php index 90b0cdfb0f..971a9475f0 100644 --- a/tests/user/lang_test.php +++ b/tests/user/lang_test.php @@ -26,6 +26,14 @@ class phpbb_user_lang_test extends phpbb_test_case 1 => '1 post', // 1 2 => '%d posts', // 2+ ), + 'ARRY_NO_ZERO' => array( + 1 => '1 post', // 1 + 2 => '%d posts', // 0, 2+ + ), + 'ARRY_FLOAT' => array( + 1 => '1 post', // 1.x + 2 => '%1$.1f posts', // 0.x, 2+.x + ), ); // No param @@ -51,6 +59,16 @@ class phpbb_user_lang_test extends phpbb_test_case $this->assertEquals($user->lang('ARRY', 2), '2 posts'); $this->assertEquals($user->lang('ARRY', 123), '123 posts'); + // Array with missing keys + $this->assertEquals($user->lang('ARRY_NO_ZERO', 0), '0 posts'); + $this->assertEquals($user->lang('ARRY_NO_ZERO', 1), '1 post'); + $this->assertEquals($user->lang('ARRY_NO_ZERO', 2), '2 posts'); + + // Floats as array key + $this->assertEquals($user->lang('ARRY_FLOAT', 1.3), '1 post'); + $this->assertEquals($user->lang('ARRY_FLOAT', 2.0), '2.0 posts'); + $this->assertEquals($user->lang('ARRY_FLOAT', 2.51), '2.5 posts'); + // ticket PHPBB3-9949 $this->assertEquals($user->lang('ARRY', 1, 2), '1 post'); $this->assertEquals($user->lang('ARRY', 1, 's', 2), '1 post');