From 757fcd3e63535f9fda68cf359f849a44059c7b27 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Sat, 10 Sep 2011 03:38:01 +0200 Subject: [PATCH 01/21] [ticket/10345] Add a system to allow multiple plural forms See http://wiki.phpbb.com/Plural_Rules for explanation and examples. PHPBB3-10345 --- phpBB/includes/session.php | 170 ++++++++++++++++++++++++++++++++++- phpBB/language/en/common.php | 5 ++ tests/user/lang_test.php | 18 ++++ 3 files changed, 192 insertions(+), 1 deletion(-) diff --git a/phpBB/includes/session.php b/phpBB/includes/session.php index 497aaf1141..cd1975b9d3 100644 --- a/phpBB/includes/session.php +++ b/phpBB/includes/session.php @@ -1868,12 +1868,15 @@ class user extends session { if (is_int($args[$i])) { + $use_plural_form = $this->get_plural_form($args[$i]); $numbers = array_keys($lang); foreach ($numbers as $num) { - if ($num > $args[$i]) + if ($num > $use_plural_form) { + // This is basically just some lazy backwards compatible stuff. + // If the key we need to use does not exist, it takes the previous one. break; } @@ -1895,6 +1898,171 @@ class user extends session return call_user_func_array('sprintf', $args); } + /** + * Determine which plural form we should use. + * For some languages this is not as simple as for English. + */ + function get_plural_form($number, $force_rule = false) + { + if ($number == 0) + { + // We use special language strings for 0, so it's "no users" instead of "0 users" + return 0; + } + + // Default to english system + $plural_rule = ($force_rule !== false) ? $force_rule : ((isset($this->lang['PLURAL_RULE'])) ? $this->lang['PLURAL_RULE'] : 1); + $plural_rule = max(0, min($plural_rule, 15)); + + switch ($plural_rule) + { + case 0: + /** + * Families: Asian (Chinese, Japanese, Korean, Vietnamese), Persian, Turkic/Altaic (Turkish), Thai, Lao + * 1 - everything: 1, 2, ... + */ + return 1; + + case 1: + /** + * Families: Germanic (Danish, Dutch, English, Faroese, Frisian, German, Norwegian, Swedish), Finno-Ugric (Estonian, Finnish, Hungarian), Language isolate (Basque), Latin/Greek (Greek), Semitic (Hebrew), Romanic (Italian, Portuguese, Spanish, Catalan) + * 1 - 1 + * 2 - everything else: 2, 3, ... + */ + return ($number == 1) ? 1 : 2; + + case 2: + /** + * Families: Romanic (French, Brazilian Portuguese) + * 1 - 1 normaly this would also apply to 0 + * 2 - everything else: 2, 3, ... + */ + return ($number == 1) ? 1 : 2; + + case 3: + /** + * Families: Baltic (Latvian) + * 1 - ends in 1, not 11: 1, 21, ... 101, 121, ... + * 2 - everything else: 2, 3, ... 10, 11, 12, ... 20, 22, ... + */ + return (($number % 10 == 1) && ($number % 100 != 11)) ? 1 : 2; + + case 4: + /** + * Families: Celtic (Scottish Gaelic) + * 1 - is 1 or 11: 1, 11 + * 2 - is 2 or 12: 2, 12 + * 3 - others between 3 and 19: 3, 4, ... 10, 13, ... 18, 19 + * 4 - everything else: 20, 21, ... + */ + return ($number == 1 || $number == 11) ? 1 : (($number == 2 || $number == 12) ? 2 : (($number >= 3 && $number <= 19) ? 3 : 4)); + + case 5: + /** + * Families: Romanic (Romanian) + * 1 - 1 + * 2 - ends in 01-19: 2, 3, ... 19, 101, 102, ... 119, 201, ... + * 3 - everything else: 20, 21, ... + */ + return ($number == 1) ? 1 : ((($number == 0) || (($number % 100 > 0) && ($number % 100 < 20))) ? 2 : 3); + + case 6: + /** + * Families: Baltic (Lithuanian) + * 1 - ends in 1, not 11: 1, 21, 31, ... 101, 121, ... + * 2 - ends in 0 or ends in 10-20: 10, 11, 12, ... 19, 20, 30, 40, ... + * 3 - everything else: 2, 3, ... 8, 9, 22, 23, ... 29, 32, 33, ... + */ + return (($number % 10 == 1) && ($number % 100 != 11)) ? 1 : ((($number % 10 < 2) || (($number % 100 >= 10) && ($number % 100 < 20))) ? 2 : 3); + + case 7: + /** + * Families: Slavic (Croatian, Serbian, Russian, Ukrainian) + * 1 - ends in 1, not 11: 1, 21, 31, ... 101, 121, ... + * 2 - ends in 2-4, not 12-14: 2, 3, 4, 22, 23, 24, 32, ... + * 3 - everything else: 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 25, 26, ... + */ + return (($number % 10 == 1) && ($number % 100 != 11)) ? 1 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 2 : 3); + + case 8: + /** + * Families: Slavic (Slovak, Czech) + * 1 - 1 + * 2 - 2, 3, 4 + * 3 - everything else: 5, 6, 7, ... + */ + return ($number == 1) ? 1 : ((($number >= 2) && ($number <= 4)) ? 2 : 3); + + case 9: + /** + * Families: Slavic (Polish) + * 1 - 1 + * 2 - ends in 2-4, not 12-14: 2, 3, 4, 22, 23, 24, 32, ... 104, 122, ... + * 3 - everything else: 5, 6, ... 11, 12, 13, 14, 15, ... 20, 21, 25, ... + */ + return ($number == 1) ? 1 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 12) || ($number % 100 > 14))) ? 2 : 3); + + case 10: + /** + * Families: Slavic (Slovenian, Sorbian) + * 1 - ends in 01: 1, 101, 201, ... + * 2 - ends in 02: 2, 102, 202, ... + * 3 - ends in 03-04: 3, 4, 103, 104, 203, 204, ... + * 4 - everything else: 5, 6, 7, 8, 9, 10, 11, ... + */ + return ($number % 100 == 1) ? 1 : (($number % 100 == 2) ? 2 : ((($number % 100 == 3) || ($number % 100 == 4)) ? 3 : 4)); + + case 11: + /** + * Families: Celtic (Irish Gaeilge) + * 1 - 1 + * 2 - 2 + * 3 - is 3-6: 3, 4, 5, 6 + * 4 - is 7-10: 7, 8, 9, 10 + * 5 - everything else: 0, 11, 12, ... + */ + return ($number == 1) ? 1 : (($number == 2) ? 2 : (($number >= 3 && $number <= 6) ? 3 : (($number >= 7 && $number <= 10) ? 4 : 5))); + + case 12: + /** + * Families: Semitic (Arabic) + * 1 - 1 + * 2 - 2 + * 3 - ends in 03-10: 3, 4, ... 10, 103, 104, ... 110, 203, 204, ... + * 4 - ends in 11-99: 11, ... 99, 111, 112, ... + * 5 - everything else: 100, 101, 102, 200, 201, 202, ... + */ + return ($number == 1) ? 1 : (($number == 2) ? 2 : ((($number % 100 >= 3) && ($number % 100 <= 10)) ? 3 : ((($number % 100 >= 11) && ($number % 100 <= 99)) ? 4 : 5))); + + case 13: + /** + * Families: Semitic (Maltese) + * 1 - 1 + * 2 - ends in 01-10: 2, 3, ... 9, 10, 101, 102, ... + * 3 - ends in 11-19: 11, 12, ... 18, 19, 111, 112, ... + * 4 - everything else: 20, 21, ... + */ + return ($number == 1) ? 1 : ((($number == 0) || (($number % 100 > 1) && ($number % 100 < 11))) ? 2 : ((($number % 100 > 10) && ($number % 100 < 20)) ? 3 : 4)); + + case 14: + /** + * Families: Slavic (Macedonian) + * 1 - ends in 1: 1, 11, 21, ... + * 2 - ends in 2: 2, 12, 22, ... + * 3 - everything else: 3, 4, ... 10, 13, 14, ... 20, 23, ... + */ + return ($number % 10 == 1) ? 1 : (($number % 10 == 2) ? 2 : 3); + + case 15: + /** + * Families: Icelandic + * 1 - ends in 1, not 11: 1, 21, 31, ... 101, 121, 131, ... + * 2 - everything else: 2, 3, ... 10, 11, 12, ... 20, 22, ... + */ + return (($number % 10 == 1) && ($number % 100 != 11)) ? 1 : 2; + } + } + /** * Add Language Items - use_db and use_help are assigned where needed (only use them to force inclusion) * diff --git a/phpBB/language/en/common.php b/phpBB/language/en/common.php index 44a63a6acb..57c9d916a2 100644 --- a/phpBB/language/en/common.php +++ b/phpBB/language/en/common.php @@ -45,6 +45,11 @@ $lang = array_merge($lang, array( 'DATE_FORMAT' => '|d M Y|', // 01 Jan 2007 (with Relative days enabled) 'USER_LANG' => 'en-gb', + // You can define different rules for the determination of plural forms here. + // See http://wiki.phpbb.com/Plural_Rules for more information + // or ask the translation manager for help. + 'PLURAL_RULE' => 1, + '1_DAY' => '1 day', '1_MONTH' => '1 month', '1_YEAR' => '1 year', diff --git a/tests/user/lang_test.php b/tests/user/lang_test.php index 6c60583a7b..11e981bb7b 100644 --- a/tests/user/lang_test.php +++ b/tests/user/lang_test.php @@ -54,5 +54,23 @@ class phpbb_user_lang_test extends phpbb_test_case // Bug PHPBB3-9949 $this->assertEquals($user->lang('ARRY', 1, 2), '1 post'); $this->assertEquals($user->lang('ARRY', 1, 's', 2), '1 post'); + + // Bug PHPBB3-10345 + $user = new user; + $user->lang = array( + 'PLURAL_RULE' => 13, + 'ARRY' => array( + 0 => '%d is 0', // 0 + 1 => '%d is 1', // 1 + 2 => '%d ends with 01-10', // ending with 01-10 + 3 => '%d ends with 11-19', // ending with 11-19 + 4 => '%d is part of the last rule', // everything else + ), + ); + $this->assertEquals($user->lang('ARRY', 0), '0 is 0'); + $this->assertEquals($user->lang('ARRY', 1), '1 is 1'); + $this->assertEquals($user->lang('ARRY', 103), '103 ends with 01-10'); + $this->assertEquals($user->lang('ARRY', 15), '15 ends with 11-19'); + $this->assertEquals($user->lang('ARRY', 300), '300 is part of the last rule'); } } From f16d72fcfb9a7621bf64b82cc2c710c6e484d965 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Tue, 13 Sep 2011 01:46:00 +0200 Subject: [PATCH 02/21] [ticket/10345] Fix documentation on the new function and the switch Also do not min/max the value, but throw an error on an invalid Plural rule. PHPBB3-10345 --- phpBB/includes/session.php | 15 +++++++++++++-- phpBB/language/en/common.php | 1 + tests/user/lang_test.php | 4 ++-- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/phpBB/includes/session.php b/phpBB/includes/session.php index cd1975b9d3..4e5257506c 100644 --- a/phpBB/includes/session.php +++ b/phpBB/includes/session.php @@ -1901,6 +1901,10 @@ 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 $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) { @@ -1910,10 +1914,17 @@ class user extends session return 0; } - // Default to english system + // Default to English system $plural_rule = ($force_rule !== false) ? $force_rule : ((isset($this->lang['PLURAL_RULE'])) ? $this->lang['PLURAL_RULE'] : 1); - $plural_rule = max(0, min($plural_rule, 15)); + if ($plural_rule > 15 || $plural_rule < 0) + { + trigger_error('INVALID_PLURAL_RULE'); + } + /** + * The following plural rules are based on a list published by the Mozilla Developer Network + * https://developer.mozilla.org/en/Localization_and_Plurals + */ switch ($plural_rule) { case 0: diff --git a/phpBB/language/en/common.php b/phpBB/language/en/common.php index 57c9d916a2..cf01c6f32e 100644 --- a/phpBB/language/en/common.php +++ b/phpBB/language/en/common.php @@ -285,6 +285,7 @@ $lang = array_merge($lang, array( 'INTERESTS' => 'Interests', 'INVALID_DIGEST_CHALLENGE' => 'Invalid digest challenge.', 'INVALID_EMAIL_LOG' => '%s possibly an invalid e-mail address?', + 'INVALID_PLURAL_RULE' => 'The chosen plural rule is invalid. Valid values are integers between 0 and 15.', 'IP' => 'IP', 'IP_BLACKLISTED' => 'Your IP %1$s has been blocked because it is blacklisted. For details please see %2$s.', diff --git a/tests/user/lang_test.php b/tests/user/lang_test.php index 11e981bb7b..90b0cdfb0f 100644 --- a/tests/user/lang_test.php +++ b/tests/user/lang_test.php @@ -51,11 +51,11 @@ 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'); - // Bug PHPBB3-9949 + // ticket PHPBB3-9949 $this->assertEquals($user->lang('ARRY', 1, 2), '1 post'); $this->assertEquals($user->lang('ARRY', 1, 's', 2), '1 post'); - // Bug PHPBB3-10345 + // ticket PHPBB3-10345 $user = new user; $user->lang = array( 'PLURAL_RULE' => 13, From 0734dd3c42f573d819c058cd6c6b55d035d1836d Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Tue, 13 Sep 2011 15:34:40 +0200 Subject: [PATCH 03/21] [ticket/10345] Remove '1 hour ago' string which conflicted with plural rules This message was only viewed for 1 second anyway, as floor($delta / 60) is only 60 for 3600 to 3660, but the code was limited to $delta <= 3600 PHPBB3-10345 --- phpBB/includes/session.php | 4 ++-- phpBB/language/en/common.php | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/phpBB/includes/session.php b/phpBB/includes/session.php index 4e5257506c..4261a64169 100644 --- a/phpBB/includes/session.php +++ b/phpBB/includes/session.php @@ -2278,9 +2278,9 @@ class user extends session // Zone offset $zone_offset = $this->timezone + $this->dst; - // Show date <= 1 hour ago as 'xx min ago' but not greater than 60 seconds in the future + // Show date < 1 hour ago as 'xx min ago' but not greater than 60 seconds in the future // A small tolerence is given for times in the future but in the same minute are displayed as '< than a minute ago' - if ($delta <= 3600 && $delta > -60 && ($delta >= -5 || (($now / 60) % 60) == (($gmepoch / 60) % 60)) && $date_cache[$format]['is_short'] !== false && !$forcedate && isset($this->lang['datetime']['AGO'])) + if ($delta < 3600 && $delta > -60 && ($delta >= -5 || (($now / 60) % 60) == (($gmepoch / 60) % 60)) && $date_cache[$format]['is_short'] !== false && !$forcedate && isset($this->lang['datetime']['AGO'])) { return $this->lang(array('datetime', 'AGO'), max(0, (int) floor($delta / 60))); } diff --git a/phpBB/language/en/common.php b/phpBB/language/en/common.php index cf01c6f32e..b57c2d9747 100644 --- a/phpBB/language/en/common.php +++ b/phpBB/language/en/common.php @@ -746,7 +746,6 @@ $lang = array_merge($lang, array( 0 => 'less than a minute ago', 1 => '%d minute ago', 2 => '%d minutes ago', - 60 => '1 hour ago', ), 'Sunday' => 'Sunday', From 88ae40a4b19360645d5e5a614cc378e7cce4afe3 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 14 Sep 2011 00:28:52 +0200 Subject: [PATCH 04/21] [ticket/10345] Make use of the plural function in some basic places PHPBB3-10345 --- phpBB/feed.php | 2 +- phpBB/includes/acp/acp_icons.php | 4 +- phpBB/includes/functions.php | 64 ++------- phpBB/includes/functions_content.php | 16 +-- phpBB/includes/functions_display.php | 4 +- phpBB/includes/functions_privmsgs.php | 2 +- phpBB/includes/mcp/mcp_forum.php | 2 +- phpBB/includes/mcp/mcp_front.php | 53 ++------ phpBB/includes/mcp/mcp_logs.php | 2 +- phpBB/includes/mcp/mcp_notes.php | 2 +- phpBB/includes/mcp/mcp_pm_reports.php | 2 +- phpBB/includes/mcp/mcp_queue.php | 2 +- phpBB/includes/mcp/mcp_reports.php | 2 +- phpBB/includes/mcp/mcp_topic.php | 2 +- phpBB/includes/mcp/mcp_warn.php | 2 +- phpBB/includes/message_parser.php | 2 +- phpBB/includes/session.php | 3 + phpBB/includes/ucp/ucp_main.php | 4 +- phpBB/includes/ucp/ucp_pm.php | 4 +- phpBB/includes/ucp/ucp_pm_options.php | 4 +- phpBB/includes/ucp/ucp_pm_viewfolder.php | 2 +- phpBB/index.php | 15 +-- phpBB/language/en/acp/posting.php | 6 +- phpBB/language/en/common.php | 159 +++++++++++++++-------- phpBB/language/en/mcp.php | 31 +++-- phpBB/language/en/memberlist.php | 8 +- phpBB/language/en/posting.php | 18 ++- phpBB/language/en/search.php | 19 ++- phpBB/language/en/ucp.php | 33 +++-- phpBB/language/en/viewforum.php | 7 +- phpBB/language/en/viewtopic.php | 21 ++- phpBB/memberlist.php | 2 +- phpBB/posting.php | 6 +- phpBB/search.php | 6 +- phpBB/viewforum.php | 4 +- phpBB/viewonline.php | 30 +---- phpBB/viewtopic.php | 10 +- 37 files changed, 283 insertions(+), 272 deletions(-) diff --git a/phpBB/feed.php b/phpBB/feed.php index b8c0c370f9..8d33a358a5 100644 --- a/phpBB/feed.php +++ b/phpBB/feed.php @@ -1106,7 +1106,7 @@ class phpbb_feed_forums extends phpbb_feed_base { global $user; - $item_row['statistics'] = sprintf($user->lang['TOTAL_TOPICS_OTHER'], $row['forum_topics']) + $item_row['statistics'] = $user->lang('TOTAL_TOPICS', (int) $row['forum_topics']) . ' ' . $this->separator_stats . ' ' . sprintf($user->lang['TOTAL_POSTS_OTHER'], $row['forum_posts']); } } diff --git a/phpBB/includes/acp/acp_icons.php b/phpBB/includes/acp/acp_icons.php index c848039c66..98aef45892 100644 --- a/phpBB/includes/acp/acp_icons.php +++ b/phpBB/includes/acp/acp_icons.php @@ -379,7 +379,7 @@ class acp_icons if ($smiley_count + $addable_smileys_count > SMILEY_LIMIT) { - trigger_error(sprintf($user->lang['TOO_MANY_SMILIES'], SMILEY_LIMIT) . adm_back_link($this->u_action), E_USER_WARNING); + trigger_error($user->lang('TOO_MANY_SMILIES', SMILEY_LIMIT) . adm_back_link($this->u_action), E_USER_WARNING); } } @@ -599,7 +599,7 @@ class acp_icons $smiley_count = $this->item_count($table); if ($smiley_count + sizeof($pak_ary) > SMILEY_LIMIT) { - trigger_error(sprintf($user->lang['TOO_MANY_SMILIES'], SMILEY_LIMIT) . adm_back_link($this->u_action), E_USER_WARNING); + trigger_error($user->lang('TOO_MANY_SMILIES', SMILEY_LIMIT) . adm_back_link($this->u_action), E_USER_WARNING); } } diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index 92273bf08c..a663286f5f 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -4120,58 +4120,25 @@ function obtain_users_online_string($online_users, $item_id = 0, $item = 'forum' } else if ($config['load_online_guests']) { - $l_online = ($online_users['guests_online'] === 1) ? $user->lang['BROWSING_' . $item_caps . '_GUEST'] : $user->lang['BROWSING_' . $item_caps . '_GUESTS']; - $online_userlist = sprintf($l_online, $online_userlist, $online_users['guests_online']); + $online_userlist = $user->lang('BROWSING_' . $item_caps . '_GUESTS', $online_users['guests_online'], $online_userlist); } else { $online_userlist = sprintf($user->lang['BROWSING_' . $item_caps], $online_userlist); } // Build online listing - $vars_online = array( - 'ONLINE' => array('total_online', 'l_t_user_s', 0), - 'REG' => array('visible_online', 'l_r_user_s', !$config['load_online_guests']), - 'HIDDEN' => array('hidden_online', 'l_h_user_s', $config['load_online_guests']), - 'GUEST' => array('guests_online', 'l_g_user_s', 0) - ); - - foreach ($vars_online as $l_prefix => $var_ary) - { - if ($var_ary[2]) - { - $l_suffix = '_AND'; - } - else - { - $l_suffix = ''; - } - switch ($online_users[$var_ary[0]]) - { - case 0: - ${$var_ary[1]} = $user->lang[$l_prefix . '_USERS_ZERO_TOTAL' . $l_suffix]; - break; - - case 1: - ${$var_ary[1]} = $user->lang[$l_prefix . '_USER_TOTAL' . $l_suffix]; - break; - - default: - ${$var_ary[1]} = $user->lang[$l_prefix . '_USERS_TOTAL' . $l_suffix]; - break; - } - } - unset($vars_online); - - $l_online_users = sprintf($l_t_user_s, $online_users['total_online']); - $l_online_users .= sprintf($l_r_user_s, $online_users['visible_online']); - $l_online_users .= sprintf($l_h_user_s, $online_users['hidden_online']); + $visible_online = $user->lang('REG_USERS_TOTAL', (int) $online_users['visible_online']); + $hidden_online = $user->lang('HIDDEN_USERS_TOTAL', (int) $online_users['hidden_online']); if ($config['load_online_guests']) { - $l_online_users .= sprintf($l_g_user_s, $online_users['guests_online']); + $guests_online = $user->lang('GUEST_USERS_TOTAL', (int) $online_users['guests_online']); + $l_online_users = $user->lang('ONLINE_USERS_TOTAL_GUESTS', (int) $online_users['total_online'], $visible_online, $hidden_online, $guests_online); + } + else + { + $l_online_users = $user->lang('ONLINE_USERS_TOTAL', (int) $online_users['total_online'], $visible_online, $hidden_online); } - - return array( 'online_userlist' => $online_userlist, @@ -4393,10 +4360,9 @@ function page_header($page_title = '', $display_online_list = true, $item_id = 0 set_config('record_online_date', time(), true); } - $l_online_record = sprintf($user->lang['RECORD_ONLINE_USERS'], $config['record_online_users'], $user->format_date($config['record_online_date'], false, true)); + $l_online_record = $user->lang('RECORD_ONLINE_USERS', (int) $config['record_online_users'], $user->format_date($config['record_online_date'], false, true)); - $l_online_time = ($config['load_online_time'] == 1) ? 'VIEW_ONLINE_TIME' : 'VIEW_ONLINE_TIMES'; - $l_online_time = sprintf($user->lang[$l_online_time], $config['load_online_time']); + $l_online_time = $user->lang('VIEW_ONLINE_TIMES', (int) $config['load_online_time']); } $l_privmsgs_text = $l_privmsgs_text_unread = ''; @@ -4407,8 +4373,7 @@ function page_header($page_title = '', $display_online_list = true, $item_id = 0 { if ($user->data['user_new_privmsg']) { - $l_message_new = ($user->data['user_new_privmsg'] == 1) ? $user->lang['NEW_PM'] : $user->lang['NEW_PMS']; - $l_privmsgs_text = sprintf($l_message_new, $user->data['user_new_privmsg']); + $l_privmsgs_text = $user->lang('NEW_PMS', (int) $user->data['user_new_privmsg']); if (!$user->data['user_last_privmsg'] || $user->data['user_last_privmsg'] > $user->data['session_last_visit']) { @@ -4426,7 +4391,7 @@ function page_header($page_title = '', $display_online_list = true, $item_id = 0 } else { - $l_privmsgs_text = $user->lang['NO_NEW_PM']; + $l_privmsgs_text = $user->lang('NEW_PMS', 0); $s_privmsg_new = false; } @@ -4434,8 +4399,7 @@ function page_header($page_title = '', $display_online_list = true, $item_id = 0 if ($user->data['user_unread_privmsg'] && $user->data['user_unread_privmsg'] != $user->data['user_new_privmsg']) { - $l_message_unread = ($user->data['user_unread_privmsg'] == 1) ? $user->lang['UNREAD_PM'] : $user->lang['UNREAD_PMS']; - $l_privmsgs_text_unread = sprintf($l_message_unread, $user->data['user_unread_privmsg']); + $l_privmsgs_text_unread = $user->lang('UNREAD_PMS', (int) $user->data['user_unread_privmsg']); } } diff --git a/phpBB/includes/functions_content.php b/phpBB/includes/functions_content.php index b1294a2f14..894e261c12 100644 --- a/phpBB/includes/functions_content.php +++ b/phpBB/includes/functions_content.php @@ -938,12 +938,12 @@ function parse_attachments($forum_id, &$message, &$attachments, &$update_count, } $download_link = append_sid("{$phpbb_root_path}download/file.$phpEx", 'id=' . $attachment['attach_id']); + $l_downloaded_viewed = 'VIEWED_COUNTS'; switch ($display_cat) { // Images case ATTACHMENT_CATEGORY_IMAGE: - $l_downloaded_viewed = 'VIEWED_COUNT'; $inline_link = append_sid("{$phpbb_root_path}download/file.$phpEx", 'id=' . $attachment['attach_id']); $download_link .= '&mode=view'; @@ -957,7 +957,6 @@ function parse_attachments($forum_id, &$message, &$attachments, &$update_count, // Images, but display Thumbnail case ATTACHMENT_CATEGORY_THUMB: - $l_downloaded_viewed = 'VIEWED_COUNT'; $thumbnail_link = append_sid("{$phpbb_root_path}download/file.$phpEx", 'id=' . $attachment['attach_id'] . '&t=1'); $download_link .= '&mode=view'; @@ -971,7 +970,6 @@ function parse_attachments($forum_id, &$message, &$attachments, &$update_count, // Windows Media Streams case ATTACHMENT_CATEGORY_WM: - $l_downloaded_viewed = 'VIEWED_COUNT'; // Giving the filename directly because within the wm object all variables are in local context making it impossible // to validate against a valid session (all params can differ) @@ -990,7 +988,6 @@ function parse_attachments($forum_id, &$message, &$attachments, &$update_count, // Real Media Streams case ATTACHMENT_CATEGORY_RM: case ATTACHMENT_CATEGORY_QUICKTIME: - $l_downloaded_viewed = 'VIEWED_COUNT'; $block_array += array( 'S_RM_FILE' => ($display_cat == ATTACHMENT_CATEGORY_RM) ? true : false, @@ -1007,8 +1004,6 @@ function parse_attachments($forum_id, &$message, &$attachments, &$update_count, case ATTACHMENT_CATEGORY_FLASH: list($width, $height) = @getimagesize($filename); - $l_downloaded_viewed = 'VIEWED_COUNT'; - $block_array += array( 'S_FLASH_FILE' => true, 'WIDTH' => $width, @@ -1021,7 +1016,7 @@ function parse_attachments($forum_id, &$message, &$attachments, &$update_count, break; default: - $l_downloaded_viewed = 'DOWNLOAD_COUNT'; + $l_downloaded_viewed = 'DOWNLOAD_COUNTS'; $block_array += array( 'S_FILE' => true, @@ -1029,11 +1024,14 @@ function parse_attachments($forum_id, &$message, &$attachments, &$update_count, break; } - $l_download_count = (!isset($attachment['download_count']) || $attachment['download_count'] == 0) ? $user->lang[$l_downloaded_viewed . '_NONE'] : (($attachment['download_count'] == 1) ? sprintf($user->lang[$l_downloaded_viewed], $attachment['download_count']) : sprintf($user->lang[$l_downloaded_viewed . 'S'], $attachment['download_count'])); + if (!isset($attachment['download_count'])) + { + $attachment['download_count'] = 0; + } $block_array += array( 'U_DOWNLOAD_LINK' => $download_link, - 'L_DOWNLOAD_COUNT' => $l_download_count + 'L_DOWNLOAD_COUNT' => $user->lang($l_downloaded_viewed, (int) $attachment['download_count']), ); } diff --git a/phpBB/includes/functions_display.php b/phpBB/includes/functions_display.php index 2b871a21ec..2ec34e1084 100644 --- a/phpBB/includes/functions_display.php +++ b/phpBB/includes/functions_display.php @@ -1043,10 +1043,10 @@ function display_user_activity(&$userdata) $template->assign_vars(array( 'ACTIVE_FORUM' => $active_f_name, - 'ACTIVE_FORUM_POSTS' => ($active_f_count == 1) ? sprintf($user->lang['USER_POST'], 1) : sprintf($user->lang['USER_POSTS'], $active_f_count), + 'ACTIVE_FORUM_POSTS' => $user->lang('USER_POSTS', (int) $active_f_count), 'ACTIVE_FORUM_PCT' => sprintf($l_active_pct, $active_f_pct), 'ACTIVE_TOPIC' => censor_text($active_t_name), - 'ACTIVE_TOPIC_POSTS' => ($active_t_count == 1) ? sprintf($user->lang['USER_POST'], 1) : sprintf($user->lang['USER_POSTS'], $active_t_count), + 'ACTIVE_TOPIC_POSTS' => $user->lang('USER_POSTS', (int) $active_t_count), 'ACTIVE_TOPIC_PCT' => sprintf($l_active_pct, $active_t_pct), 'U_ACTIVE_FORUM' => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $active_f_id), 'U_ACTIVE_TOPIC' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", 't=' . $active_t_id), diff --git a/phpBB/includes/functions_privmsgs.php b/phpBB/includes/functions_privmsgs.php index d90e321285..76f25da977 100644 --- a/phpBB/includes/functions_privmsgs.php +++ b/phpBB/includes/functions_privmsgs.php @@ -1330,7 +1330,7 @@ function get_folder_status($folder_id, $folder) 'percent' => ($user->data['message_limit']) ? (($user->data['message_limit'] > 0) ? round(($folder['num_messages'] / $user->data['message_limit']) * 100) : 100) : 0, ); - $return['message'] = sprintf($user->lang['FOLDER_STATUS_MSG'], $return['percent'], $return['cur'], $return['max']); + $return['message'] = $user->lang('FOLDER_STATUS_MSG', (int) $return['max'], $return['cur'], $return['percent']); return $return; } diff --git a/phpBB/includes/mcp/mcp_forum.php b/phpBB/includes/mcp/mcp_forum.php index 8206a183f3..c823e0a0ee 100644 --- a/phpBB/includes/mcp/mcp_forum.php +++ b/phpBB/includes/mcp/mcp_forum.php @@ -132,7 +132,7 @@ function mcp_forum_view($id, $mode, $action, $forum_info) 'PAGINATION' => generate_pagination($url . "&i=$id&action=$action&mode=$mode&sd=$sort_dir&sk=$sort_key&st=$sort_days" . (($merge_select) ? $selected_ids : ''), $forum_topics, $topics_per_page, $start), 'PAGE_NUMBER' => on_page($forum_topics, $topics_per_page, $start), - 'TOTAL_TOPICS' => ($forum_topics == 1) ? $user->lang['VIEW_FORUM_TOPIC'] : sprintf($user->lang['VIEW_FORUM_TOPICS'], $forum_topics), + 'TOTAL_TOPICS' => $user->lang('VIEW_FORUM_TOPICS', (int) $forum_topics), )); // Grab icons diff --git a/phpBB/includes/mcp/mcp_front.php b/phpBB/includes/mcp/mcp_front.php index ee74a04c91..4ae46f98a2 100644 --- a/phpBB/includes/mcp/mcp_front.php +++ b/phpBB/includes/mcp/mcp_front.php @@ -119,22 +119,9 @@ function mcp_front_view($id, $mode, $action) $template->assign_vars(array( 'S_HIDDEN_FIELDS' => $s_hidden_fields, 'S_MCP_QUEUE_ACTION' => append_sid("{$phpbb_root_path}mcp.$phpEx", "i=queue"), + 'L_UNAPPROVED_TOTAL' => $user->lang('UNAPPROVED_POSTS_TOTAL', (int) $total), + 'S_HAS_UNAPPROVED_POSTS'=> ($total != 0), )); - - if ($total == 0) - { - $template->assign_vars(array( - 'L_UNAPPROVED_TOTAL' => $user->lang['UNAPPROVED_POSTS_ZERO_TOTAL'], - 'S_HAS_UNAPPROVED_POSTS' => false) - ); - } - else - { - $template->assign_vars(array( - 'L_UNAPPROVED_TOTAL' => ($total == 1) ? $user->lang['UNAPPROVED_POST_TOTAL'] : sprintf($user->lang['UNAPPROVED_POSTS_TOTAL'], $total), - 'S_HAS_UNAPPROVED_POSTS' => true) - ); - } } } @@ -220,20 +207,10 @@ function mcp_front_view($id, $mode, $action) } } - if ($total == 0) - { - $template->assign_vars(array( - 'L_REPORTS_TOTAL' => $user->lang['REPORTS_ZERO_TOTAL'], - 'S_HAS_REPORTS' => false) - ); - } - else - { - $template->assign_vars(array( - 'L_REPORTS_TOTAL' => ($total == 1) ? $user->lang['REPORT_TOTAL'] : sprintf($user->lang['REPORTS_TOTAL'], $total), - 'S_HAS_REPORTS' => true) - ); - } + $template->assign_vars(array( + 'L_REPORTS_TOTAL' => $user->lang('REPORTS_TOTAL', (int) $total), + 'S_HAS_REPORTS' => ($total != 0), + )); } } @@ -313,20 +290,10 @@ function mcp_front_view($id, $mode, $action) } } - if ($total == 0) - { - $template->assign_vars(array( - 'L_PM_REPORTS_TOTAL' => $user->lang['PM_REPORTS_ZERO_TOTAL'], - 'S_HAS_PM_REPORTS' => false) - ); - } - else - { - $template->assign_vars(array( - 'L_PM_REPORTS_TOTAL' => ($total == 1) ? $user->lang['PM_REPORT_TOTAL'] : sprintf($user->lang['PM_REPORTS_TOTAL'], $total), - 'S_HAS_PM_REPORTS' => true) - ); - } + $template->assign_vars(array( + 'L_PM_REPORTS_TOTAL' => $user->lang('PM_REPORTS_TOTAL', (int) $total), + 'S_HAS_PM_REPORTS' => ($total != 0), + )); } // Latest 5 logs diff --git a/phpBB/includes/mcp/mcp_logs.php b/phpBB/includes/mcp/mcp_logs.php index dc05ba4110..52f8259acf 100644 --- a/phpBB/includes/mcp/mcp_logs.php +++ b/phpBB/includes/mcp/mcp_logs.php @@ -174,7 +174,7 @@ class mcp_logs $template->assign_vars(array( 'PAGE_NUMBER' => on_page($log_count, $config['topics_per_page'], $start), - 'TOTAL' => ($log_count == 1) ? $user->lang['TOTAL_LOG'] : sprintf($user->lang['TOTAL_LOGS'], $log_count), + 'TOTAL' => $user->lang('TOTAL_LOGS', (int) $log_count), 'PAGINATION' => generate_pagination($this->u_action . "&$u_sort_param$keywords_param", $log_count, $config['topics_per_page'], $start), 'L_TITLE' => $user->lang['MCP_LOGS'], diff --git a/phpBB/includes/mcp/mcp_notes.php b/phpBB/includes/mcp/mcp_notes.php index dfb6ed3b68..1432e96a48 100644 --- a/phpBB/includes/mcp/mcp_notes.php +++ b/phpBB/includes/mcp/mcp_notes.php @@ -228,7 +228,7 @@ class mcp_notes 'PAGE_NUMBER' => on_page($log_count, $config['topics_per_page'], $start), 'PAGINATION' => generate_pagination($this->u_action . "&$u_sort_param$keywords_param", $log_count, $config['topics_per_page'], $start), - 'TOTAL_REPORTS' => ($log_count == 1) ? $user->lang['LIST_REPORT'] : sprintf($user->lang['LIST_REPORTS'], $log_count), + 'TOTAL_REPORTS' => $user->lang('LIST_REPORTS', (int) $log_count), 'RANK_TITLE' => $rank_title, 'JOINED' => $user->format_date($userrow['user_regdate']), diff --git a/phpBB/includes/mcp/mcp_pm_reports.php b/phpBB/includes/mcp/mcp_pm_reports.php index a8136b34df..6bba71f0d9 100644 --- a/phpBB/includes/mcp/mcp_pm_reports.php +++ b/phpBB/includes/mcp/mcp_pm_reports.php @@ -311,7 +311,7 @@ class mcp_pm_reports 'PAGINATION' => generate_pagination($this->u_action . "&st=$sort_days&sk=$sort_key&sd=$sort_dir", $total, $config['topics_per_page'], $start), 'PAGE_NUMBER' => on_page($total, $config['topics_per_page'], $start), 'TOTAL' => $total, - 'TOTAL_REPORTS' => ($total == 1) ? $user->lang['LIST_REPORT'] : sprintf($user->lang['LIST_REPORTS'], $total), + 'TOTAL_REPORTS' => $user->lang('LIST_REPORTS', (int) $total), ) ); diff --git a/phpBB/includes/mcp/mcp_queue.php b/phpBB/includes/mcp/mcp_queue.php index bd132c9ce8..692d29dabb 100644 --- a/phpBB/includes/mcp/mcp_queue.php +++ b/phpBB/includes/mcp/mcp_queue.php @@ -436,7 +436,7 @@ class mcp_queue 'PAGINATION' => generate_pagination($this->u_action . "&f=$forum_id&st=$sort_days&sk=$sort_key&sd=$sort_dir", $total, $config['topics_per_page'], $start), 'PAGE_NUMBER' => on_page($total, $config['topics_per_page'], $start), 'TOPIC_ID' => $topic_id, - 'TOTAL' => ($total == 1) ? (($mode == 'unapproved_posts') ? $user->lang['VIEW_TOPIC_POST'] : $user->lang['VIEW_FORUM_TOPIC']) : sprintf((($mode == 'unapproved_posts') ? $user->lang['VIEW_TOPIC_POSTS'] : $user->lang['VIEW_FORUM_TOPICS']), $total), + 'TOTAL' => $user->lang((($mode == 'unapproved_posts') ? 'VIEW_TOPIC_POSTS' : 'VIEW_FORUM_TOPICS'), (int) $total), )); $this->tpl_name = 'mcp_queue'; diff --git a/phpBB/includes/mcp/mcp_reports.php b/phpBB/includes/mcp/mcp_reports.php index dac73b900f..eb2b655dd3 100644 --- a/phpBB/includes/mcp/mcp_reports.php +++ b/phpBB/includes/mcp/mcp_reports.php @@ -425,7 +425,7 @@ class mcp_reports 'PAGE_NUMBER' => on_page($total, $config['topics_per_page'], $start), 'TOPIC_ID' => $topic_id, 'TOTAL' => $total, - 'TOTAL_REPORTS' => ($total == 1) ? $user->lang['LIST_REPORT'] : sprintf($user->lang['LIST_REPORTS'], $total), + 'TOTAL_REPORTS' => $user->lang('LIST_REPORTS', (int) $total), ) ); diff --git a/phpBB/includes/mcp/mcp_topic.php b/phpBB/includes/mcp/mcp_topic.php index f080d78b1e..463dd5868d 100644 --- a/phpBB/includes/mcp/mcp_topic.php +++ b/phpBB/includes/mcp/mcp_topic.php @@ -336,7 +336,7 @@ function mcp_topic_view($id, $mode, $action) 'PAGE_NUMBER' => on_page($total, $posts_per_page, $start), 'PAGINATION' => (!$posts_per_page) ? '' : generate_pagination(append_sid("{$phpbb_root_path}mcp.$phpEx", "i=$id&t={$topic_info['topic_id']}&mode=$mode&action=$action&to_topic_id=$to_topic_id&posts_per_page=$posts_per_page&st=$sort_days&sk=$sort_key&sd=$sort_dir"), $total, $posts_per_page, $start), - 'TOTAL_POSTS' => ($total == 1) ? $user->lang['VIEW_TOPIC_POST'] : sprintf($user->lang['VIEW_TOPIC_POSTS'], $total), + 'TOTAL_POSTS' => $user->lang('VIEW_TOPIC_POSTS', (int) $total), )); } diff --git a/phpBB/includes/mcp/mcp_warn.php b/phpBB/includes/mcp/mcp_warn.php index 9339389ea4..8cf435c293 100644 --- a/phpBB/includes/mcp/mcp_warn.php +++ b/phpBB/includes/mcp/mcp_warn.php @@ -185,7 +185,7 @@ class mcp_warn 'PAGE_NUMBER' => on_page($user_count, $config['topics_per_page'], $start), 'PAGINATION' => generate_pagination(append_sid("{$phpbb_root_path}mcp.$phpEx", "i=warn&mode=list&st=$st&sk=$sk&sd=$sd"), $user_count, $config['topics_per_page'], $start), - 'TOTAL_USERS' => ($user_count == 1) ? $user->lang['LIST_USER'] : sprintf($user->lang['LIST_USERS'], $user_count), + 'TOTAL_USERS' => $user->lang('LIST_USERS', (int) $user_count), )); } diff --git a/phpBB/includes/message_parser.php b/phpBB/includes/message_parser.php index b3a48112ea..cb9a9d7d28 100644 --- a/phpBB/includes/message_parser.php +++ b/phpBB/includes/message_parser.php @@ -772,7 +772,7 @@ class bbcode_firstpass extends bbcode if ($config['max_quote_depth'] && sizeof($close_tags) >= $config['max_quote_depth']) { // there are too many nested quotes - $error_ary['quote_depth'] = sprintf($user->lang['QUOTE_DEPTH_EXCEEDED'], $config['max_quote_depth']); + $error_ary['quote_depth'] = $user->lang('QUOTE_DEPTH_EXCEEDED', (int) $config['max_quote_depth']); $out .= $buffer . $tok; $tok = '[]'; diff --git a/phpBB/includes/session.php b/phpBB/includes/session.php index 4261a64169..0733e4f7fb 100644 --- a/phpBB/includes/session.php +++ b/phpBB/includes/session.php @@ -1821,6 +1821,9 @@ class user extends session * This function/functionality is inspired by SHS` and Ashe. * * Example call: $user->lang('NUM_POSTS_IN_QUEUE', 1); + * + * If the first parameter is an array, the parts are used as keys and subkeys to get the lang: + * Example: $user->lang(array('datetime', 'AGO'), 1) uses $user->lang['datetime']['AGO'] as lang. */ function lang() { diff --git a/phpBB/includes/ucp/ucp_main.php b/phpBB/includes/ucp/ucp_main.php index 738da62158..3538b641f7 100644 --- a/phpBB/includes/ucp/ucp_main.php +++ b/phpBB/includes/ucp/ucp_main.php @@ -674,8 +674,8 @@ class ucp_main $template->assign_vars(array( 'PAGINATION' => generate_pagination($this->u_action, $topics_count, $config['topics_per_page'], $start), 'PAGE_NUMBER' => on_page($topics_count, $config['topics_per_page'], $start), - 'TOTAL_TOPICS' => ($topics_count == 1) ? $user->lang['VIEW_FORUM_TOPIC'] : sprintf($user->lang['VIEW_FORUM_TOPICS'], $topics_count)) - ); + 'TOTAL_TOPICS' => $user->lang('VIEW_FORUM_TOPICS', (int) $topics_count), + )); } if ($mode == 'subscribed') diff --git a/phpBB/includes/ucp/ucp_pm.php b/phpBB/includes/ucp/ucp_pm.php index 0691f3158c..6dbf092604 100644 --- a/phpBB/includes/ucp/ucp_pm.php +++ b/phpBB/includes/ucp/ucp_pm.php @@ -345,8 +345,8 @@ class ucp_pm 'NUM_NOT_MOVED' => $num_not_moved, 'NUM_REMOVED' => $num_removed, 'RELEASE_MESSAGE_INFO' => sprintf($user->lang['RELEASE_MESSAGES'], '', ''), - 'NOT_MOVED_MESSAGES' => ($num_not_moved == 1) ? $user->lang['NOT_MOVED_MESSAGE'] : sprintf($user->lang['NOT_MOVED_MESSAGES'], $num_not_moved), - 'RULE_REMOVED_MESSAGES' => ($num_removed == 1) ? $user->lang['RULE_REMOVED_MESSAGE'] : sprintf($user->lang['RULE_REMOVED_MESSAGES'], $num_removed), + 'NOT_MOVED_MESSAGES' => $user->lang('NOT_MOVED_MESSAGES', (int) $num_not_moved), + 'RULE_REMOVED_MESSAGES' => $user->lang('RULE_REMOVED_MESSAGES', (int) $num_removed), 'S_FOLDER_OPTIONS' => $s_folder_options, 'S_TO_FOLDER_OPTIONS' => $s_to_folder_options, diff --git a/phpBB/includes/ucp/ucp_pm_options.php b/phpBB/includes/ucp/ucp_pm_options.php index 49c727847a..bd55e2c6c5 100644 --- a/phpBB/includes/ucp/ucp_pm_options.php +++ b/phpBB/includes/ucp/ucp_pm_options.php @@ -409,7 +409,7 @@ function message_options($id, $mode, $global_privmsgs_rules, $global_rule_condit $folder[PRIVMSGS_INBOX] = array( 'folder_name' => $user->lang['PM_INBOX'], - 'message_status' => sprintf($user->lang['FOLDER_MESSAGE_STATUS'], $num_messages, $user->data['message_limit']) + 'message_status' => $user->lang('FOLDER_MESSAGE_STATUS', (int) $user->data['message_limit'], $num_messages), ); $sql = 'SELECT folder_id, folder_name, pm_count @@ -423,7 +423,7 @@ function message_options($id, $mode, $global_privmsgs_rules, $global_rule_condit $num_user_folder++; $folder[$row['folder_id']] = array( 'folder_name' => $row['folder_name'], - 'message_status' => sprintf($user->lang['FOLDER_MESSAGE_STATUS'], $row['pm_count'], $user->data['message_limit']) + 'message_status' => $user->lang('FOLDER_MESSAGE_STATUS', (int) $user->data['message_limit'], $row['pm_count']), ); } $db->sql_freeresult($result); diff --git a/phpBB/includes/ucp/ucp_pm_viewfolder.php b/phpBB/includes/ucp/ucp_pm_viewfolder.php index c74574f361..7b850cb436 100644 --- a/phpBB/includes/ucp/ucp_pm_viewfolder.php +++ b/phpBB/includes/ucp/ucp_pm_viewfolder.php @@ -455,7 +455,7 @@ function get_pm_from($folder_id, $folder, $user_id) $template->assign_vars(array( 'PAGINATION' => generate_pagination(append_sid("{$phpbb_root_path}ucp.$phpEx", "i=pm&mode=view&action=view_folder&f=$folder_id&$u_sort_param"), $pm_count, $config['topics_per_page'], $start), 'PAGE_NUMBER' => on_page($pm_count, $config['topics_per_page'], $start), - 'TOTAL_MESSAGES' => (($pm_count == 1) ? $user->lang['VIEW_PM_MESSAGE'] : sprintf($user->lang['VIEW_PM_MESSAGES'], $pm_count)), + 'TOTAL_MESSAGES' => $user->lang('VIEW_PM_MESSAGES', (int) $pm_count), 'POST_IMG' => (!$auth->acl_get('u_sendpm')) ? $user->img('button_topic_locked', 'POST_PM_LOCKED') : $user->img('button_pm_new', 'POST_NEW_PM'), diff --git a/phpBB/index.php b/phpBB/index.php index 182efbc7e0..bf59d4d840 100644 --- a/phpBB/index.php +++ b/phpBB/index.php @@ -27,15 +27,6 @@ $user->setup('viewforum'); display_forums('', $config['load_moderators']); -// Set some stats, get posts count from forums data if we... hum... retrieve all forums data -$total_posts = $config['num_posts']; -$total_topics = $config['num_topics']; -$total_users = $config['num_users']; - -$l_total_user_s = ($total_users == 0) ? 'TOTAL_USERS_ZERO' : 'TOTAL_USERS_OTHER'; -$l_total_post_s = ($total_posts == 0) ? 'TOTAL_POSTS_ZERO' : 'TOTAL_POSTS_OTHER'; -$l_total_topic_s = ($total_topics == 0) ? 'TOTAL_TOPICS_ZERO' : 'TOTAL_TOPICS_OTHER'; - $order_legend = ($config['legend_sort_groupname']) ? 'group_name' : 'group_legend'; // Grab group details for legend display if ($auth->acl_gets('a_group', 'a_groupadd', 'a_groupdel')) @@ -124,9 +115,9 @@ if ($config['load_birthdays'] && $config['allow_birthdays'] && $auth->acl_gets(' // Assign index specific vars $template->assign_vars(array( - 'TOTAL_POSTS' => sprintf($user->lang[$l_total_post_s], $total_posts), - 'TOTAL_TOPICS' => sprintf($user->lang[$l_total_topic_s], $total_topics), - 'TOTAL_USERS' => sprintf($user->lang[$l_total_user_s], $total_users), + 'TOTAL_POSTS' => $user->lang('TOTAL_POSTS', (int) $config['num_posts']), + 'TOTAL_TOPICS' => $user->lang('TOTAL_TOPICS', (int) $config['num_topics']), + 'TOTAL_USERS' => $user->lang('TOTAL_USERS', (int) $config['num_users']), 'NEWEST_USER' => sprintf($user->lang['NEWEST_USER'], get_username_string('full', $config['newest_user_id'], $config['newest_username'], $config['newest_user_colour'])), 'LEGEND' => $legend, diff --git a/phpBB/language/en/acp/posting.php b/phpBB/language/en/acp/posting.php index 16e1aaca66..7aa01469b7 100644 --- a/phpBB/language/en/acp/posting.php +++ b/phpBB/language/en/acp/posting.php @@ -185,7 +185,11 @@ $lang = array_merge($lang, array( 'SMILIES_URL' => 'Smiley image file', 'SMILIES_WIDTH' => 'Smiley width', - 'TOO_MANY_SMILIES' => 'Limit of %d smilies reached.', + 'TOO_MANY_SMILIES' => array( + 0 => 'Limit of %d smilies reached.', + 1 => 'Limit of %d smiley reached.', + 2 => 'Limit of %d smilies reached.', + ), 'WRONG_PAK_TYPE' => 'The specified package does not contain the appropriate data.', )); diff --git a/phpBB/language/en/common.php b/phpBB/language/en/common.php index b57c2d9747..6fcef11852 100644 --- a/phpBB/language/en/common.php +++ b/phpBB/language/en/common.php @@ -113,8 +113,11 @@ $lang = array_merge($lang, array( 'BOARD_DISABLED' => 'This board is currently disabled.', 'BOARD_UNAVAILABLE' => 'Sorry but the board is temporarily unavailable, please try again in a few minutes.', 'BROWSING_FORUM' => 'Users browsing this forum: %1$s', - 'BROWSING_FORUM_GUEST' => 'Users browsing this forum: %1$s and %2$d guest', - 'BROWSING_FORUM_GUESTS' => 'Users browsing this forum: %1$s and %2$d guests', + 'BROWSING_FORUM_GUESTS' => array( + 0 => 'Users browsing this forum: %2$s and 0 guests', + 1 => 'Users browsing this forum: %2$s and %1$d guest', + 2 => 'Users browsing this forum: %2$s and %1$d guests', + ), 'BYTES' => 'Bytes', 'CANCEL' => 'Cancel', @@ -155,12 +158,11 @@ $lang = array_merge($lang, array( 'DISPLAY_TOPICS' => 'Display topics from previous', 'DOWNLOADED' => 'Downloaded', 'DOWNLOADING_FILE' => 'Downloading file', - 'DOWNLOAD_COUNT' => 'Downloaded %d time', - 'DOWNLOAD_COUNTS' => 'Downloaded %d times', - 'DOWNLOAD_COUNT_NONE' => 'Not downloaded yet', - 'VIEWED_COUNT' => 'Viewed %d time', - 'VIEWED_COUNTS' => 'Viewed %d times', - 'VIEWED_COUNT_NONE' => 'Not viewed yet', + 'DOWNLOAD_COUNTS' => array( + 0 => 'Not downloaded yet', + 1 => 'Downloaded %d time', + 2 => 'Downloaded %d times', + ), 'EDIT_POST' => 'Edit post', 'EMAIL' => 'E-mail', // Short form for EMAIL_ADDRESS @@ -245,12 +247,16 @@ $lang = array_merge($lang, array( 'GROUP_ERR_USERNAME' => 'No group name specified.', 'GROUP_ERR_USER_LONG' => 'Group names cannot exceed 60 characters. The specified group name is too long.', 'GUEST' => 'Guest', - 'GUEST_USERS_ONLINE' => 'There are %d guest users online', - 'GUEST_USERS_TOTAL' => '%d guests', - 'GUEST_USERS_ZERO_ONLINE' => 'There are 0 guest users online', - 'GUEST_USERS_ZERO_TOTAL' => '0 guests', - 'GUEST_USER_ONLINE' => 'There is %d guest user online', - 'GUEST_USER_TOTAL' => '%d guest', + 'GUEST_USERS_ONLINE' => array( + 0 => 'There are 0 guest users online', + 1 => 'There is %d guest user online', + 2 => 'There are %d guest users online', + ), + 'GUEST_USERS_TOTAL' => array( + 0 => '0 guests', + 1 => '%d guest', + 2 => '%d guests', + ), 'G_ADMINISTRATORS' => 'Administrators', 'G_BOTS' => 'Bots', 'G_GUESTS' => 'Guests', @@ -259,15 +265,16 @@ $lang = array_merge($lang, array( 'G_GLOBAL_MODERATORS' => 'Global moderators', 'G_NEWLY_REGISTERED' => 'Newly registered users', - 'HIDDEN_USERS_ONLINE' => '%d hidden users online', - 'HIDDEN_USERS_TOTAL' => '%d hidden', - 'HIDDEN_USERS_TOTAL_AND' => '%d hidden and ', - 'HIDDEN_USERS_ZERO_ONLINE' => '0 hidden users online', - 'HIDDEN_USERS_ZERO_TOTAL' => '0 hidden', - 'HIDDEN_USERS_ZERO_TOTAL_AND' => '0 hidden and ', - 'HIDDEN_USER_ONLINE' => '%d hidden user online', - 'HIDDEN_USER_TOTAL' => '%d hidden', - 'HIDDEN_USER_TOTAL_AND' => '%d hidden and ', + 'HIDDEN_USERS_ONLINE' => array( + 0 => '0 hidden users', + 1 => '%d hidden user', + 2 => '%d hidden users', + ), + 'HIDDEN_USERS_TOTAL' => array( + 0 => '0 hidden', + 1 => '%d hidden', + 2 => '%d hidden', + ), 'HIDE_GUESTS' => 'Hide guests', 'HIDE_ME' => 'Hide my online status this session', 'HOURS' => 'Hours', @@ -354,8 +361,11 @@ $lang = array_merge($lang, array( 'NEWEST_USER' => 'Our newest member %s', 'NEW_MESSAGE' => 'New message', 'NEW_MESSAGES' => 'New messages', - 'NEW_PM' => '%d new message', - 'NEW_PMS' => '%d new messages', + 'NEW_PMS' => array( + 0 => '0 new messages', + 1 => '%d new message', + 2 => '%d new messages', + ), 'NEW_POST' => 'New post', // Not used anymore 'NEW_POSTS' => 'New posts', // Not used anymore 'NEXT' => 'Next', // Used in pagination @@ -389,7 +399,6 @@ $lang = array_merge($lang, array( 'NO_MODE' => 'No mode specified.', 'NO_MODERATORS' => 'There are no moderators.', 'NO_NEW_MESSAGES' => 'No new messages', - 'NO_NEW_PM' => '0 new messages', 'NO_NEW_POSTS' => 'No new posts', // Not used anymore 'NO_ONLINE_USERS' => 'No registered users', 'NO_POSTS' => 'No posts', @@ -403,7 +412,6 @@ $lang = array_merge($lang, array( 'NO_TOPIC_FORUM' => 'The topic or forum no longer exists.', 'NO_TOPICS' => 'There are no topics or posts in this forum.', 'NO_TOPICS_TIME_FRAME' => 'No topics exist inside this forum for the selected time frame.', - 'NO_UNREAD_PM' => '0 unread messages', 'NO_UNREAD_POSTS' => 'No unread posts', 'NO_UPLOAD_FORM_FOUND' => 'Upload initiated but no valid file upload form found.', 'NO_USER' => 'The requested user does not exist.', @@ -421,9 +429,18 @@ $lang = array_merge($lang, array( 'OFFLINE' => 'Offline', 'ONLINE' => 'Online', 'ONLINE_BUDDIES' => 'Online friends', - 'ONLINE_USERS_TOTAL' => 'In total there are %d users online :: ', - 'ONLINE_USERS_ZERO_TOTAL' => 'In total there are 0 users online :: ', - 'ONLINE_USER_TOTAL' => 'In total there is %d user online :: ', + // "... :: x registered and y hidden" + 'ONLINE_USERS_TOTAL' => array( + 0 => 'In total there are 0 users online :: %2$s and %3$s', + 1 => 'In total there is %1$d user online :: %2$s and %3$s', + 2 => 'In total there are %1$d users online :: %2$s and %3$s', + ), + // "... :: x registered, y hidden and z guests" + 'ONLINE_USERS_TOTAL_GUESTS' => array( + 0 => 'In total there are 0 users online :: %2$s, %3$s and %4$s', + 1 => 'In total there is %1$d user online :: %2$s, %3$s and %4$s', + 2 => 'In total there are %1$d users online :: %2$s, %3$s and %4$s', + ), 'OPTIONS' => 'Options', 'PAGE_OF' => 'Page %1$d of %2$d', @@ -477,15 +494,17 @@ $lang = array_merge($lang, array( 'REDIRECTS' => 'Total redirects', 'REGISTER' => 'Register', 'REGISTERED_USERS' => 'Registered users:', - 'REG_USERS_ONLINE' => 'There are %d registered users and ', - 'REG_USERS_TOTAL' => '%d registered, ', - 'REG_USERS_TOTAL_AND' => '%d registered and ', - 'REG_USERS_ZERO_ONLINE' => 'There are 0 registered users and ', - 'REG_USERS_ZERO_TOTAL' => '0 registered, ', - 'REG_USERS_ZERO_TOTAL_AND' => '0 registered and ', - 'REG_USER_ONLINE' => 'There is %d registered user and ', - 'REG_USER_TOTAL' => '%d registered, ', - 'REG_USER_TOTAL_AND' => '%d registered and ', + // "... and 2 hidden users online" + 'REG_USERS_ONLINE' => array( + 0 => 'There are 0 registered users and %2$s online', + 1 => 'There is %1$d registered user and %2$s online', + 2 => 'There are %1$d registered users and %2$s online', + ), + 'REG_USERS_TOTAL' => array( + 0 => '0 registered', + 1 => '%d registered', + 2 => '%d registered', + ), 'REMOVE' => 'Remove', 'REMOVE_INSTALL' => 'Please delete, move or rename the install directory before you use your board. If this directory is still present, only the Administration Control Panel (ACP) will be accessible.', 'REPLIES' => 'Replies', @@ -637,19 +656,33 @@ $lang = array_merge($lang, array( 'TOPIC_TITLE' => 'Topic title', 'TOPIC_UNAPPROVED' => 'This topic has not been approved', 'TOTAL_ATTACHMENTS' => 'Attachment(s)', - 'TOTAL_LOG' => '1 log', - 'TOTAL_LOGS' => '%d logs', - 'TOTAL_NO_PM' => '0 private messages in total', - 'TOTAL_PM' => '1 private message in total', - 'TOTAL_PMS' => '%d private messages in total', + 'TOTAL_LOGS' => array( + 0 => '0 logs', + 1 => '%d log', + 2 => '%d logs', + ), + 'TOTAL_PMS' => array( + 0 => '0 private messages in total', + 1 => '%d private message in total', + 2 => '%d private messages in total', + ), 'TOTAL_POSTS' => 'Total posts', - 'TOTAL_POSTS_OTHER' => 'Total posts %d', - 'TOTAL_POSTS_ZERO' => 'Total posts 0', + 'TOTAL_POSTS_COUNT' => array( + 0 => 'Total posts 0', + 1 => 'Total posts %d', + 2 => 'Total posts %d', + ), 'TOPIC_REPORTED' => 'This topic has been reported', - 'TOTAL_TOPICS_OTHER'=> 'Total topics %d', - 'TOTAL_TOPICS_ZERO' => 'Total topics 0', - 'TOTAL_USERS_OTHER' => 'Total members %d', - 'TOTAL_USERS_ZERO' => 'Total members 0', + 'TOTAL_TOPICS' => array( + 0 => 'Total topics 0', + 1 => 'Total topics %d', + 2 => 'Total topics %d', + ), + 'TOTAL_USERS' => array( + 0 => 'Total members 0', + 1 => 'Total members %d', + 2 => 'Total members %d', + ), 'TRACKED_PHP_ERROR' => 'Tracked PHP errors: %s', 'UNABLE_GET_IMAGE_SIZE' => 'It was not possible to determine the dimensions of the image.', @@ -657,8 +690,11 @@ $lang = array_merge($lang, array( 'UNKNOWN_BROWSER' => 'Unknown browser', 'UNMARK_ALL' => 'Unmark all', 'UNREAD_MESSAGES' => 'Unread messages', - 'UNREAD_PM' => '%d unread message', - 'UNREAD_PMS' => '%d unread messages', + 'UNREAD_PMS' => array( + 0 => '0 unread messages', + 1 => '%d unread message', + 2 => '%d unread messages', + ), 'UNREAD_POST' => 'Unread post', 'UNREAD_POSTS' => 'Unread posts', 'UNWATCH_FORUM_CONFIRM' => 'Are you sure you wish to unsubscribe from this forum?', @@ -676,8 +712,11 @@ $lang = array_merge($lang, array( 'USERNAMES' => 'Usernames', 'USER_AVATAR' => 'User avatar', 'USER_CANNOT_READ' => 'You cannot read posts in this forum.', - 'USER_POST' => '%d Post', - 'USER_POSTS' => '%d Posts', + 'USER_POSTS' => array( + 0 => '0 Posts', + 1 => '%d Post', + 2 => '%d Posts', + ), 'USERS' => 'Users', 'USE_PERMISSIONS' => 'Test out user’s permissions', @@ -685,6 +724,11 @@ $lang = array_merge($lang, array( 'VARIANT_DATE_SEPARATOR' => ' / ', // Used in date format dropdown, eg: "Today, 13:37 / 01 Jan 2007, 13:37" ... to join a relative date with calendar date 'VIEWED' => 'Viewed', + 'VIEWED_COUNTS' => array( + 0 => 'Not viewed yet', + 1 => 'Viewed %d time', + 2 => 'Viewed %d times', + ), 'VIEWING_FAQ' => 'Viewing FAQ', 'VIEWING_MEMBERS' => 'Viewing member details', 'VIEWING_ONLINE' => 'Viewing who is online', @@ -699,8 +743,11 @@ $lang = array_merge($lang, array( 'VIEW_LATEST_POST' => 'View the latest post', 'VIEW_NEWEST_POST' => 'View first unread post', 'VIEW_NOTES' => 'View user notes', - 'VIEW_ONLINE_TIME' => 'based on users active over the past %d minute', - 'VIEW_ONLINE_TIMES' => 'based on users active over the past %d minutes', + 'VIEW_ONLINE_TIMES' => array( + 0 => 'based on users active over the past %d minutes', + 1 => 'based on users active over the past %d minute', + 2 => 'based on users active over the past %d minutes', + ), 'VIEW_TOPIC' => 'View topic', 'VIEW_TOPIC_ANNOUNCEMENT' => 'Announcement: ', 'VIEW_TOPIC_GLOBAL' => 'Global Announcement: ', diff --git a/phpBB/language/en/mcp.php b/phpBB/language/en/mcp.php index 16d6db061e..2d351eb9e0 100644 --- a/phpBB/language/en/mcp.php +++ b/phpBB/language/en/mcp.php @@ -120,8 +120,11 @@ $lang = array_merge($lang, array( 'LATEST_WARNING_TIME' => 'Latest warning issued', 'LATEST_WARNINGS' => 'Latest 5 warnings', 'LEAVE_SHADOW' => 'Leave shadow topic in place', - 'LIST_REPORT' => '1 report', - 'LIST_REPORTS' => '%d reports', + 'LIST_REPORTS' => array( + 0 => '%d reports', + 1 => '%d report', + 2 => '%d reports', + ), 'LOCK' => 'Lock', 'LOCK_POST_POST' => 'Lock post', 'LOCK_POST_POST_CONFIRM' => 'Are you sure you want to prevent editing this post?', @@ -251,11 +254,13 @@ $lang = array_merge($lang, array( 'PM_REPORT_CLOSED_SUCCESS' => 'The selected PM report has been closed successfully.', 'PM_REPORT_DELETED_SUCCESS' => 'The selected PM report has been deleted successfully.', 'PM_REPORTED_SUCCESS' => 'This private message has been successfully reported.', - 'PM_REPORT_TOTAL' => 'In total there is 1 PM report to review.', 'PM_REPORTS_CLOSED_SUCCESS' => 'The selected PM reports have been closed successfully.', 'PM_REPORTS_DELETED_SUCCESS'=> 'The selected PM reports have been deleted successfully.', - 'PM_REPORTS_TOTAL' => 'In total there are %d PM reports to review.', - 'PM_REPORTS_ZERO_TOTAL' => 'There are no PM reports to review.', + 'PM_REPORTS_TOTAL' => array( + 0 => 'There are no PM reports to review.', + 1 => 'In total there is 1 PM report to review.', + 2 => 'In total there are %d PM reports to review.', + ), 'PM_REPORT_DETAILS' => 'Private message report details', 'POSTER' => 'Poster', 'POSTS_APPROVED_SUCCESS' => 'The selected posts have been approved.', @@ -282,8 +287,11 @@ $lang = array_merge($lang, array( 'REPORTED_ON_DATE' => 'on', 'REPORTS_CLOSED_SUCCESS' => 'The selected reports have been closed successfully.', 'REPORTS_DELETED_SUCCESS' => 'The selected reports have been deleted successfully.', - 'REPORTS_TOTAL' => 'In total there are %d reports to review.', - 'REPORTS_ZERO_TOTAL' => 'There are no reports to review.', + 'REPORTS_TOTAL' => array( + 0 => 'There are no reports to review.', + 1 => 'In total there is 1 report to review.', + 2 => 'In total there are %d reports to review.', + ), 'REPORT_CLOSED' => 'This report has already been closed.', 'REPORT_CLOSED_SUCCESS' => 'The selected report has been closed successfully.', 'REPORT_DELETED_SUCCESS' => 'The selected report has been deleted successfully.', @@ -295,7 +303,6 @@ $lang = array_merge($lang, array( 'REPORT_POST_EXPLAIN' => 'Use this form to report the selected post to the forum moderators and board administrators. Reporting should generally be used only if the post breaks forum rules.', 'REPORT_REASON' => 'Report reason', 'REPORT_TIME' => 'Report time', - 'REPORT_TOTAL' => 'In total there is 1 report to review.', 'RESYNC' => 'Resync', 'RETURN_MESSAGE' => '%sReturn to the message%s', 'RETURN_NEW_FORUM' => '%sGo to the new forum%s', @@ -353,9 +360,11 @@ $lang = array_merge($lang, array( 'TOPIC_UNLOCKED_SUCCESS' => 'The selected topic has been unlocked.', 'TOTAL_WARNINGS' => 'Total Warnings', - 'UNAPPROVED_POSTS_TOTAL' => 'In total there are %d posts waiting for approval.', - 'UNAPPROVED_POSTS_ZERO_TOTAL' => 'There are no posts waiting for approval.', - 'UNAPPROVED_POST_TOTAL' => 'In total there is 1 post waiting for approval.', + 'UNAPPROVED_POSTS_TOTAL' => array( + 0 => 'There are no posts waiting for approval.', + 1 => 'In total there is 1 post waiting for approval.', + 2 => 'In total there are %d posts waiting for approval.', + ), 'UNLOCK' => 'Unlock', 'UNLOCK_POST' => 'Unlock post', 'UNLOCK_POST_EXPLAIN' => 'Allow editing', diff --git a/phpBB/language/en/memberlist.php b/phpBB/language/en/memberlist.php index 75c375d9eb..8138b61ae2 100644 --- a/phpBB/language/en/memberlist.php +++ b/phpBB/language/en/memberlist.php @@ -93,8 +93,11 @@ $lang = array_merge($lang, array( 'LAST_ACTIVE' => 'Last active', 'LESS_THAN' => 'Less than', - 'LIST_USER' => '1 user', - 'LIST_USERS' => '%d users', + 'LIST_USERS' => array( + 0 => '0 users', + 1 => '%d user', + 2 => '%d users', + ), 'LOGIN_EXPLAIN_LEADERS' => 'The board requires you to be registered and logged in to view the team listing.', 'LOGIN_EXPLAIN_MEMBERLIST' => 'The board requires you to be registered and logged in to access the memberlist.', 'LOGIN_EXPLAIN_SEARCHUSER' => 'The board requires you to be registered and logged in to search users.', @@ -136,6 +139,7 @@ $lang = array_merge($lang, array( 'USER_LAST_REMINDED' => array( 0 => 'No reminder sent at this time', 1 => '%1$d reminder sent
» %2$s', + 2 => '%1$d reminder sent
» %2$s', ), 'USER_ONLINE' => 'Online', 'USER_PRESENCE' => 'Board presence', diff --git a/phpBB/language/en/posting.php b/phpBB/language/en/posting.php index 887b9c57dc..01b1b3a9e1 100644 --- a/phpBB/language/en/posting.php +++ b/phpBB/language/en/posting.php @@ -149,8 +149,16 @@ $lang = array_merge($lang, array( 'POLL_MAX_OPTIONS' => 'Options per user', 'POLL_MAX_OPTIONS_EXPLAIN' => 'This is the number of options each user may select when voting.', 'POLL_OPTIONS' => 'Poll options', - 'POLL_OPTIONS_EXPLAIN' => 'Place each option on a new line. You may enter up to %d options.', - 'POLL_OPTIONS_EDIT_EXPLAIN' => 'Place each option on a new line. You may enter up to %d options. If you remove or add options all previous votes will be reset.', + 'POLL_OPTIONS_EXPLAIN' => array( + 0 => 'Place each option on a new line. You may enter up to %d options.', + 1 => 'Place each option on a new line. You may enter %d option.', + 2 => 'Place each option on a new line. You may enter up to %d options.', + ), + 'POLL_OPTIONS_EDIT_EXPLAIN' => array( + 0 => 'Place each option on a new line. You may enter up to %d options. If you remove or add options all previous votes will be reset.', + 1 => 'Place each option on a new line. You may enter %d option. If you remove or add options all previous votes will be reset.', + 2 => 'Place each option on a new line. You may enter up to %d options. If you remove or add options all previous votes will be reset.', + ), 'POLL_QUESTION' => 'Poll question', 'POLL_TITLE_TOO_LONG' => 'The poll title must contain fewer than 100 characters.', 'POLL_TITLE_COMP_TOO_LONG' => 'The parsed size of your poll title is too large, consider removing BBCodes or smilies.', @@ -175,7 +183,11 @@ $lang = array_merge($lang, array( 'POST_TOPIC_AS' => 'Post topic as', 'PROGRESS_BAR' => 'Progress bar', - 'QUOTE_DEPTH_EXCEEDED' => 'You may embed only %1$d quotes within each other.', + 'QUOTE_DEPTH_EXCEEDED' => array( + 0 => 'You may embed only %d quotes within each other.', + 1 => 'You may embed only %d quote within each other.', + 2 => 'You may embed only %d quotes within each other.', + ), 'SAVE' => 'Save', 'SAVE_DATE' => 'Saved at', diff --git a/phpBB/language/en/search.php b/phpBB/language/en/search.php index 6d3a94667a..734b65e575 100644 --- a/phpBB/language/en/search.php +++ b/phpBB/language/en/search.php @@ -41,9 +41,16 @@ $lang = array_merge($lang, array( 'DISPLAY_RESULTS' => 'Display results as', - 'FOUND_SEARCH_MATCH' => 'Search found %d match', - 'FOUND_SEARCH_MATCHES' => 'Search found %d matches', - 'FOUND_MORE_SEARCH_MATCHES' => 'Search found more than %d matches', + 'FOUND_SEARCH_MATCHES' => array( + 0 => 'Search found %d matches', + 1 => 'Search found %d match', + 2 => 'Search found %d matches', + ), + 'FOUND_MORE_SEARCH_MATCHES' => array( + 0 => 'Search found more than %d matches', + 1 => 'Search found more than %d match', + 2 => 'Search found more than %d matches', + ), 'GLOBAL' => 'Global announcement', @@ -100,5 +107,9 @@ $lang = array_merge($lang, array( 'SORT_POST_SUBJECT' => 'Post subject', 'SORT_TIME' => 'Post time', - 'TOO_FEW_AUTHOR_CHARS' => 'You must specify at least %d characters of the authors name.', + 'TOO_FEW_AUTHOR_CHARS' => array( + 0 => 'You must specify at least %d characters of the authors name.', + 1 => 'You must specify at least %d character of the authors name.', + 2 => 'You must specify at least %d characters of the authors name.', + ), )); diff --git a/phpBB/language/en/ucp.php b/phpBB/language/en/ucp.php index c8ffbf31c0..fb26c2f8e1 100644 --- a/phpBB/language/en/ucp.php +++ b/phpBB/language/en/ucp.php @@ -202,13 +202,21 @@ $lang = array_merge($lang, array( 'FOES_EXPLAIN' => 'Foes are users which will be ignored by default. Posts by these users will not be fully visible. Personal messages from foes are still permitted. Please note that you cannot ignore moderators or administrators.', 'FOES_UPDATED' => 'Your foes list has been updated successfully.', 'FOLDER_ADDED' => 'Folder successfully added.', - 'FOLDER_MESSAGE_STATUS' => '%1$d from %2$d messages stored', + 'FOLDER_MESSAGE_STATUS' => array( + 0 => '%2$d from %1$d messages stored', + 1 => '%2$d from %1$d message stored', + 2 => '%2$d from %1$d messages stored', + ), 'FOLDER_NAME_EMPTY' => 'You must enter a name for this folder.', 'FOLDER_NAME_EXIST' => 'Folder %s already exists.', 'FOLDER_OPTIONS' => 'Folder options', 'FOLDER_RENAMED' => 'Folder successfully renamed.', 'FOLDER_REMOVED' => 'Folder successfully removed.', - 'FOLDER_STATUS_MSG' => 'Folder is %1$d%% full (%2$d from %3$d messages stored)', + 'FOLDER_STATUS_MSG' => array( + 0 => 'Folder is %3$d%% full (%2$d from %1$d messages stored)', + 1 => 'Folder is %3$d%% full (%2$d from %1$d message stored)', + 2 => 'Folder is %3$d%% full (%2$d from %1$d messages stored)', + ), 'FORWARD_PM' => 'Forward PM', 'FORCE_PASSWORD_EXPLAIN' => 'Before you may continue browsing the board you are required to change your password.', 'FRIEND_MESSAGE' => 'Message from friend', @@ -292,8 +300,11 @@ $lang = array_merge($lang, array( 'NOT_ADDED_FOES_SELF' => 'You cannot add yourself to the foes list.', 'NOT_AGREE' => 'I do not agree to these terms', 'NOT_ENOUGH_SPACE_FOLDER' => 'The destination folder “%s” seems to be full. The requested action has not been taken.', - 'NOT_MOVED_MESSAGE' => 'You have 1 private message currently on hold because of full folder.', - 'NOT_MOVED_MESSAGES' => 'You have %d private messages currently on hold because of full folder.', + 'NOT_MOVED_MESSAGES' => array( + 0 => 'You have %d private messages currently on hold because of full folder.', + 1 => 'You have %d private message currently on hold because of full folder.', + 2 => 'You have %d private messages currently on hold because of full folder.', + ), 'NO_ACTION_MODE' => 'No message action specified.', 'NO_AUTHOR' => 'No author defined for this message', 'NO_AVATAR_CATEGORY' => 'None', @@ -388,8 +399,11 @@ $lang = array_merge($lang, array( 'RULE_ALREADY_DEFINED' => 'This rule was defined previously.', 'RULE_DELETED' => 'Rule successfully removed.', 'RULE_NOT_DEFINED' => 'Rule not correctly specified.', - 'RULE_REMOVED_MESSAGE' => 'One private message had been removed due to private message filters.', - 'RULE_REMOVED_MESSAGES' => '%d private messages were removed due to private message filters.', + 'RULE_REMOVED_MESSAGES' => array( + 0 => '%d private messages were removed due to private message filters.', + 1 => '%d private message was removed due to private message filters.', + 2 => '%d private messages were removed due to private message filters.', + ), 'SAME_PASSWORD_ERROR' => 'The new password you entered is the same as your current password.', 'SEARCH_YOUR_POSTS' => 'Show your posts', @@ -489,8 +503,11 @@ $lang = array_merge($lang, array( 'VIEW_NEXT_PM' => 'Next PM', 'VIEW_PM' => 'View message', 'VIEW_PM_INFO' => 'Message details', - 'VIEW_PM_MESSAGE' => '1 message', - 'VIEW_PM_MESSAGES' => '%d messages', + 'VIEW_PM_MESSAGES' => array( + 0 => '%d messages', + 1 => '%d message', + 2 => '%d messages', + ), 'VIEW_PREVIOUS_HISTORY' => 'Previous PM in history', 'VIEW_PREVIOUS_PM' => 'Previous PM', 'VIEW_SIGS' => 'Display signatures', diff --git a/phpBB/language/en/viewforum.php b/phpBB/language/en/viewforum.php index 6905a7a629..d5eea0f4e3 100644 --- a/phpBB/language/en/viewforum.php +++ b/phpBB/language/en/viewforum.php @@ -64,6 +64,9 @@ $lang = array_merge($lang, array( 'UNREAD_POSTS_LOCKED' => 'Unread posts [ Locked ]', 'VIEW_FORUM' => 'View forum', - 'VIEW_FORUM_TOPIC' => '1 topic', - 'VIEW_FORUM_TOPICS' => '%d topics', + 'VIEW_FORUM_TOPICS' => array( + 0 => '%d topics', + 1 => '%d topic', + 2 => '%d topics', + ), )); diff --git a/phpBB/language/en/viewtopic.php b/phpBB/language/en/viewtopic.php index 9e69d657b7..1e686b69ab 100644 --- a/phpBB/language/en/viewtopic.php +++ b/phpBB/language/en/viewtopic.php @@ -53,8 +53,11 @@ $lang = array_merge($lang, array( 'DELETE_TOPIC' => 'Delete topic', 'DOWNLOAD_NOTICE' => 'You do not have the required permissions to view the files attached to this post.', - 'EDITED_TIMES_TOTAL' => 'Last edited by %1$s on %2$s, edited %3$d times in total.', - 'EDITED_TIME_TOTAL' => 'Last edited by %1$s on %2$s, edited %3$d time in total.', + 'EDITED_TIMES_TOTAL' => array( + 0 => 'Last edited by %2$s on %3$s, edited %1$d times in total.', + 1 => 'Last edited by %2$s on %3$s, edited %1$d time in total.', + 2 => 'Last edited by %2$s on %3$s, edited %1$d times in total.', + ) 'EMAIL_TOPIC' => 'E-mail friend', 'ERROR_NO_ATTACHMENT' => 'The selected attachment does not exist anymore.', @@ -70,8 +73,11 @@ $lang = array_merge($lang, array( 'MAKE_GLOBAL' => 'Change to “Global”', 'MAKE_NORMAL' => 'Change to “Standard Topic”', 'MAKE_STICKY' => 'Change to “Sticky”', - 'MAX_OPTIONS_SELECT' => 'You may select up to %d options', - 'MAX_OPTION_SELECT' => 'You may select 1 option', + 'MAX_OPTIONS_SELECT' => array( + 0 => 'You may select up to %d options', + 1 => 'You may select %d option', + 2 => 'You may select up to %d options', + ), 'MISSING_INLINE_ATTACHMENT' => 'The attachment %s is no longer available', 'MOVE_TOPIC' => 'Move topic', @@ -105,8 +111,11 @@ $lang = array_merge($lang, array( 'VIEW_NEXT_TOPIC' => 'Next topic', 'VIEW_PREVIOUS_TOPIC' => 'Previous topic', 'VIEW_RESULTS' => 'View results', - 'VIEW_TOPIC_POST' => '1 post', - 'VIEW_TOPIC_POSTS' => '%d posts', + 'VIEW_TOPIC_POSTS' => array( + 0 => '%d posts', + 1 => '%d post', + 2 => '%d posts', + ), 'VIEW_UNREAD_POST' => 'First unread post', 'VISIT_WEBSITE' => 'WWW', 'VOTE_SUBMITTED' => 'Your vote has been cast.', diff --git a/phpBB/memberlist.php b/phpBB/memberlist.php index 556db2fa5d..ff22b860ff 100644 --- a/phpBB/memberlist.php +++ b/phpBB/memberlist.php @@ -1586,7 +1586,7 @@ switch ($mode) $template->assign_vars(array( 'PAGINATION' => generate_pagination($pagination_url, $total_users, $config['topics_per_page'], $start), 'PAGE_NUMBER' => on_page($total_users, $config['topics_per_page'], $start), - 'TOTAL_USERS' => ($total_users == 1) ? $user->lang['LIST_USER'] : sprintf($user->lang['LIST_USERS'], $total_users), + 'TOTAL_USERS' => $user->lang('LIST_USERS', (int) $total_users), 'PROFILE_IMG' => $user->img('icon_user_profile', $user->lang['PROFILE']), 'PM_IMG' => $user->img('icon_contact_pm', $user->lang['SEND_PRIVATE_MESSAGE']), diff --git a/phpBB/posting.php b/phpBB/posting.php index 207ac32a3d..4423737b55 100644 --- a/phpBB/posting.php +++ b/phpBB/posting.php @@ -1154,8 +1154,8 @@ if (!sizeof($error) && $preview) 'POLL_QUESTION' => $parse_poll->message, 'L_POLL_LENGTH' => ($post_data['poll_length']) ? sprintf($user->lang['POLL_RUN_TILL'], $user->format_date($poll_end)) : '', - 'L_MAX_VOTES' => ($post_data['poll_max_options'] == 1) ? $user->lang['MAX_OPTION_SELECT'] : sprintf($user->lang['MAX_OPTIONS_SELECT'], $post_data['poll_max_options'])) - ); + 'L_MAX_VOTES' => $user->lang('MAX_OPTIONS_SELECT', (int) $post_data['poll_max_options']), + )); $parse_poll->message = implode("\n", $post_data['poll_options']); $parse_poll->format_display($post_data['enable_bbcode'], $post_data['enable_urls'], $post_data['enable_smilies']); @@ -1430,7 +1430,7 @@ if (($mode == 'post' || ($mode == 'edit' && $post_id == $post_data['topic_first_ 'S_POLL_DELETE' => ($mode == 'edit' && sizeof($post_data['poll_options']) && ((!$post_data['poll_last_vote'] && $post_data['poster_id'] == $user->data['user_id'] && $auth->acl_get('f_delete', $forum_id)) || $auth->acl_get('m_delete', $forum_id))), 'S_POLL_DELETE_CHECKED' => (!empty($poll_delete)) ? true : false, - 'L_POLL_OPTIONS_EXPLAIN' => sprintf($user->lang['POLL_OPTIONS_' . (($mode == 'edit') ? 'EDIT_' : '') . 'EXPLAIN'], $config['max_poll_options']), + 'L_POLL_OPTIONS_EXPLAIN' => $user->lang('POLL_OPTIONS_' . (($mode == 'edit') ? 'EDIT_' : '') . 'EXPLAIN', (int) $config['max_poll_options']), 'VOTE_CHANGE_CHECKED' => (!empty($post_data['poll_vote_change'])) ? ' checked="checked"' : '', 'POLL_TITLE' => (isset($post_data['poll_title'])) ? $post_data['poll_title'] : '', diff --git a/phpBB/search.php b/phpBB/search.php index c6189051a3..6626cd5672 100644 --- a/phpBB/search.php +++ b/phpBB/search.php @@ -136,7 +136,7 @@ if ($keywords || $author || $author_id || $search_id || $submit) { if ((strpos($author, '*') !== false) && (utf8_strlen(str_replace(array('*', '%'), '', $author)) < $config['min_search_author_chars'])) { - trigger_error(sprintf($user->lang['TOO_FEW_AUTHOR_CHARS'], $config['min_search_author_chars'])); + trigger_error($user->lang('TOO_FEW_AUTHOR_CHARS', (int) $config['min_search_author_chars'])); } $sql_where = (strpos($author, '*') !== false) ? ' username_clean ' . $db->sql_like_expression(str_replace('*', $db->any_char, utf8_clean_string($author))) : " username_clean = '" . $db->sql_escape(utf8_clean_string($author)) . "'"; @@ -544,11 +544,11 @@ if ($keywords || $author || $author_id || $search_id || $submit) { // limit the number to 1000 for pre-made searches $total_match_count--; - $l_search_matches = sprintf($user->lang['FOUND_MORE_SEARCH_MATCHES'], $total_match_count); + $l_search_matches = $user->lang('FOUND_MORE_SEARCH_MATCHES', (int) $total_match_count); } else { - $l_search_matches = ($total_match_count == 1) ? sprintf($user->lang['FOUND_SEARCH_MATCH'], $total_match_count) : sprintf($user->lang['FOUND_SEARCH_MATCHES'], $total_match_count); + $l_search_matches = $user->lang('FOUND_SEARCH_MATCHES', (int) $total_match_count); } // define some vars for urls diff --git a/phpBB/viewforum.php b/phpBB/viewforum.php index 3b10d828d3..7d3b9f56ed 100644 --- a/phpBB/viewforum.php +++ b/phpBB/viewforum.php @@ -581,8 +581,8 @@ $total_topic_count = $topics_count - sizeof($global_announce_forums); $template->assign_vars(array( 'PAGINATION' => generate_pagination(append_sid("{$phpbb_root_path}viewforum.$phpEx", "f=$forum_id" . ((strlen($u_sort_param)) ? "&$u_sort_param" : '')), $topics_count, $config['topics_per_page'], $start), 'PAGE_NUMBER' => on_page($topics_count, $config['topics_per_page'], $start), - 'TOTAL_TOPICS' => ($s_display_active) ? false : (($total_topic_count == 1) ? $user->lang['VIEW_FORUM_TOPIC'] : sprintf($user->lang['VIEW_FORUM_TOPICS'], $total_topic_count))) -); + 'TOTAL_TOPICS' => ($s_display_active) ? false : $user->lang('VIEW_FORUM_TOPICS', (int) $total_topic_count), +)); $topic_list = ($store_reverse) ? array_merge($announcement_list, array_reverse($topic_list)) : array_merge($announcement_list, $topic_list); $topic_tracking_info = $tracking_topics = array(); diff --git a/phpBB/viewonline.php b/phpBB/viewonline.php index 27038a975e..6b0da3ef97 100644 --- a/phpBB/viewonline.php +++ b/phpBB/viewonline.php @@ -343,32 +343,6 @@ while ($row = $db->sql_fetchrow($result)) $db->sql_freeresult($result); unset($prev_id, $prev_ip); -// Generate reg/hidden/guest online text -$vars_online = array( - 'REG' => array('logged_visible_online', 'l_r_user_s'), - 'HIDDEN'=> array('logged_hidden_online', 'l_h_user_s'), - 'GUEST' => array('guest_counter', 'l_g_user_s') -); - -foreach ($vars_online as $l_prefix => $var_ary) -{ - switch ($$var_ary[0]) - { - case 0: - $$var_ary[1] = $user->lang[$l_prefix . '_USERS_ZERO_ONLINE']; - break; - - case 1: - $$var_ary[1] = $user->lang[$l_prefix . '_USER_ONLINE']; - break; - - default: - $$var_ary[1] = $user->lang[$l_prefix . '_USERS_ONLINE']; - break; - } -} -unset($vars_online); - $pagination = generate_pagination(append_sid("{$phpbb_root_path}viewonline.$phpEx", "sg=$show_guests&sk=$sort_key&sd=$sort_dir"), $counter, $config['topics_per_page'], $start); $order_legend = ($config['legend_sort_groupname']) ? 'group_name' : 'group_legend'; @@ -415,8 +389,8 @@ meta_refresh(60, append_sid("{$phpbb_root_path}viewonline.$phpEx", "sg=$show_gue // Send data to template $template->assign_vars(array( - 'TOTAL_REGISTERED_USERS_ONLINE' => sprintf($l_r_user_s, $logged_visible_online) . sprintf($l_h_user_s, $logged_hidden_online), - 'TOTAL_GUEST_USERS_ONLINE' => sprintf($l_g_user_s, $guest_counter), + 'TOTAL_REGISTERED_USERS_ONLINE' => $user->lang('REG_USERS_ONLINE', (int) $logged_visible_online, $user->lang('HIDDEN_USERS_ONLINE', (int) $logged_hidden_online)), + 'TOTAL_GUEST_USERS_ONLINE' => $user->lang('GUEST_USERS_ONLINE', (int) $guest_counter), 'LEGEND' => $legend, 'PAGINATION' => $pagination, 'PAGE_NUMBER' => on_page($counter, $config['topics_per_page'], $start), diff --git a/phpBB/viewtopic.php b/phpBB/viewtopic.php index e78ba73cd7..a56012bcf2 100644 --- a/phpBB/viewtopic.php +++ b/phpBB/viewtopic.php @@ -578,7 +578,7 @@ $template->assign_vars(array( 'PAGINATION' => $pagination, 'PAGE_NUMBER' => on_page($total_posts, $config['posts_per_page'], $start), - 'TOTAL_POSTS' => ($total_posts == 1) ? $user->lang['VIEW_TOPIC_POST'] : sprintf($user->lang['VIEW_TOPIC_POSTS'], $total_posts), + 'TOTAL_POSTS' => $user->lang('VIEW_TOPIC_POSTS', (int) $total_posts), 'U_MCP' => ($auth->acl_get('m_', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", "i=main&mode=topic_view&f=$forum_id&t=$topic_id" . (($start == 0) ? '' : "&start=$start") . ((strlen($u_sort_param)) ? "&$u_sort_param" : ''), true, $user->session_id) : '', 'MODERATORS' => (isset($forum_moderators[$forum_id]) && sizeof($forum_moderators[$forum_id])) ? implode(', ', $forum_moderators[$forum_id]) : '', @@ -854,7 +854,7 @@ if (!empty($topic_data['poll_start'])) 'POLL_LEFT_CAP_IMG' => $user->img('poll_left'), 'POLL_RIGHT_CAP_IMG'=> $user->img('poll_right'), - 'L_MAX_VOTES' => ($topic_data['poll_max_options'] == 1) ? $user->lang['MAX_OPTION_SELECT'] : sprintf($user->lang['MAX_OPTIONS_SELECT'], $topic_data['poll_max_options']), + 'L_MAX_VOTES' => $user->lang('MAX_OPTIONS_SELECT', (int) $topic_data['poll_max_options']), 'L_POLL_LENGTH' => ($topic_data['poll_length']) ? sprintf($user->lang[($poll_end > time()) ? 'POLL_RUN_TILL' : 'POLL_ENDED_AT'], $user->format_date($poll_end)) : '', 'S_HAS_POLL' => true, @@ -1382,8 +1382,6 @@ for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i) unset($post_storage_list); } - $l_edit_time_total = ($row['post_edit_count'] == 1) ? $user->lang['EDITED_TIME_TOTAL'] : $user->lang['EDITED_TIMES_TOTAL']; - if ($row['post_edit_reason']) { // User having edited the post also being the post author? @@ -1396,7 +1394,7 @@ for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i) $display_username = get_username_string('full', $row['post_edit_user'], $post_edit_list[$row['post_edit_user']]['username'], $post_edit_list[$row['post_edit_user']]['user_colour']); } - $l_edited_by = sprintf($l_edit_time_total, $display_username, $user->format_date($row['post_edit_time'], false, true), $row['post_edit_count']); + $l_edited_by = $user->lang('EDITED_TIMES_TOTAL', (int) $row['post_edit_count'], $display_username, $user->format_date($row['post_edit_time'], false, true)); } else { @@ -1415,7 +1413,7 @@ for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i) $display_username = get_username_string('full', $row['post_edit_user'], $user_cache[$row['post_edit_user']]['username'], $user_cache[$row['post_edit_user']]['user_colour']); } - $l_edited_by = sprintf($l_edit_time_total, $display_username, $user->format_date($row['post_edit_time'], false, true), $row['post_edit_count']); + $l_edited_by = $user->lang('EDITED_TIMES_TOTAL', (int) $row['post_edit_count'], $display_username, $user->format_date($row['post_edit_time'], false, true)); } } else From 179662e949967090724c5e14ea4d4d399886a38a Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Tue, 20 Sep 2011 01:33:33 +0200 Subject: [PATCH 05/21] [ticket/10345] Use the plural function in some more places. I added two function avatar_explanation_string() and avatar_error_wrong_size() for easier handling of the "pixels"-languages, as they are used quite often. PHPBB3-10345 --- phpBB/feed.php | 2 +- phpBB/includes/acp/acp_attachments.php | 7 ++-- phpBB/includes/acp/acp_groups.php | 6 ++-- phpBB/includes/acp/acp_icons.php | 20 ++--------- phpBB/includes/acp/acp_search.php | 4 +-- phpBB/includes/acp/acp_users.php | 6 ++-- phpBB/includes/functions_profile_fields.php | 12 +++---- phpBB/includes/functions_upload.php | 8 ++++- phpBB/includes/functions_user.php | 31 +++++++++++++--- phpBB/includes/message_parser.php | 18 +++++----- phpBB/includes/ucp/ucp_groups.php | 8 ++--- phpBB/includes/ucp/ucp_main.php | 4 +-- phpBB/includes/ucp/ucp_pm_compose.php | 2 +- phpBB/includes/ucp/ucp_pm_options.php | 2 +- phpBB/includes/ucp/ucp_profile.php | 4 +-- phpBB/index.php | 2 +- phpBB/language/en/acp/groups.php | 6 ++-- phpBB/language/en/acp/posting.php | 32 ++++++++++------- phpBB/language/en/acp/search.php | 11 ++++-- phpBB/language/en/common.php | 12 ++++++- phpBB/language/en/posting.php | 39 +++++++++++++++------ phpBB/language/en/search.php | 2 +- phpBB/language/en/ucp.php | 20 +++++++---- phpBB/memberlist.php | 4 +-- phpBB/posting.php | 6 ++-- phpBB/search.php | 2 +- 26 files changed, 169 insertions(+), 101 deletions(-) diff --git a/phpBB/feed.php b/phpBB/feed.php index 8d33a358a5..e490363594 100644 --- a/phpBB/feed.php +++ b/phpBB/feed.php @@ -1107,7 +1107,7 @@ class phpbb_feed_forums extends phpbb_feed_base global $user; $item_row['statistics'] = $user->lang('TOTAL_TOPICS', (int) $row['forum_topics']) - . ' ' . $this->separator_stats . ' ' . sprintf($user->lang['TOTAL_POSTS_OTHER'], $row['forum_posts']); + . ' ' . $this->separator_stats . ' ' . $user->lang('TOTAL_POSTS_OTHER', (int) $row['forum_posts']); } } } diff --git a/phpBB/includes/acp/acp_attachments.php b/phpBB/includes/acp/acp_attachments.php index c62fefae46..4295aa9d9f 100644 --- a/phpBB/includes/acp/acp_attachments.php +++ b/phpBB/includes/acp/acp_attachments.php @@ -1159,7 +1159,7 @@ class acp_attachments // Issue warning message if files stats are inaccurate if (($num_files != $num_files_real) || ($total_size != $total_size_real)) { - $error[] = sprintf($user->lang['FILES_STATS_WRONG'], $num_files_real, get_formatted_filesize($total_size_real)); + $error[] = $user->lang('FILES_STATS_WRONG', (int) $num_files_real, get_formatted_filesize($total_size_real)); $template->assign_vars(array( 'S_ACTION_OPTIONS' => ($auth->acl_get('a_board')) ? true : false, @@ -1244,8 +1244,7 @@ class acp_attachments $row['extension'] = strtolower(trim((string) $row['extension'])); $comment = ($row['attach_comment'] && !$row['in_message']) ? str_replace(array("\n", "\r"), array('
', "\n"), $row['attach_comment']) : ''; $display_cat = $extensions[$row['extension']]['display_cat']; - $l_downloaded_viewed = ($display_cat == ATTACHMENT_CATEGORY_NONE) ? 'DOWNLOAD_COUNT' : 'VIEWED_COUNT'; - $l_download_count = (!isset($row['download_count']) || (int) $row['download_count'] == 0) ? $user->lang[$l_downloaded_viewed . '_NONE'] : (((int) $row['download_count'] == 1) ? sprintf($user->lang[$l_downloaded_viewed], $row['download_count']) : sprintf($user->lang[$l_downloaded_viewed . 'S'], $row['download_count'])); + $l_downloaded_viewed = ($display_cat == ATTACHMENT_CATEGORY_NONE) ? 'DOWNLOAD_COUNTS' : 'VIEWED_COUNTS'; $template->assign_block_vars('attachments', array( 'ATTACHMENT_POSTER' => get_username_string('full', (int) $row['poster_id'], (string) $row['username'], (string) $row['user_colour'], (string) $row['username']), @@ -1261,7 +1260,7 @@ class acp_attachments 'TOPIC_ID' => (int) $row['topic_id'], 'POST_IDS' => (!empty($post_ids[$row['attach_id']])) ? (int) $post_ids[$row['attach_id']] : '', - 'L_DOWNLOAD_COUNT' => $l_download_count, + 'L_DOWNLOAD_COUNT' => $user->lang($l_downloaded_viewed, (int) $row['download_count']), 'S_IN_MESSAGE' => (bool) $row['in_message'], diff --git a/phpBB/includes/acp/acp_groups.php b/phpBB/includes/acp/acp_groups.php index 9aa54bed89..ea4d5f35cb 100644 --- a/phpBB/includes/acp/acp_groups.php +++ b/phpBB/includes/acp/acp_groups.php @@ -371,7 +371,7 @@ class acp_groups { if ($data['width'] > $config['avatar_max_width'] || $data['height'] > $config['avatar_max_height']) { - $error[] = sprintf($user->lang['AVATAR_WRONG_SIZE'], $config['avatar_min_width'], $config['avatar_min_height'], $config['avatar_max_width'], $config['avatar_max_height'], $data['width'], $data['height']); + $error[] = avatar_error_wrong_size($data['width'], $data['height']); } } @@ -381,7 +381,7 @@ class acp_groups { if ($data['width'] < $config['avatar_min_width'] || $data['height'] < $config['avatar_min_height']) { - $error[] = sprintf($user->lang['AVATAR_WRONG_SIZE'], $config['avatar_min_width'], $config['avatar_min_height'], $config['avatar_max_width'], $config['avatar_max_height'], $data['width'], $data['height']); + $error[] = avatar_error_wrong_size($data['width'], $data['height']); } } } @@ -627,7 +627,7 @@ class acp_groups 'U_BACK' => $u_back, 'U_SWATCH' => append_sid("{$phpbb_admin_path}swatch.$phpEx", 'form=settings&name=group_colour'), 'U_ACTION' => "{$this->u_action}&action=$action&g=$group_id", - 'L_AVATAR_EXPLAIN' => sprintf($user->lang['AVATAR_EXPLAIN'], $config['avatar_max_width'], $config['avatar_max_height'], round($config['avatar_filesize'] / 1024)), + 'L_AVATAR_EXPLAIN' => avatar_explanation_string(), )); return; diff --git a/phpBB/includes/acp/acp_icons.php b/phpBB/includes/acp/acp_icons.php index 98aef45892..e02124fb42 100644 --- a/phpBB/includes/acp/acp_icons.php +++ b/phpBB/includes/acp/acp_icons.php @@ -487,21 +487,7 @@ class acp_icons $cache->destroy('_icons'); $cache->destroy('sql', $table); - $level = E_USER_NOTICE; - switch ($icons_updated) - { - case 0: - $suc_lang = "{$lang}_NONE"; - $level = E_USER_WARNING; - break; - - case 1: - $suc_lang = "{$lang}_ONE"; - break; - - default: - $suc_lang = $lang; - } + $level = ($icons_updated) ? E_USER_NOTICE : E_USER_WARNING; $errormsgs = ''; foreach ($errors as $img => $error) { @@ -509,11 +495,11 @@ class acp_icons } if ($action == 'modify') { - trigger_error($user->lang[$suc_lang . '_EDITED'] . $errormsgs . adm_back_link($this->u_action), $level); + trigger_error($user->lang($lang . '_EDITED', $icons_updated) . $errormsgs . adm_back_link($this->u_action), $level); } else { - trigger_error($user->lang[$suc_lang . '_ADDED'] . $errormsgs . adm_back_link($this->u_action), $level); + trigger_error($user->lang($lang . '_ADDED', $icons_updated) . $errormsgs . adm_back_link($this->u_action), $level); } break; diff --git a/phpBB/includes/acp/acp_search.php b/phpBB/includes/acp/acp_search.php index ab604cd7cd..2de76187d5 100644 --- a/phpBB/includes/acp/acp_search.php +++ b/phpBB/includes/acp/acp_search.php @@ -338,7 +338,7 @@ class acp_search $totaltime = $mtime[0] + $mtime[1] - $starttime; $rows_per_second = $row_count / $totaltime; meta_refresh(1, append_sid($this->u_action . '&action=delete&skip_rows=' . $post_counter)); - trigger_error(sprintf($user->lang['SEARCH_INDEX_DELETE_REDIRECT'], $post_counter, $row_count, $rows_per_second)); + trigger_error($user->lang('SEARCH_INDEX_DELETE_REDIRECT', (int) $row_count, $post_counter, $rows_per_second)); } } @@ -428,7 +428,7 @@ class acp_search $totaltime = $mtime[0] + $mtime[1] - $starttime; $rows_per_second = $row_count / $totaltime; meta_refresh(1, append_sid($this->u_action . '&action=create&skip_rows=' . $post_counter)); - trigger_error(sprintf($user->lang['SEARCH_INDEX_CREATE_REDIRECT'], $post_counter, $row_count, $rows_per_second)); + trigger_error($user->lang('SEARCH_INDEX_CREATE_REDIRECT', (int) $row_count, $post_counter) . $user->lang('SEARCH_INDEX_CREATE_REDIRECT_RATE', $rows_per_second)); } } diff --git a/phpBB/includes/acp/acp_users.php b/phpBB/includes/acp/acp_users.php index 38bcbf5ee3..3ae1278396 100644 --- a/phpBB/includes/acp/acp_users.php +++ b/phpBB/includes/acp/acp_users.php @@ -1748,8 +1748,8 @@ class acp_users 'USER_AVATAR_WIDTH' => $user_row['user_avatar_width'], 'USER_AVATAR_HEIGHT' => $user_row['user_avatar_height'], - 'L_AVATAR_EXPLAIN' => sprintf($user->lang['AVATAR_EXPLAIN'], $config['avatar_max_width'], $config['avatar_max_height'], round($config['avatar_filesize'] / 1024))) - ); + 'L_AVATAR_EXPLAIN' => avatar_explanation_string() + )); break; @@ -1881,7 +1881,7 @@ class acp_users 'FLASH_STATUS' => ($config['allow_sig_flash']) ? $user->lang['FLASH_IS_ON'] : $user->lang['FLASH_IS_OFF'], 'URL_STATUS' => ($config['allow_sig_links']) ? $user->lang['URL_IS_ON'] : $user->lang['URL_IS_OFF'], - 'L_SIGNATURE_EXPLAIN' => sprintf($user->lang['SIGNATURE_EXPLAIN'], $config['max_sig_chars']), + 'L_SIGNATURE_EXPLAIN' => $user->lang('SIGNATURE_EXPLAIN', (int) $config['max_sig_chars']), 'S_BBCODE_ALLOWED' => $config['allow_sig_bbcode'], 'S_SMILIES_ALLOWED' => $config['allow_sig_smilies'], diff --git a/phpBB/includes/functions_profile_fields.php b/phpBB/includes/functions_profile_fields.php index ec29a1732d..130a4dcae8 100644 --- a/phpBB/includes/functions_profile_fields.php +++ b/phpBB/includes/functions_profile_fields.php @@ -315,32 +315,32 @@ class custom_profile case 'FIELD_INVALID_DATE': case 'FIELD_INVALID_VALUE': case 'FIELD_REQUIRED': - $error = sprintf($user->lang[$cp_result], $row['lang_name']); + $error = $user->lang($cp_result, $row['lang_name']); break; case 'FIELD_TOO_SHORT': case 'FIELD_TOO_SMALL': - $error = sprintf($user->lang[$cp_result], $row['lang_name'], $row['field_minlen']); + $error = $user->lang($cp_result, (int) $row['field_minlen'], $row['lang_name']); break; case 'FIELD_TOO_LONG': case 'FIELD_TOO_LARGE': - $error = sprintf($user->lang[$cp_result], $row['lang_name'], $row['field_maxlen']); + $error = $user->lang($cp_result, (int) $row['field_maxlen'], $row['lang_name']); break; case 'FIELD_INVALID_CHARS': switch ($row['field_validation']) { case '[0-9]+': - $error = sprintf($user->lang[$cp_result . '_NUMBERS_ONLY'], $row['lang_name']); + $error = $user->lang($cp_result . '_NUMBERS_ONLY', $row['lang_name']); break; case '[\w]+': - $error = sprintf($user->lang[$cp_result . '_ALPHA_ONLY'], $row['lang_name']); + $error = $user->lang($cp_result . '_ALPHA_ONLY', $row['lang_name']); break; case '[\w_\+\. \-\[\]]+': - $error = sprintf($user->lang[$cp_result . '_SPACERS_ONLY'], $row['lang_name']); + $error = $user->lang($cp_result . '_SPACERS_ONLY', $row['lang_name']); break; } break; diff --git a/phpBB/includes/functions_upload.php b/phpBB/includes/functions_upload.php index f648c585f6..2322aa77bf 100644 --- a/phpBB/includes/functions_upload.php +++ b/phpBB/includes/functions_upload.php @@ -427,7 +427,13 @@ class filespec if (!$this->upload->valid_dimensions($this)) { - $this->error[] = sprintf($user->lang[$this->upload->error_prefix . 'WRONG_SIZE'], $this->upload->min_width, $this->upload->min_height, $this->upload->max_width, $this->upload->max_height, $this->width, $this->height); + $this->error[] = $user->lang($this->upload->error_prefix . 'WRONG_SIZE', + $user->lang('PIXELS', (int) $this->upload->min_width), + $user->lang('PIXELS', (int) $this->upload->min_height), + $user->lang('PIXELS', (int) $this->upload->max_width), + $user->lang('PIXELS', (int) $this->upload->max_height), + $user->lang('PIXELS', (int) $this->width), + $user->lang('PIXELS', (int) $this->height)); return false; } diff --git a/phpBB/includes/functions_user.php b/phpBB/includes/functions_user.php index 930cd4625f..e3537fe328 100644 --- a/phpBB/includes/functions_user.php +++ b/phpBB/includes/functions_user.php @@ -2039,7 +2039,7 @@ function avatar_remote($data, &$error) { if ($width > $config['avatar_max_width'] || $height > $config['avatar_max_height']) { - $error[] = sprintf($user->lang['AVATAR_WRONG_SIZE'], $config['avatar_min_width'], $config['avatar_min_height'], $config['avatar_max_width'], $config['avatar_max_height'], $width, $height); + $error[] = avatar_error_wrong_size($width, $height); return false; } } @@ -2048,7 +2048,7 @@ function avatar_remote($data, &$error) { if ($width < $config['avatar_min_width'] || $height < $config['avatar_min_height']) { - $error[] = sprintf($user->lang['AVATAR_WRONG_SIZE'], $config['avatar_min_width'], $config['avatar_min_height'], $config['avatar_max_width'], $config['avatar_max_height'], $width, $height); + $error[] = avatar_error_wrong_size($width, $height); return false; } } @@ -2388,7 +2388,7 @@ function avatar_process_user(&$error, $custom_userdata = false, $can_upload = nu { if ($data['width'] > $config['avatar_max_width'] || $data['height'] > $config['avatar_max_height']) { - $error[] = sprintf($user->lang['AVATAR_WRONG_SIZE'], $config['avatar_min_width'], $config['avatar_min_height'], $config['avatar_max_width'], $config['avatar_max_height'], $data['width'], $data['height']); + $error[] = avatar_error_wrong_size($data['width'], $data['height']); } } @@ -2398,7 +2398,7 @@ function avatar_process_user(&$error, $custom_userdata = false, $can_upload = nu { if ($data['width'] < $config['avatar_min_width'] || $data['height'] < $config['avatar_min_height']) { - $error[] = sprintf($user->lang['AVATAR_WRONG_SIZE'], $config['avatar_min_width'], $config['avatar_min_height'], $config['avatar_max_width'], $config['avatar_max_height'], $data['width'], $data['height']); + $error[] = avatar_error_wrong_size($data['width'], $data['height']); } } } @@ -2444,6 +2444,29 @@ function avatar_process_user(&$error, $custom_userdata = false, $can_upload = nu return (sizeof($error)) ? false : true; } +function avatar_error_wrong_size($width, $height) +{ + global $config, $user; + + return $user->lang('AVATAR_WRONG_SIZE', + $user->lang('PIXELS', (int) $config['avatar_min_width']), + $user->lang('PIXELS', (int) $config['avatar_min_height']), + $user->lang('PIXELS', (int) $config['avatar_max_width']), + $user->lang('PIXELS', (int) $config['avatar_max_height']), + $user->lang('PIXELS', (int) $width), + $user->lang('PIXELS', (int) $height)); +} + +function avatar_explanation_string() +{ + global $config, $user; + + return $user->lang('AVATAR_EXPLAIN', + $user->lang('PIXELS', (int) $config['avatar_max_width']), + $user->lang('PIXELS', (int) $config['avatar_max_height']), + round($config['avatar_filesize'] / 1024)); +} + // // Usergroup functions // diff --git a/phpBB/includes/message_parser.php b/phpBB/includes/message_parser.php index cb9a9d7d28..5e8732e94d 100644 --- a/phpBB/includes/message_parser.php +++ b/phpBB/includes/message_parser.php @@ -210,7 +210,7 @@ class bbcode_firstpass extends bbcode if ($config['max_' . $this->mode . '_font_size'] && $config['max_' . $this->mode . '_font_size'] < $stx) { - $this->warn_msg[] = sprintf($user->lang['MAX_FONT_SIZE_EXCEEDED'], $config['max_' . $this->mode . '_font_size']); + $this->warn_msg[] = $user->lang('MAX_FONT_SIZE_EXCEEDED', (int) $config['max_' . $this->mode . '_font_size']); return '[size=' . $stx . ']' . $in . '[/size]'; } @@ -319,13 +319,13 @@ class bbcode_firstpass extends bbcode if ($config['max_' . $this->mode . '_img_height'] && $config['max_' . $this->mode . '_img_height'] < $stats[1]) { $error = true; - $this->warn_msg[] = sprintf($user->lang['MAX_IMG_HEIGHT_EXCEEDED'], $config['max_' . $this->mode . '_img_height']); + $this->warn_msg[] = $user->lang('MAX_IMG_HEIGHT_EXCEEDED', (int) $config['max_' . $this->mode . '_img_height']); } if ($config['max_' . $this->mode . '_img_width'] && $config['max_' . $this->mode . '_img_width'] < $stats[0]) { $error = true; - $this->warn_msg[] = sprintf($user->lang['MAX_IMG_WIDTH_EXCEEDED'], $config['max_' . $this->mode . '_img_width']); + $this->warn_msg[] = $user->lang('MAX_IMG_WIDTH_EXCEEDED', (int) $config['max_' . $this->mode . '_img_width']); } } } @@ -374,13 +374,13 @@ class bbcode_firstpass extends bbcode if ($config['max_' . $this->mode . '_img_height'] && $config['max_' . $this->mode . '_img_height'] < $height) { $error = true; - $this->warn_msg[] = sprintf($user->lang['MAX_FLASH_HEIGHT_EXCEEDED'], $config['max_' . $this->mode . '_img_height']); + $this->warn_msg[] = $user->lang('MAX_FLASH_HEIGHT_EXCEEDED', (int) $config['max_' . $this->mode . '_img_height']); } if ($config['max_' . $this->mode . '_img_width'] && $config['max_' . $this->mode . '_img_width'] < $width) { $error = true; - $this->warn_msg[] = sprintf($user->lang['MAX_FLASH_WIDTH_EXCEEDED'], $config['max_' . $this->mode . '_img_width']); + $this->warn_msg[] = $user->lang('MAX_FLASH_WIDTH_EXCEEDED', (int) $config['max_' . $this->mode . '_img_width']); } } @@ -1117,7 +1117,7 @@ class parse_message extends bbcode_firstpass // Maximum message length check. 0 disables this check completely. if ((int) $config['max_' . $mode . '_chars'] > 0 && $message_length > (int) $config['max_' . $mode . '_chars']) { - $this->warn_msg[] = sprintf($user->lang['TOO_MANY_CHARS_' . strtoupper($mode)], $message_length, (int) $config['max_' . $mode . '_chars']); + $this->warn_msg[] = $user->lang('TOO_MANY_CHARS_' . strtoupper($mode), $message_length, (int) $config['max_' . $mode . '_chars']); return (!$update_this_message) ? $return_message : $this->warn_msg; } @@ -1126,7 +1126,7 @@ class parse_message extends bbcode_firstpass { if (!$message_length || $message_length < (int) $config['min_post_chars']) { - $this->warn_msg[] = (!$message_length) ? $user->lang['TOO_FEW_CHARS'] : sprintf($user->lang['TOO_FEW_CHARS_LIMIT'], $message_length, (int) $config['min_post_chars']); + $this->warn_msg[] = (!$message_length) ? $user->lang['TOO_FEW_CHARS'] : $user->lang('TOO_FEW_CHARS_LIMIT', $message_length, (int) $config['min_post_chars']); return (!$update_this_message) ? $return_message : $this->warn_msg; } } @@ -1445,7 +1445,7 @@ class parse_message extends bbcode_firstpass } else { - $error[] = sprintf($user->lang['TOO_MANY_ATTACHMENTS'], $cfg['max_attachments']); + $error[] = $user->lang('TOO_MANY_ATTACHMENTS', (int) $cfg['max_attachments']); } } @@ -1536,7 +1536,7 @@ class parse_message extends bbcode_firstpass } else { - $error[] = sprintf($user->lang['TOO_MANY_ATTACHMENTS'], $cfg['max_attachments']); + $error[] = $user->lang('TOO_MANY_ATTACHMENTS', (int) $cfg['max_attachments']); } } } diff --git a/phpBB/includes/ucp/ucp_groups.php b/phpBB/includes/ucp/ucp_groups.php index 5ac5cbf431..e3e4e8ce22 100644 --- a/phpBB/includes/ucp/ucp_groups.php +++ b/phpBB/includes/ucp/ucp_groups.php @@ -561,7 +561,7 @@ class ucp_groups { if ($data['width'] > $config['avatar_max_width'] || $data['height'] > $config['avatar_max_height']) { - $error[] = sprintf($user->lang['AVATAR_WRONG_SIZE'], $config['avatar_min_width'], $config['avatar_min_height'], $config['avatar_max_width'], $config['avatar_max_height'], $data['width'], $data['height']); + $error[] = avatar_error_wrong_size($data['width'], $data['height']); } } @@ -571,7 +571,7 @@ class ucp_groups { if ($data['width'] < $config['avatar_min_width'] || $data['height'] < $config['avatar_min_height']) { - $error[] = sprintf($user->lang['AVATAR_WRONG_SIZE'], $config['avatar_min_width'], $config['avatar_min_height'], $config['avatar_max_width'], $config['avatar_max_height'], $data['width'], $data['height']); + $error[] = avatar_error_wrong_size($data['width'], $data['height']); } } } @@ -732,7 +732,7 @@ class ucp_groups 'U_SWATCH' => append_sid("{$phpbb_root_path}adm/swatch.$phpEx", 'form=ucp&name=group_colour'), 'S_UCP_ACTION' => $this->u_action . "&action=$action&g=$group_id", - 'L_AVATAR_EXPLAIN' => sprintf($user->lang['AVATAR_EXPLAIN'], $config['avatar_max_width'], $config['avatar_max_height'], $config['avatar_filesize'] / 1024), + 'L_AVATAR_EXPLAIN' => avatar_explanation_string(), )); break; @@ -1068,7 +1068,7 @@ class ucp_groups 'mode' => $mode, 'action' => $action ); - confirm_box(false, sprintf($user->lang['GROUP_CONFIRM_ADD_USER' . ((sizeof($name_ary) == 1) ? '' : 'S')], implode(', ', $name_ary)), build_hidden_fields($s_hidden_fields)); + confirm_box(false, $user->lang('GROUP_CONFIRM_ADD_USERS', sizeof($name_ary), implode(', ', $name_ary)), build_hidden_fields($s_hidden_fields)); } trigger_error($user->lang['NO_USERS_ADDED'] . '

' . sprintf($user->lang['RETURN_PAGE'], '', '')); diff --git a/phpBB/includes/ucp/ucp_main.php b/phpBB/includes/ucp/ucp_main.php index 3538b641f7..2b8f662bb4 100644 --- a/phpBB/includes/ucp/ucp_main.php +++ b/phpBB/includes/ucp/ucp_main.php @@ -194,8 +194,8 @@ class ucp_main 'VISITED' => (empty($last_visit)) ? ' - ' : $user->format_date($last_visit), 'WARNINGS' => ($user->data['user_warnings']) ? $user->data['user_warnings'] : 0, 'POSTS' => ($user->data['user_posts']) ? $user->data['user_posts'] : 0, - 'POSTS_DAY' => sprintf($user->lang['POST_DAY'], $posts_per_day), - 'POSTS_PCT' => sprintf($user->lang['POST_PCT'], $percentage), + 'POSTS_DAY' => $user->lang('POST_DAY', $posts_per_day), + 'POSTS_PCT' => $user->lang('POST_PCT', $percentage), 'OCCUPATION' => (!empty($row['user_occ'])) ? $row['user_occ'] : '', 'INTERESTS' => (!empty($row['user_interests'])) ? $row['user_interests'] : '', diff --git a/phpBB/includes/ucp/ucp_pm_compose.php b/phpBB/includes/ucp/ucp_pm_compose.php index 92297c1490..981c95a748 100644 --- a/phpBB/includes/ucp/ucp_pm_compose.php +++ b/phpBB/includes/ucp/ucp_pm_compose.php @@ -1053,7 +1053,7 @@ function compose_pm($id, $mode, $action, $user_folders = array()) $template->assign_vars(array( 'L_POST_A' => $page_title, 'L_ICON' => $user->lang['PM_ICON'], - 'L_MESSAGE_BODY_EXPLAIN' => (intval($config['max_post_chars'])) ? sprintf($user->lang['MESSAGE_BODY_EXPLAIN'], intval($config['max_post_chars'])) : '', + 'L_MESSAGE_BODY_EXPLAIN' => $user->lang('MESSAGE_BODY_EXPLAIN', (int) $config['max_post_chars']), 'SUBJECT' => (isset($message_subject)) ? $message_subject : '', 'MESSAGE' => $message_text, diff --git a/phpBB/includes/ucp/ucp_pm_options.php b/phpBB/includes/ucp/ucp_pm_options.php index bd55e2c6c5..7f854e422f 100644 --- a/phpBB/includes/ucp/ucp_pm_options.php +++ b/phpBB/includes/ucp/ucp_pm_options.php @@ -231,7 +231,7 @@ function message_options($id, $mode, $global_privmsgs_rules, $global_rule_condit // Something went wrong, only partially moved? if ($num_moved != $folder_row['pm_count']) { - trigger_error(sprintf($user->lang['MOVE_PM_ERROR'], $num_moved, $folder_row['pm_count'])); + trigger_error($user->lang('MOVE_PM_ERROR', (int) $folder_row['pm_count'], $num_moved)); } break; diff --git a/phpBB/includes/ucp/ucp_profile.php b/phpBB/includes/ucp/ucp_profile.php index d8d64722b3..4822d7a421 100644 --- a/phpBB/includes/ucp/ucp_profile.php +++ b/phpBB/includes/ucp/ucp_profile.php @@ -537,7 +537,7 @@ class ucp_profile 'URL_STATUS' => ($config['allow_sig_links']) ? $user->lang['URL_IS_ON'] : $user->lang['URL_IS_OFF'], 'MAX_FONT_SIZE' => (int) $config['max_sig_font_size'], - 'L_SIGNATURE_EXPLAIN' => sprintf($user->lang['SIGNATURE_EXPLAIN'], $config['max_sig_chars']), + 'L_SIGNATURE_EXPLAIN' => $user->lang('SIGNATURE_EXPLAIN', (int) $config['max_sig_chars']), 'S_BBCODE_ALLOWED' => $config['allow_sig_bbcode'], 'S_SMILIES_ALLOWED' => $config['allow_sig_smilies'], @@ -602,7 +602,7 @@ class ucp_profile 'S_FORM_ENCTYPE' => ($can_upload && ($config['allow_avatar_upload'] || $config['allow_avatar_remote_upload'])) ? ' enctype="multipart/form-data"' : '', - 'L_AVATAR_EXPLAIN' => sprintf($user->lang['AVATAR_EXPLAIN'], $config['avatar_max_width'], $config['avatar_max_height'], $config['avatar_filesize'] / 1024), + 'L_AVATAR_EXPLAIN' => avatar_explanation_string(), )); if ($config['allow_avatar'] && $display_gallery && $auth->acl_get('u_chgavatar') && $config['allow_avatar_local']) diff --git a/phpBB/index.php b/phpBB/index.php index bf59d4d840..b32d90bfd0 100644 --- a/phpBB/index.php +++ b/phpBB/index.php @@ -118,7 +118,7 @@ $template->assign_vars(array( 'TOTAL_POSTS' => $user->lang('TOTAL_POSTS', (int) $config['num_posts']), 'TOTAL_TOPICS' => $user->lang('TOTAL_TOPICS', (int) $config['num_topics']), 'TOTAL_USERS' => $user->lang('TOTAL_USERS', (int) $config['num_users']), - 'NEWEST_USER' => sprintf($user->lang['NEWEST_USER'], get_username_string('full', $config['newest_user_id'], $config['newest_username'], $config['newest_user_colour'])), + 'NEWEST_USER' => $user->lang('NEWEST_USER', get_username_string('full', $config['newest_user_id'], $config['newest_username'], $config['newest_user_colour'])), 'LEGEND' => $legend, 'BIRTHDAY_LIST' => (empty($birthday_list)) ? '' : implode(', ', $birthday_list), diff --git a/phpBB/language/en/acp/groups.php b/phpBB/language/en/acp/groups.php index 28e6fb80d9..8fc71f217d 100644 --- a/phpBB/language/en/acp/groups.php +++ b/phpBB/language/en/acp/groups.php @@ -54,8 +54,10 @@ $lang = array_merge($lang, array( 'GROUP_CLOSED' => 'Closed', 'GROUP_COLOR' => 'Group colour', 'GROUP_COLOR_EXPLAIN' => 'Defines the colour members’ usernames will appear in, leave blank for user default.', - 'GROUP_CONFIRM_ADD_USER' => 'Are you sure that you want to add the user %1$s to the group?', - 'GROUP_CONFIRM_ADD_USERS' => 'Are you sure that you want to add the users %1$s to the group?', + 'GROUP_CONFIRM_ADD_USERS' => array( + 1 => 'Are you sure that you want to add the user %2$s to the group?', + 2 => 'Are you sure that you want to add the users %2$s to the group?', + ), 'GROUP_CREATED' => 'Group has been created successfully.', 'GROUP_DEFAULT' => 'Make group default for member', 'GROUP_DEFS_UPDATED' => 'Default group set for all selected members.', diff --git a/phpBB/language/en/acp/posting.php b/phpBB/language/en/acp/posting.php index 7aa01469b7..3d920b5340 100644 --- a/phpBB/language/en/acp/posting.php +++ b/phpBB/language/en/acp/posting.php @@ -121,15 +121,19 @@ $lang = array_merge($lang, array( 'FIRST' => 'First', 'ICONS_ADD' => 'Add a new icon', - 'ICONS_NONE_ADDED' => 'No icons were added.', - 'ICONS_ONE_ADDED' => 'The icon has been added successfully.', - 'ICONS_ADDED' => 'The icons have been added successfully.', + 'ICONS_ADDED' => array( + 0 => 'No icons were added.', + 1 => 'The icon has been added successfully.', + 2 => 'The icons have been added successfully.', + ), 'ICONS_CONFIG' => 'Icon configuration', 'ICONS_DELETED' => 'The icon has been removed successfully.', 'ICONS_EDIT' => 'Edit icon', - 'ICONS_ONE_EDITED' => 'The icon has been updated successfully.', - 'ICONS_NONE_EDITED' => 'No icons were updated.', - 'ICONS_EDITED' => 'The icons have been updated successfully.', + 'ICONS_EDITED' => array( + 0 => 'No icons were updated.', + 1 => 'The icon has been updated successfully.', + 2 => 'The icons have been updated successfully.', + ), 'ICONS_HEIGHT' => 'Icon height', 'ICONS_IMAGE' => 'Icon image', 'ICONS_IMPORTED' => 'The icons pack has been installed successfully.', @@ -161,9 +165,11 @@ $lang = array_merge($lang, array( 'SELECT_PACKAGE' => 'Select a package file', 'SMILIES_ADD' => 'Add a new smiley', - 'SMILIES_NONE_ADDED' => 'No smilies were added.', - 'SMILIES_ONE_ADDED' => 'The smiley has been added successfully.', - 'SMILIES_ADDED' => 'The smilies have been added successfully.', + 'SMILIES_ADDED' => array( + 0 => 'No smilies were added.', + 1 => 'The smiley has been added successfully.', + 2 => 'The smilies have been added successfully.', + ), 'SMILIES_CODE' => 'Smiley code', 'SMILIES_CONFIG' => 'Smiley configuration', 'SMILIES_DELETED' => 'The smiley has been removed successfully.', @@ -171,9 +177,11 @@ $lang = array_merge($lang, array( 'SMILIE_NO_CODE' => 'The smiley “%s” was ignored, as there was no code entered.', 'SMILIE_NO_EMOTION' => 'The smiley “%s” was ignored, as there was no emotion entered.', 'SMILIE_NO_FILE' => 'The smiley “%s” was ignored, as the file is missing.', - 'SMILIES_NONE_EDITED' => 'No smilies were updated.', - 'SMILIES_ONE_EDITED' => 'The smiley has been updated successfully.', - 'SMILIES_EDITED' => 'The smilies have been updated successfully.', + 'SMILIES_EDITED' => array( + 0 => 'No smilies were updated.', + 1 => 'The smiley has been updated successfully.', + 2 => 'The smilies have been updated successfully.', + ), 'SMILIES_EMOTION' => 'Emotion', 'SMILIES_HEIGHT' => 'Smiley height', 'SMILIES_IMAGE' => 'Smiley image', diff --git a/phpBB/language/en/acp/search.php b/phpBB/language/en/acp/search.php index 9f0181a7e2..c7db788bb0 100644 --- a/phpBB/language/en/acp/search.php +++ b/phpBB/language/en/acp/search.php @@ -85,8 +85,15 @@ $lang = array_merge($lang, array( 'SEARCH_GUEST_INTERVAL' => 'Guest search flood interval', 'SEARCH_GUEST_INTERVAL_EXPLAIN' => 'Number of seconds guests must wait between searches. If one guest searches all others have to wait until the time interval passed.', - 'SEARCH_INDEX_CREATE_REDIRECT' => 'All posts up to post id %1$d have now been indexed, of which %2$d posts were within this step.
The current rate of indexing is approximately %3$.1f posts per second.
Indexing in progress…', - 'SEARCH_INDEX_DELETE_REDIRECT' => 'All posts up to post id %1$d have been removed from the search index.
Deleting in progress…', + 'SEARCH_INDEX_CREATE_REDIRECT' => array( + 2 => 'All posts up to post id %2$d have now been indexed, of which %1$d posts were within this step.
', + ), + 'SEARCH_INDEX_CREATE_REDIRECT_RATE' => array( + 2 => 'The current rate of indexing is approximately %1$.1f posts per second.
Indexing in progress…', + ), + 'SEARCH_INDEX_DELETE_REDIRECT' => array( + 2 => 'All posts up to post id %2$d have been removed from the search index.
Deleting in progress…', + ), 'SEARCH_INDEX_CREATED' => 'Successfully indexed all posts in the board database.', 'SEARCH_INDEX_REMOVED' => 'Successfully deleted the search index for this backend.', 'SEARCH_INTERVAL' => 'User search flood interval', diff --git a/phpBB/language/en/common.php b/phpBB/language/en/common.php index 6fcef11852..1cf371a887 100644 --- a/phpBB/language/en/common.php +++ b/phpBB/language/en/common.php @@ -96,7 +96,7 @@ $lang = array_merge($lang, array( 'AVATAR_URL_INVALID' => 'The URL you specified is invalid.', 'AVATAR_URL_NOT_FOUND' => 'The file specified could not be found.', 'AVATAR_WRONG_FILESIZE' => 'The avatar’s filesize must be between 0 and %1d %2s.', - 'AVATAR_WRONG_SIZE' => 'The submitted avatar is %5$d pixels wide and %6$d pixels high. Avatars must be at least %1$d pixels wide and %2$d pixels high, but no larger than %3$d pixels wide and %4$d pixels high.', + 'AVATAR_WRONG_SIZE' => 'The submitted avatar is %5$s wide and %6$s high. Avatars must be at least %1$s wide and %2$s high, but no larger than %3$s wide and %4$s high.', 'BACK_TO_TOP' => 'Top', 'BACK_TO_PREV' => 'Back to previous page', @@ -125,6 +125,11 @@ $lang = array_merge($lang, array( 'CHANGE_FONT_SIZE' => 'Change font size', 'CHANGING_PREFERENCES' => 'Changing board preferences', 'CHANGING_PROFILE' => 'Changing profile settings', + 'CHARACTERS' => array( + 0 => '%d characters', + 1 => '%d character', + 2 => '%d characters', + ), 'CLICK_VIEW_PRIVMSG' => '%sGo to your inbox%s', 'COLLAPSE_VIEW' => 'Collapse view', 'CLOSE_WINDOW' => 'Close window', @@ -447,6 +452,11 @@ $lang = array_merge($lang, array( 'PAGE_TITLE_NUMBER' => 'Page %s', 'PASSWORD' => 'Password', 'PIXEL' => 'px', + 'PIXELS' => array( + 0 => '%d pixels', + 1 => '%d pixel', + 2 => '%d pixels', + ), 'PLAY_QUICKTIME_FILE' => 'Play Quicktime file', 'PM' => 'PM', 'PM_REPORTED' => 'Click to view report', diff --git a/phpBB/language/en/posting.php b/phpBB/language/en/posting.php index 01b1b3a9e1..a7dbc1bc80 100644 --- a/phpBB/language/en/posting.php +++ b/phpBB/language/en/posting.php @@ -121,13 +121,25 @@ $lang = array_merge($lang, array( 'LOGIN_EXPLAIN_QUOTE' => 'You need to login in order to quote posts within this forum.', 'LOGIN_EXPLAIN_REPLY' => 'You need to login in order to reply to topics within this forum.', - 'MAX_FONT_SIZE_EXCEEDED' => 'You may only use fonts up to size %1$d.', - 'MAX_FLASH_HEIGHT_EXCEEDED' => 'Your flash files may only be up to %1$d pixels high.', - 'MAX_FLASH_WIDTH_EXCEEDED' => 'Your flash files may only be up to %1$d pixels wide.', - 'MAX_IMG_HEIGHT_EXCEEDED' => 'Your images may only be up to %1$d pixels high.', - 'MAX_IMG_WIDTH_EXCEEDED' => 'Your images may only be up to %1$d pixels wide.', + 'MAX_FONT_SIZE_EXCEEDED' => 'You may only use fonts up to size %d.', + 'MAX_FLASH_HEIGHT_EXCEEDED' => array( + 2 => 'Your flash files may only be up to %d pixels high.', + ), + 'MAX_FLASH_WIDTH_EXCEEDED' => array( + 2 => 'Your flash files may only be up to %d pixels wide.', + ), + 'MAX_IMG_HEIGHT_EXCEEDED' => array( + 2 => 'Your images may only be up to %1$d pixels high.', + ), + 'MAX_IMG_WIDTH_EXCEEDED' => array( + 2 => 'Your images may only be up to %d pixels wide.', + ), - 'MESSAGE_BODY_EXPLAIN' => 'Enter your message here, it may contain no more than %d characters.', + 'MESSAGE_BODY_EXPLAIN' => array( + 0 => '', // zero means no limit, so we don't view a message here. + 1 => 'Enter your message here, it may contain no more than %d character.', + 2 => 'Enter your message here, it may contain no more than %d characters.', + ), 'MESSAGE_DELETED' => 'This message has been deleted successfully.', 'MORE_SMILIES' => 'View more smilies', @@ -202,12 +214,19 @@ $lang = array_merge($lang, array( 'STYLES_TIP' => 'Tip: Styles can be applied quickly to selected text.', 'TOO_FEW_CHARS' => 'Your message contains too few characters.', - 'TOO_FEW_CHARS_LIMIT' => 'Your message contains %1$d characters. The minimum number of characters you need to enter is %2$d.', + 'TOO_FEW_CHARS_LIMIT' => array( + 1 => 'Your message contains %1$d character. The minimum number of characters you need to enter is %2$d.', + 2 => 'Your message contains %1$d characters. The minimum number of characters you need to enter is %2$d.', + ), 'TOO_FEW_POLL_OPTIONS' => 'You must enter at least two poll options.', 'TOO_MANY_ATTACHMENTS' => 'Cannot add another attachment, %d is the maximum.', 'TOO_MANY_CHARS' => 'Your message contains too many characters.', - 'TOO_MANY_CHARS_POST' => 'Your message contains %1$d characters. The maximum number of allowed characters is %2$d.', - 'TOO_MANY_CHARS_SIG' => 'Your signature contains %1$d characters. The maximum number of allowed characters is %2$d.', + 'TOO_MANY_CHARS_POST' => array( + 2 => 'Your message contains %1$d characters. The maximum number of allowed characters is %2$d.', + ), + 'TOO_MANY_CHARS_SIG' => array( + 2 => 'Your signature contains %1$d characters. The maximum number of allowed characters is %2$d.', + ), 'TOO_MANY_POLL_OPTIONS' => 'You have tried to enter too many poll options.', 'TOO_MANY_SMILIES' => 'Your message contains too many smilies. The maximum number of smilies allowed is %d.', 'TOO_MANY_URLS' => 'Your message contains too many URLs. The maximum number of URLs allowed is %d.', @@ -231,5 +250,5 @@ $lang = array_merge($lang, array( 'VIEW_PRIVATE_MESSAGE' => '%sView your submitted private message%s', 'WRONG_FILESIZE' => 'The file is too big, maximum allowed size is %1d %2s.', - 'WRONG_SIZE' => 'The image must be at least %1$d pixels wide, %2$d pixels high and at most %3$d pixels wide and %4$d pixels high. The submitted image is %5$d pixels wide and %6$d pixels high.', + 'WRONG_SIZE' => 'The image must be at least %1$s wide, %2$s high and at most %3$s wide and %4$s high. The submitted image is %5$s wide and %6$s high.', )); diff --git a/phpBB/language/en/search.php b/phpBB/language/en/search.php index 734b65e575..c5b37d897e 100644 --- a/phpBB/language/en/search.php +++ b/phpBB/language/en/search.php @@ -65,7 +65,7 @@ $lang = array_merge($lang, array( 'MAX_NUM_SEARCH_KEYWORDS_REFINE' => 'You specified too many words to search for. Please do not enter more than %1$d words.', - 'NO_KEYWORDS' => 'You must specify at least one word to search for. Each word must consist of at least %d characters and must not contain more than %d characters excluding wildcards.', + 'NO_KEYWORDS' => 'You must specify at least one word to search for. Each word must consist of at least %s and must not contain more than %s excluding wildcards.', 'NO_RECENT_SEARCHES' => 'No searches have been carried out recently.', 'NO_SEARCH' => 'Sorry but you are not permitted to use the search system.', 'NO_SEARCH_RESULTS' => 'No suitable matches were found.', diff --git a/phpBB/language/en/ucp.php b/phpBB/language/en/ucp.php index fb26c2f8e1..0aa97ee81e 100644 --- a/phpBB/language/en/ucp.php +++ b/phpBB/language/en/ucp.php @@ -89,7 +89,7 @@ $lang = array_merge($lang, array( 'ATTACHMENTS_DELETED' => 'Attachments successfully deleted.', 'ATTACHMENT_DELETED' => 'Attachment successfully deleted.', 'AVATAR_CATEGORY' => 'Category', - 'AVATAR_EXPLAIN' => 'Maximum dimensions; width: %1$d pixels, height: %2$d pixels, file size: %3$.2f KiB.', + 'AVATAR_EXPLAIN' => 'Maximum dimensions; width: %1$s, height: %2$s, file size: %3$.2f KiB.', 'AVATAR_FEATURES_DISABLED' => 'The avatar functionality is currently disabled.', 'AVATAR_GALLERY' => 'Local gallery', 'AVATAR_GENERAL_UPLOAD_ERROR' => 'Could not upload avatar to %s.', @@ -188,10 +188,16 @@ $lang = array_merge($lang, array( 'EXPORT_FOLDER' => 'Export this view', 'FIELD_REQUIRED' => 'The field “%s” must be completed.', - 'FIELD_TOO_SHORT' => 'The field “%1$s” is too short, a minimum of %2$d characters is required.', - 'FIELD_TOO_LONG' => 'The field “%1$s” is too long, a maximum of %2$d characters is allowed.', - 'FIELD_TOO_SMALL' => 'The value of “%1$s” is too small, a minimum value of %2$d is required.', - 'FIELD_TOO_LARGE' => 'The value of “%1$s” is too large, a maximum value of %2$d is allowed.', + 'FIELD_TOO_SHORT' => array( + 1 => 'The field “%2$s” is too short, a minimum of %1$d character is required.', + 2 => 'The field “%2$s” is too short, a minimum of %1$d characters is required.', + ), + 'FIELD_TOO_LONG' => array( + 1 => 'The field “%2$s” is too long, a maximum of %1$d character is allowed.', + 2 => 'The field “%2$s” is too long, a maximum of %1$d characters is allowed.', + ), + 'FIELD_TOO_SMALL' => 'The value of “%2$s” is too small, a minimum value of %1$d is required.', + 'FIELD_TOO_LARGE' => 'The value of “%2$s” is too large, a maximum value of %1$d is allowed.', 'FIELD_INVALID_CHARS_NUMBERS_ONLY' => 'The field “%s” has invalid characters, only numbers are allowed.', 'FIELD_INVALID_CHARS_ALPHA_ONLY' => 'The field “%s” has invalid characters, only alphanumeric characters are allowed.', 'FIELD_INVALID_CHARS_SPACERS_ONLY' => 'The field “%s” has invalid characters, only alphanumeric, space or -+_[] characters are allowed.', @@ -273,7 +279,9 @@ $lang = array_merge($lang, array( 'MOVE_DELETED_MESSAGES_TO' => 'Move messages from removed folder to', 'MOVE_DOWN' => 'Move down', 'MOVE_MARKED_TO_FOLDER' => 'Move marked to %s', - 'MOVE_PM_ERROR' => 'An error occurred while moving the messages to the new folder, only %1d from %2d messages were moved.', + 'MOVE_PM_ERROR' => array( + 2 => 'An error occurred while moving the messages to the new folder, only %2d from %1d messages were moved.', + ), 'MOVE_TO_FOLDER' => 'Move to folder', 'MOVE_UP' => 'Move up', diff --git a/phpBB/memberlist.php b/phpBB/memberlist.php index ff22b860ff..2ff56745ef 100644 --- a/phpBB/memberlist.php +++ b/phpBB/memberlist.php @@ -612,8 +612,8 @@ switch ($mode) $template->assign_vars(array( 'L_POSTS_IN_QUEUE' => $user->lang('NUM_POSTS_IN_QUEUE', $member['posts_in_queue']), - 'POSTS_DAY' => sprintf($user->lang['POST_DAY'], $posts_per_day), - 'POSTS_PCT' => sprintf($user->lang['POST_PCT'], $percentage), + 'POSTS_DAY' => $user->lang('POST_DAY', $posts_per_day), + 'POSTS_PCT' => $user->lang('POST_PCT', $percentage), 'OCCUPATION' => (!empty($member['user_occ'])) ? censor_text($member['user_occ']) : '', 'INTERESTS' => (!empty($member['user_interests'])) ? censor_text($member['user_interests']) : '', diff --git a/phpBB/posting.php b/phpBB/posting.php index 4423737b55..eef186c377 100644 --- a/phpBB/posting.php +++ b/phpBB/posting.php @@ -322,7 +322,7 @@ if ($mode == 'bump') $meta_url = phpbb_bump_topic($forum_id, $topic_id, $post_data, $current_time); meta_refresh(3, $meta_url); - $message = $user->lang['TOPIC_BUMPED'] . '

' . sprintf($user->lang['VIEW_MESSAGE'], '', ''); + $message = $user->lang['TOPIC_BUMPED'] . '

' . $user->lang('VIEW_MESSAGE', '', ''); $message .= '

' . sprintf($user->lang['RETURN_FORUM'], '', ''); trigger_error($message); @@ -841,7 +841,7 @@ if ($submit || $preview || $refresh) if (($result = validate_string($post_data['username'], false, $config['min_name_chars'], $config['max_name_chars'])) !== false) { $min_max_amount = ($result == 'TOO_SHORT') ? $config['min_name_chars'] : $config['max_name_chars']; - $error[] = sprintf($user->lang['FIELD_' . $result], $user->lang['USERNAME'], $min_max_amount); + $error[] = $user->lang('FIELD_' . $result, $min_max_amount, $user->lang['USERNAME']); } } @@ -1357,7 +1357,7 @@ add_form_key('posting'); $template->assign_vars(array( 'L_POST_A' => $page_title, 'L_ICON' => ($mode == 'reply' || $mode == 'quote' || ($mode == 'edit' && $post_id != $post_data['topic_first_post_id'])) ? $user->lang['POST_ICON'] : $user->lang['TOPIC_ICON'], - 'L_MESSAGE_BODY_EXPLAIN' => (intval($config['max_post_chars'])) ? sprintf($user->lang['MESSAGE_BODY_EXPLAIN'], intval($config['max_post_chars'])) : '', + 'L_MESSAGE_BODY_EXPLAIN' => $user->lang('MESSAGE_BODY_EXPLAIN', (int) $config['max_post_chars']), 'FORUM_NAME' => $post_data['forum_name'], 'FORUM_DESC' => ($post_data['forum_desc']) ? generate_text_for_display($post_data['forum_desc'], $post_data['forum_desc_uid'], $post_data['forum_desc_bitfield'], $post_data['forum_desc_options']) : '', diff --git a/phpBB/search.php b/phpBB/search.php index 6626cd5672..4089397b6e 100644 --- a/phpBB/search.php +++ b/phpBB/search.php @@ -295,7 +295,7 @@ if ($keywords || $author || $author_id || $search_id || $submit) if (!$correct_query || (empty($search->search_query) && !sizeof($author_id_ary) && !$search_id)) { $ignored = (sizeof($search->common_words)) ? sprintf($user->lang['IGNORED_TERMS_EXPLAIN'], implode(' ', $search->common_words)) . '
' : ''; - trigger_error($ignored . sprintf($user->lang['NO_KEYWORDS'], $search->word_length['min'], $search->word_length['max'])); + trigger_error($ignored . $user->lang('NO_KEYWORDS', $user->lang('CHARACTERS', (int) $search->word_length['min']), $user->lang('CHARACTERS', (int) $search->word_length['max']))); } } From 2de7153afd428f44d1c4c012ffe0bf072e449c64 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Tue, 20 Sep 2011 01:39:21 +0200 Subject: [PATCH 06/21] [ticket/10345] Allow float as array key and add some tests Added tests for the fallback when a key is missing and the float-feature. PHPBB3-10345 --- phpBB/includes/session.php | 6 ++++-- tests/user/lang_test.php | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) 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'); From 4c2c842a7dc2a4ce01eae23790af305c73de79fa Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Tue, 20 Sep 2011 18:21:49 +0200 Subject: [PATCH 07/21] [ticket/10345] Fix some documentation issues. PHPBB3-10345 --- phpBB/includes/session.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/phpBB/includes/session.php b/phpBB/includes/session.php index 3e3c9dc072..efb2059922 100644 --- a/phpBB/includes/session.php +++ b/phpBB/includes/session.php @@ -1822,8 +1822,8 @@ class user extends session * * Example call: $user->lang('NUM_POSTS_IN_QUEUE', 1); * - * If the first parameter is an array, the parts are used as keys and subkeys to get the lang: - * Example: $user->lang(array('datetime', 'AGO'), 1) uses $user->lang['datetime']['AGO'] as lang. + * If the first parameter is an array, the elements are used as keys and subkeys to get the language entry: + * Example: $user->lang(array('datetime', 'AGO'), 1) uses $user->lang['datetime']['AGO'] as language entry. */ function lang() { @@ -1878,8 +1878,7 @@ class user extends session { if ($num > $use_plural_form) { - // This is basically just some lazy backwards compatible stuff. - // If the key we need to use does not exist, it takes the previous one. + // If the key we need to use does not exist, we fall back to the previous one. break; } @@ -1908,6 +1907,7 @@ class user extends session * @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 + * @return int The plural-case we need to use for the number plural-rule combination */ function get_plural_form($number, $force_rule = false) { @@ -1915,7 +1915,7 @@ class user extends session if ($number == 0) { - // We use special language strings for 0, so it's "no users" instead of "0 users" + // We allow each translation using plural forms to specify a version for the case of 0 things, so that "0 users" may be displayed as "No users". return 0; } From 814220f1c13ecac42f9d9aceb4489d5db282b2ac Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Tue, 20 Sep 2011 23:06:43 +0200 Subject: [PATCH 08/21] [ticket/10345] Add tests for array() as first parameter on call to $user->lang() PHPBB3-10345 --- tests/user/lang_test.php | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/tests/user/lang_test.php b/tests/user/lang_test.php index 971a9475f0..ffc3ea1302 100644 --- a/tests/user/lang_test.php +++ b/tests/user/lang_test.php @@ -34,6 +34,12 @@ class phpbb_user_lang_test extends phpbb_test_case 1 => '1 post', // 1.x 2 => '%1$.1f posts', // 0.x, 2+.x ), + 'dateformat' => array( + 'AGO' => array( + 1 => '%d second', + 2 => '%d seconds', + ), + ), ); // No param @@ -69,11 +75,14 @@ class phpbb_user_lang_test extends phpbb_test_case $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 + // Use sub key, if first paramenter is an array + $this->assertEquals($user->lang(array('dateformat', 'AGO'), 2), '2 seconds'); + + // ticket PHPBB3-9949 - use first int to determinate the plural-form to use $this->assertEquals($user->lang('ARRY', 1, 2), '1 post'); $this->assertEquals($user->lang('ARRY', 1, 's', 2), '1 post'); - // ticket PHPBB3-10345 + // ticket PHPBB3-10345 - different plrual rules, not just 0/1/2+ $user = new user; $user->lang = array( 'PLURAL_RULE' => 13, From c4aa8d8401420f8f36a622dc279587ee07466925 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Tue, 20 Sep 2011 23:29:52 +0200 Subject: [PATCH 09/21] [ticket/10345] Fix some last use cases of sprintf() to use $user->lang() PHPBB3-10345 --- phpBB/includes/acp/acp_users.php | 4 ++-- phpBB/includes/ucp/ucp_profile.php | 4 ++-- phpBB/includes/ucp/ucp_register.php | 4 ++-- phpBB/language/en/ucp.php | 20 ++++++++++---------- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/phpBB/includes/acp/acp_users.php b/phpBB/includes/acp/acp_users.php index 3ae1278396..a41fd3d17a 100644 --- a/phpBB/includes/acp/acp_users.php +++ b/phpBB/includes/acp/acp_users.php @@ -1010,8 +1010,8 @@ class acp_users $db->sql_freeresult($result); $template->assign_vars(array( - 'L_NAME_CHARS_EXPLAIN' => sprintf($user->lang[$config['allow_name_chars'] . '_EXPLAIN'], $config['min_name_chars'], $config['max_name_chars']), - 'L_CHANGE_PASSWORD_EXPLAIN' => sprintf($user->lang[$config['pass_complex'] . '_EXPLAIN'], $config['min_pass_chars'], $config['max_pass_chars']), + 'L_NAME_CHARS_EXPLAIN' => $user->lang($config['allow_name_chars'] . '_EXPLAIN', $user->lang('CHARACTERS', (int) $config['min_name_chars']), $user->lang('CHARACTERS', (int) $config['max_name_chars'])), + 'L_CHANGE_PASSWORD_EXPLAIN' => $user->lang($config['pass_complex'] . '_EXPLAIN', $user->lang('CHARACTERS', (int) $config['min_pass_chars']), $user->lang('CHARACTERS', (int) $config['max_pass_chars'])), 'L_POSTS_IN_QUEUE' => $user->lang('NUM_POSTS_IN_QUEUE', $user_row['posts_in_queue']), 'S_FOUNDER' => ($user->data['user_type'] == USER_FOUNDER) ? true : false, diff --git a/phpBB/includes/ucp/ucp_profile.php b/phpBB/includes/ucp/ucp_profile.php index 4822d7a421..c2082c99f6 100644 --- a/phpBB/includes/ucp/ucp_profile.php +++ b/phpBB/includes/ucp/ucp_profile.php @@ -248,8 +248,8 @@ class ucp_profile 'NEW_PASSWORD' => $data['new_password'], 'CUR_PASSWORD' => '', - 'L_USERNAME_EXPLAIN' => sprintf($user->lang[$config['allow_name_chars'] . '_EXPLAIN'], $config['min_name_chars'], $config['max_name_chars']), - 'L_CHANGE_PASSWORD_EXPLAIN' => sprintf($user->lang[$config['pass_complex'] . '_EXPLAIN'], $config['min_pass_chars'], $config['max_pass_chars']), + 'L_USERNAME_EXPLAIN' => $user->lang($config['allow_name_chars'] . '_EXPLAIN', $user->lang('CHARACTERS', (int) $config['min_name_chars']), $user->lang('CHARACTERS', (int) $config['max_name_chars'])), + 'L_CHANGE_PASSWORD_EXPLAIN' => $user->lang($config['pass_complex'] . '_EXPLAIN', $user->lang('CHARACTERS', (int) $config['min_pass_chars']), $user->lang('CHARACTERS', (int) $config['max_pass_chars'])), 'S_FORCE_PASSWORD' => ($auth->acl_get('u_chgpasswd') && $config['chg_passforce'] && $user->data['user_passchg'] < time() - ($config['chg_passforce'] * 86400)) ? true : false, 'S_CHANGE_USERNAME' => ($config['allow_namechange'] && $auth->acl_get('u_chgname')) ? true : false, diff --git a/phpBB/includes/ucp/ucp_register.php b/phpBB/includes/ucp/ucp_register.php index 20a4626ffa..fe09d0a9fe 100644 --- a/phpBB/includes/ucp/ucp_register.php +++ b/phpBB/includes/ucp/ucp_register.php @@ -475,8 +475,8 @@ class ucp_register 'EMAIL_CONFIRM' => $data['email_confirm'], 'L_REG_COND' => $l_reg_cond, - 'L_USERNAME_EXPLAIN' => sprintf($user->lang[$config['allow_name_chars'] . '_EXPLAIN'], $config['min_name_chars'], $config['max_name_chars']), - 'L_PASSWORD_EXPLAIN' => sprintf($user->lang[$config['pass_complex'] . '_EXPLAIN'], $config['min_pass_chars'], $config['max_pass_chars']), + 'L_USERNAME_EXPLAIN' => $user->lang($config['allow_name_chars'] . '_EXPLAIN', $user->lang('CHARACTERS', (int) $config['min_name_chars']), $user->lang('CHARACTERS', (int) $config['max_name_chars'])), + 'L_PASSWORD_EXPLAIN' => $user->lang($config['pass_complex'] . '_EXPLAIN', $user->lang('CHARACTERS', (int) $config['min_pass_chars']), $user->lang('CHARACTERS', (int) $config['max_pass_chars'])), 'S_LANG_OPTIONS' => language_select($data['lang']), 'S_TZ_OPTIONS' => tz_select($data['tz']), diff --git a/phpBB/language/en/ucp.php b/phpBB/language/en/ucp.php index 0aa97ee81e..e4aa41cbfd 100644 --- a/phpBB/language/en/ucp.php +++ b/phpBB/language/en/ucp.php @@ -352,10 +352,10 @@ $lang = array_merge($lang, array( 'NO_WATCHED_SELECTED' => 'You have not selected any subscribed topics or forums.', 'NO_WATCHED_TOPICS' => 'You are not subscribed to any topics.', - 'PASS_TYPE_ALPHA_EXPLAIN' => 'Password must be between %1$d and %2$d characters long, must contain letters in mixed case and must contain numbers.', - 'PASS_TYPE_ANY_EXPLAIN' => 'Must be between %1$d and %2$d characters.', - 'PASS_TYPE_CASE_EXPLAIN' => 'Password must be between %1$d and %2$d characters long and must contain letters in mixed case.', - 'PASS_TYPE_SYMBOL_EXPLAIN' => 'Password must be between %1$d and %2$d characters long, must contain letters in mixed case, must contain numbers and must contain symbols.', + 'PASS_TYPE_ALPHA_EXPLAIN' => 'Password must be between %1$s and %2$s long, must contain letters in mixed case and must contain numbers.', + 'PASS_TYPE_ANY_EXPLAIN' => 'Must be between %1$s and %2$s.', + 'PASS_TYPE_CASE_EXPLAIN' => 'Password must be between %1$s and %2$s long and must contain letters in mixed case.', + 'PASS_TYPE_SYMBOL_EXPLAIN' => 'Password must be between %1$s and %2$s long, must contain letters in mixed case, must contain numbers and must contain symbols.', 'PASSWORD' => 'Password', 'PASSWORD_ACTIVATED' => 'Your new password has been activated.', 'PASSWORD_UPDATED' => 'A new password was sent to your registered e-mail address.', @@ -493,12 +493,12 @@ $lang = array_merge($lang, array( 'UPLOAD_AVATAR_FILE' => 'Upload from your machine', 'UPLOAD_AVATAR_URL' => 'Upload from a URL', 'UPLOAD_AVATAR_URL_EXPLAIN' => 'Enter the URL of the location containing the image. The image will be copied to this site.', - 'USERNAME_ALPHA_ONLY_EXPLAIN' => 'Username must be between %1$d and %2$d chars long and use only alphanumeric characters.', - 'USERNAME_ALPHA_SPACERS_EXPLAIN'=> 'Username must be between %1$d and %2$d chars long and use alphanumeric, space or -+_[] characters.', - 'USERNAME_ASCII_EXPLAIN' => 'Username must be between %1$d and %2$d chars long and use only ASCII characters, so no special symbols.', - 'USERNAME_LETTER_NUM_EXPLAIN' => 'Username must be between %1$d and %2$d chars long and use only letter or number characters.', - 'USERNAME_LETTER_NUM_SPACERS_EXPLAIN'=> 'Username must be between %1$d and %2$d chars long and use letter, number, space or -+_[] characters.', - 'USERNAME_CHARS_ANY_EXPLAIN' => 'Length must be between %1$d and %2$d characters.', + 'USERNAME_ALPHA_ONLY_EXPLAIN' => 'Username must be between %1$s and %2$s long and use only alphanumeric characters.', + 'USERNAME_ALPHA_SPACERS_EXPLAIN'=> 'Username must be between %1$s and %2$s long and use alphanumeric, space or -+_[] characters.', + 'USERNAME_ASCII_EXPLAIN' => 'Username must be between %1$s and %2$s long and use only ASCII characters, so no special symbols.', + 'USERNAME_LETTER_NUM_EXPLAIN' => 'Username must be between %1$s and %2$s long and use only letter or number characters.', + 'USERNAME_LETTER_NUM_SPACERS_EXPLAIN'=> 'Username must be between %1$s and %2$s long and use letter, number, space or -+_[] characters.', + 'USERNAME_CHARS_ANY_EXPLAIN' => 'Length must be between %1$s and %2$s.', 'USERNAME_TAKEN_USERNAME' => 'The username you entered is already in use, please select an alternative.', 'USERNAME_DISALLOWED_USERNAME' => 'The username you entered has been disallowed or contains a disallowed word. Please choose a different name.', 'USER_NOT_FOUND_OR_INACTIVE' => 'The usernames you specified could either not be found or are not activated users.', From 7da6826a671cfce61f7d92c2f5b1deafa4865872 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Tue, 20 Sep 2011 23:40:41 +0200 Subject: [PATCH 10/21] [ticket/10345] Remove some unused 0 cases PHPBB3-10345 --- phpBB/language/en/common.php | 6 ------ phpBB/language/en/search.php | 3 --- phpBB/language/en/ucp.php | 3 --- phpBB/language/en/viewforum.php | 1 - phpBB/language/en/viewtopic.php | 3 --- 5 files changed, 16 deletions(-) diff --git a/phpBB/language/en/common.php b/phpBB/language/en/common.php index 1cf371a887..e01578a8ad 100644 --- a/phpBB/language/en/common.php +++ b/phpBB/language/en/common.php @@ -678,19 +678,13 @@ $lang = array_merge($lang, array( ), 'TOTAL_POSTS' => 'Total posts', 'TOTAL_POSTS_COUNT' => array( - 0 => 'Total posts 0', - 1 => 'Total posts %d', 2 => 'Total posts %d', ), 'TOPIC_REPORTED' => 'This topic has been reported', 'TOTAL_TOPICS' => array( - 0 => 'Total topics 0', - 1 => 'Total topics %d', 2 => 'Total topics %d', ), 'TOTAL_USERS' => array( - 0 => 'Total members 0', - 1 => 'Total members %d', 2 => 'Total members %d', ), 'TRACKED_PHP_ERROR' => 'Tracked PHP errors: %s', diff --git a/phpBB/language/en/search.php b/phpBB/language/en/search.php index c5b37d897e..d3801a58be 100644 --- a/phpBB/language/en/search.php +++ b/phpBB/language/en/search.php @@ -42,12 +42,10 @@ $lang = array_merge($lang, array( 'DISPLAY_RESULTS' => 'Display results as', 'FOUND_SEARCH_MATCHES' => array( - 0 => 'Search found %d matches', 1 => 'Search found %d match', 2 => 'Search found %d matches', ), 'FOUND_MORE_SEARCH_MATCHES' => array( - 0 => 'Search found more than %d matches', 1 => 'Search found more than %d match', 2 => 'Search found more than %d matches', ), @@ -108,7 +106,6 @@ $lang = array_merge($lang, array( 'SORT_TIME' => 'Post time', 'TOO_FEW_AUTHOR_CHARS' => array( - 0 => 'You must specify at least %d characters of the authors name.', 1 => 'You must specify at least %d character of the authors name.', 2 => 'You must specify at least %d characters of the authors name.', ), diff --git a/phpBB/language/en/ucp.php b/phpBB/language/en/ucp.php index e4aa41cbfd..3f09ccb826 100644 --- a/phpBB/language/en/ucp.php +++ b/phpBB/language/en/ucp.php @@ -309,7 +309,6 @@ $lang = array_merge($lang, array( 'NOT_AGREE' => 'I do not agree to these terms', 'NOT_ENOUGH_SPACE_FOLDER' => 'The destination folder “%s” seems to be full. The requested action has not been taken.', 'NOT_MOVED_MESSAGES' => array( - 0 => 'You have %d private messages currently on hold because of full folder.', 1 => 'You have %d private message currently on hold because of full folder.', 2 => 'You have %d private messages currently on hold because of full folder.', ), @@ -408,7 +407,6 @@ $lang = array_merge($lang, array( 'RULE_DELETED' => 'Rule successfully removed.', 'RULE_NOT_DEFINED' => 'Rule not correctly specified.', 'RULE_REMOVED_MESSAGES' => array( - 0 => '%d private messages were removed due to private message filters.', 1 => '%d private message was removed due to private message filters.', 2 => '%d private messages were removed due to private message filters.', ), @@ -512,7 +510,6 @@ $lang = array_merge($lang, array( 'VIEW_PM' => 'View message', 'VIEW_PM_INFO' => 'Message details', 'VIEW_PM_MESSAGES' => array( - 0 => '%d messages', 1 => '%d message', 2 => '%d messages', ), diff --git a/phpBB/language/en/viewforum.php b/phpBB/language/en/viewforum.php index d5eea0f4e3..90f40ecdfc 100644 --- a/phpBB/language/en/viewforum.php +++ b/phpBB/language/en/viewforum.php @@ -65,7 +65,6 @@ $lang = array_merge($lang, array( 'VIEW_FORUM' => 'View forum', 'VIEW_FORUM_TOPICS' => array( - 0 => '%d topics', 1 => '%d topic', 2 => '%d topics', ), diff --git a/phpBB/language/en/viewtopic.php b/phpBB/language/en/viewtopic.php index 1e686b69ab..5bfc4907ce 100644 --- a/phpBB/language/en/viewtopic.php +++ b/phpBB/language/en/viewtopic.php @@ -54,7 +54,6 @@ $lang = array_merge($lang, array( 'DOWNLOAD_NOTICE' => 'You do not have the required permissions to view the files attached to this post.', 'EDITED_TIMES_TOTAL' => array( - 0 => 'Last edited by %2$s on %3$s, edited %1$d times in total.', 1 => 'Last edited by %2$s on %3$s, edited %1$d time in total.', 2 => 'Last edited by %2$s on %3$s, edited %1$d times in total.', ) @@ -74,7 +73,6 @@ $lang = array_merge($lang, array( 'MAKE_NORMAL' => 'Change to “Standard Topic”', 'MAKE_STICKY' => 'Change to “Sticky”', 'MAX_OPTIONS_SELECT' => array( - 0 => 'You may select up to %d options', 1 => 'You may select %d option', 2 => 'You may select up to %d options', ), @@ -112,7 +110,6 @@ $lang = array_merge($lang, array( 'VIEW_PREVIOUS_TOPIC' => 'Previous topic', 'VIEW_RESULTS' => 'View results', 'VIEW_TOPIC_POSTS' => array( - 0 => '%d posts', 1 => '%d post', 2 => '%d posts', ), From 33e3bf4f64c3c2734bf97bcb204255cfdab37773 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 21 Sep 2011 00:36:18 +0200 Subject: [PATCH 11/21] [ticket/10345] Make the use of the 0-case optional And correctly determinate the rule otherwise PHPBB3-10345 --- phpBB/includes/session.php | 78 ++++++++++++++++++++------------------ tests/user/lang_test.php | 9 ++++- 2 files changed, 50 insertions(+), 37 deletions(-) diff --git a/phpBB/includes/session.php b/phpBB/includes/session.php index efb2059922..c78d0f819a 100644 --- a/phpBB/includes/session.php +++ b/phpBB/includes/session.php @@ -1871,20 +1871,30 @@ class user extends session { if (is_int($args[$i]) || is_float($args[$i])) { - $use_plural_form = $this->get_plural_form($args[$i]); - $numbers = array_keys($lang); - - foreach ($numbers as $num) + if ($args[$i] == 0 && isset($lang[0])) { - if ($num > $use_plural_form) - { - // If the key we need to use does not exist, we fall back to the previous one. - break; - } - - $key_found = $num; + // We allow each translation using plural forms to specify a version for the case of 0 things, + // so that "0 users" may be displayed as "No users". + $key_found = 0; + break; + } + else + { + $use_plural_form = $this->get_plural_form($args[$i]); + $numbers = array_keys($lang); + + foreach ($numbers as $num) + { + if ($num > $use_plural_form) + { + // If the key we need to use does not exist, we fall back to the previous one. + break; + } + + $key_found = $num; + } + break; } - break; } } @@ -1913,12 +1923,6 @@ class user extends session { $number = (int) $number; - if ($number == 0) - { - // We allow each translation using plural forms to specify a version for the case of 0 things, so that "0 users" may be displayed as "No users". - return 0; - } - // Default to English system $plural_rule = ($force_rule !== false) ? $force_rule : ((isset($this->lang['PLURAL_RULE'])) ? $this->lang['PLURAL_RULE'] : 1); if ($plural_rule > 15 || $plural_rule < 0) @@ -1935,7 +1939,7 @@ class user extends session case 0: /** * Families: Asian (Chinese, Japanese, Korean, Vietnamese), Persian, Turkic/Altaic (Turkish), Thai, Lao - * 1 - everything: 1, 2, ... + * 1 - everything: 0, 1, 2, ... */ return 1; @@ -1943,25 +1947,26 @@ class user extends session /** * Families: Germanic (Danish, Dutch, English, Faroese, Frisian, German, Norwegian, Swedish), Finno-Ugric (Estonian, Finnish, Hungarian), Language isolate (Basque), Latin/Greek (Greek), Semitic (Hebrew), Romanic (Italian, Portuguese, Spanish, Catalan) * 1 - 1 - * 2 - everything else: 2, 3, ... + * 2 - everything else: 0, 2, 3, ... */ return ($number == 1) ? 1 : 2; case 2: /** * Families: Romanic (French, Brazilian Portuguese) - * 1 - 1 normaly this would also apply to 0 + * 1 - 0, 1 * 2 - everything else: 2, 3, ... */ - return ($number == 1) ? 1 : 2; + return (($number == 0) || ($number == 1)) ? 1 : 2; case 3: /** * Families: Baltic (Latvian) - * 1 - ends in 1, not 11: 1, 21, ... 101, 121, ... - * 2 - everything else: 2, 3, ... 10, 11, 12, ... 20, 22, ... + * 1 - 0 + * 2 - ends in 1, not 11: 1, 21, ... 101, 121, ... + * 3 - everything else: 2, 3, ... 10, 11, 12, ... 20, 22, ... */ - return (($number % 10 == 1) && ($number % 100 != 11)) ? 1 : 2; + return ($number == 0) ? 1 : ((($number % 10 == 1) && ($number % 100 != 11)) ? 2 : 3); case 4: /** @@ -1969,7 +1974,7 @@ class user extends session * 1 - is 1 or 11: 1, 11 * 2 - is 2 or 12: 2, 12 * 3 - others between 3 and 19: 3, 4, ... 10, 13, ... 18, 19 - * 4 - everything else: 20, 21, ... + * 4 - everything else: 0, 20, 21, ... */ return ($number == 1 || $number == 11) ? 1 : (($number == 2 || $number == 12) ? 2 : (($number >= 3 && $number <= 19) ? 3 : 4)); @@ -1977,7 +1982,7 @@ class user extends session /** * Families: Romanic (Romanian) * 1 - 1 - * 2 - ends in 01-19: 2, 3, ... 19, 101, 102, ... 119, 201, ... + * 2 - is 0 or ends in 01-19: 0, 2, 3, ... 19, 101, 102, ... 119, 201, ... * 3 - everything else: 20, 21, ... */ return ($number == 1) ? 1 : ((($number == 0) || (($number % 100 > 0) && ($number % 100 < 20))) ? 2 : 3); @@ -1986,7 +1991,7 @@ class user extends session /** * Families: Baltic (Lithuanian) * 1 - ends in 1, not 11: 1, 21, 31, ... 101, 121, ... - * 2 - ends in 0 or ends in 10-20: 10, 11, 12, ... 19, 20, 30, 40, ... + * 2 - ends in 0 or ends in 10-20: 0, 10, 11, 12, ... 19, 20, 30, 40, ... * 3 - everything else: 2, 3, ... 8, 9, 22, 23, ... 29, 32, 33, ... */ return (($number % 10 == 1) && ($number % 100 != 11)) ? 1 : ((($number % 10 < 2) || (($number % 100 >= 10) && ($number % 100 < 20))) ? 2 : 3); @@ -1996,7 +2001,7 @@ class user extends session * Families: Slavic (Croatian, Serbian, Russian, Ukrainian) * 1 - ends in 1, not 11: 1, 21, 31, ... 101, 121, ... * 2 - ends in 2-4, not 12-14: 2, 3, 4, 22, 23, 24, 32, ... - * 3 - everything else: 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 25, 26, ... + * 3 - everything else: 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 25, 26, ... */ return (($number % 10 == 1) && ($number % 100 != 11)) ? 1 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 2 : 3); @@ -2005,7 +2010,7 @@ class user extends session * Families: Slavic (Slovak, Czech) * 1 - 1 * 2 - 2, 3, 4 - * 3 - everything else: 5, 6, 7, ... + * 3 - everything else: 0, 5, 6, 7, ... */ return ($number == 1) ? 1 : ((($number >= 2) && ($number <= 4)) ? 2 : 3); @@ -2014,7 +2019,7 @@ class user extends session * Families: Slavic (Polish) * 1 - 1 * 2 - ends in 2-4, not 12-14: 2, 3, 4, 22, 23, 24, 32, ... 104, 122, ... - * 3 - everything else: 5, 6, ... 11, 12, 13, 14, 15, ... 20, 21, 25, ... + * 3 - everything else: 0, 5, 6, ... 11, 12, 13, 14, 15, ... 20, 21, 25, ... */ return ($number == 1) ? 1 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 12) || ($number % 100 > 14))) ? 2 : 3); @@ -2024,7 +2029,7 @@ class user extends session * 1 - ends in 01: 1, 101, 201, ... * 2 - ends in 02: 2, 102, 202, ... * 3 - ends in 03-04: 3, 4, 103, 104, 203, 204, ... - * 4 - everything else: 5, 6, 7, 8, 9, 10, 11, ... + * 4 - everything else: 0, 5, 6, 7, 8, 9, 10, 11, ... */ return ($number % 100 == 1) ? 1 : (($number % 100 == 2) ? 2 : ((($number % 100 == 3) || ($number % 100 == 4)) ? 3 : 4)); @@ -2047,14 +2052,15 @@ class user extends session * 3 - ends in 03-10: 3, 4, ... 10, 103, 104, ... 110, 203, 204, ... * 4 - ends in 11-99: 11, ... 99, 111, 112, ... * 5 - everything else: 100, 101, 102, 200, 201, 202, ... + * 6 - 0 */ - return ($number == 1) ? 1 : (($number == 2) ? 2 : ((($number % 100 >= 3) && ($number % 100 <= 10)) ? 3 : ((($number % 100 >= 11) && ($number % 100 <= 99)) ? 4 : 5))); + return ($number == 1) ? 1 : (($number == 2) ? 2 : ((($number % 100 >= 3) && ($number % 100 <= 10)) ? 3 : ((($number % 100 >= 11) && ($number % 100 <= 99)) ? 4 : (($number != 0) ? 5 : 6)))); case 13: /** * Families: Semitic (Maltese) * 1 - 1 - * 2 - ends in 01-10: 2, 3, ... 9, 10, 101, 102, ... + * 2 - is 0 or ends in 01-10: 0, 2, 3, ... 9, 10, 101, 102, ... * 3 - ends in 11-19: 11, 12, ... 18, 19, 111, 112, ... * 4 - everything else: 20, 21, ... */ @@ -2065,7 +2071,7 @@ class user extends session * Families: Slavic (Macedonian) * 1 - ends in 1: 1, 11, 21, ... * 2 - ends in 2: 2, 12, 22, ... - * 3 - everything else: 3, 4, ... 10, 13, 14, ... 20, 23, ... + * 3 - everything else: 0, 3, 4, ... 10, 13, 14, ... 20, 23, ... */ return ($number % 10 == 1) ? 1 : (($number % 10 == 2) ? 2 : 3); @@ -2073,7 +2079,7 @@ class user extends session /** * Families: Icelandic * 1 - ends in 1, not 11: 1, 21, 31, ... 101, 121, 131, ... - * 2 - everything else: 2, 3, ... 10, 11, 12, ... 20, 22, ... + * 2 - everything else: 0, 2, 3, ... 10, 11, 12, ... 20, 22, ... */ return (($number % 10 == 1) && ($number % 100 != 11)) ? 1 : 2; } diff --git a/tests/user/lang_test.php b/tests/user/lang_test.php index ffc3ea1302..bf36811f89 100644 --- a/tests/user/lang_test.php +++ b/tests/user/lang_test.php @@ -30,6 +30,10 @@ class phpbb_user_lang_test extends phpbb_test_case 1 => '1 post', // 1 2 => '%d posts', // 0, 2+ ), + 'ARRY_MISSING' => array( + 1 => '%d post', // 1 + //Missing second plural + ), 'ARRY_FLOAT' => array( 1 => '1 post', // 1.x 2 => '%1$.1f posts', // 0.x, 2+.x @@ -65,11 +69,14 @@ 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 + // No 0 key defined $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'); + // Array with missing keys + $this->assertEquals($user->lang('ARRY_MISSING', 2), '2 post'); + // 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'); From 3788326d719ca49868cbb9682ceb3197ce7f6804 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 21 Sep 2011 00:43:25 +0200 Subject: [PATCH 12/21] [ticket/10345] Remove more useless 0-cases PHPBB3-10345 --- phpBB/language/en/acp/posting.php | 1 - phpBB/language/en/common.php | 17 ----------------- phpBB/language/en/mcp.php | 1 - phpBB/language/en/memberlist.php | 1 - phpBB/language/en/posting.php | 3 --- phpBB/language/en/ucp.php | 2 -- 6 files changed, 25 deletions(-) diff --git a/phpBB/language/en/acp/posting.php b/phpBB/language/en/acp/posting.php index 3d920b5340..ab8f57d08b 100644 --- a/phpBB/language/en/acp/posting.php +++ b/phpBB/language/en/acp/posting.php @@ -194,7 +194,6 @@ $lang = array_merge($lang, array( 'SMILIES_WIDTH' => 'Smiley width', 'TOO_MANY_SMILIES' => array( - 0 => 'Limit of %d smilies reached.', 1 => 'Limit of %d smiley reached.', 2 => 'Limit of %d smilies reached.', ), diff --git a/phpBB/language/en/common.php b/phpBB/language/en/common.php index e01578a8ad..b51d34335f 100644 --- a/phpBB/language/en/common.php +++ b/phpBB/language/en/common.php @@ -114,7 +114,6 @@ $lang = array_merge($lang, array( 'BOARD_UNAVAILABLE' => 'Sorry but the board is temporarily unavailable, please try again in a few minutes.', 'BROWSING_FORUM' => 'Users browsing this forum: %1$s', 'BROWSING_FORUM_GUESTS' => array( - 0 => 'Users browsing this forum: %2$s and 0 guests', 1 => 'Users browsing this forum: %2$s and %1$d guest', 2 => 'Users browsing this forum: %2$s and %1$d guests', ), @@ -126,7 +125,6 @@ $lang = array_merge($lang, array( 'CHANGING_PREFERENCES' => 'Changing board preferences', 'CHANGING_PROFILE' => 'Changing profile settings', 'CHARACTERS' => array( - 0 => '%d characters', 1 => '%d character', 2 => '%d characters', ), @@ -253,12 +251,10 @@ $lang = array_merge($lang, array( 'GROUP_ERR_USER_LONG' => 'Group names cannot exceed 60 characters. The specified group name is too long.', 'GUEST' => 'Guest', 'GUEST_USERS_ONLINE' => array( - 0 => 'There are 0 guest users online', 1 => 'There is %d guest user online', 2 => 'There are %d guest users online', ), 'GUEST_USERS_TOTAL' => array( - 0 => '0 guests', 1 => '%d guest', 2 => '%d guests', ), @@ -271,12 +267,10 @@ $lang = array_merge($lang, array( 'G_NEWLY_REGISTERED' => 'Newly registered users', 'HIDDEN_USERS_ONLINE' => array( - 0 => '0 hidden users', 1 => '%d hidden user', 2 => '%d hidden users', ), 'HIDDEN_USERS_TOTAL' => array( - 0 => '0 hidden', 1 => '%d hidden', 2 => '%d hidden', ), @@ -367,7 +361,6 @@ $lang = array_merge($lang, array( 'NEW_MESSAGE' => 'New message', 'NEW_MESSAGES' => 'New messages', 'NEW_PMS' => array( - 0 => '0 new messages', 1 => '%d new message', 2 => '%d new messages', ), @@ -436,13 +429,11 @@ $lang = array_merge($lang, array( 'ONLINE_BUDDIES' => 'Online friends', // "... :: x registered and y hidden" 'ONLINE_USERS_TOTAL' => array( - 0 => 'In total there are 0 users online :: %2$s and %3$s', 1 => 'In total there is %1$d user online :: %2$s and %3$s', 2 => 'In total there are %1$d users online :: %2$s and %3$s', ), // "... :: x registered, y hidden and z guests" 'ONLINE_USERS_TOTAL_GUESTS' => array( - 0 => 'In total there are 0 users online :: %2$s, %3$s and %4$s', 1 => 'In total there is %1$d user online :: %2$s, %3$s and %4$s', 2 => 'In total there are %1$d users online :: %2$s, %3$s and %4$s', ), @@ -453,7 +444,6 @@ $lang = array_merge($lang, array( 'PASSWORD' => 'Password', 'PIXEL' => 'px', 'PIXELS' => array( - 0 => '%d pixels', 1 => '%d pixel', 2 => '%d pixels', ), @@ -506,12 +496,10 @@ $lang = array_merge($lang, array( 'REGISTERED_USERS' => 'Registered users:', // "... and 2 hidden users online" 'REG_USERS_ONLINE' => array( - 0 => 'There are 0 registered users and %2$s online', 1 => 'There is %1$d registered user and %2$s online', 2 => 'There are %1$d registered users and %2$s online', ), 'REG_USERS_TOTAL' => array( - 0 => '0 registered', 1 => '%d registered', 2 => '%d registered', ), @@ -667,12 +655,10 @@ $lang = array_merge($lang, array( 'TOPIC_UNAPPROVED' => 'This topic has not been approved', 'TOTAL_ATTACHMENTS' => 'Attachment(s)', 'TOTAL_LOGS' => array( - 0 => '0 logs', 1 => '%d log', 2 => '%d logs', ), 'TOTAL_PMS' => array( - 0 => '0 private messages in total', 1 => '%d private message in total', 2 => '%d private messages in total', ), @@ -695,7 +681,6 @@ $lang = array_merge($lang, array( 'UNMARK_ALL' => 'Unmark all', 'UNREAD_MESSAGES' => 'Unread messages', 'UNREAD_PMS' => array( - 0 => '0 unread messages', 1 => '%d unread message', 2 => '%d unread messages', ), @@ -717,7 +702,6 @@ $lang = array_merge($lang, array( 'USER_AVATAR' => 'User avatar', 'USER_CANNOT_READ' => 'You cannot read posts in this forum.', 'USER_POSTS' => array( - 0 => '0 Posts', 1 => '%d Post', 2 => '%d Posts', ), @@ -748,7 +732,6 @@ $lang = array_merge($lang, array( 'VIEW_NEWEST_POST' => 'View first unread post', 'VIEW_NOTES' => 'View user notes', 'VIEW_ONLINE_TIMES' => array( - 0 => 'based on users active over the past %d minutes', 1 => 'based on users active over the past %d minute', 2 => 'based on users active over the past %d minutes', ), diff --git a/phpBB/language/en/mcp.php b/phpBB/language/en/mcp.php index 2d351eb9e0..9008f0327a 100644 --- a/phpBB/language/en/mcp.php +++ b/phpBB/language/en/mcp.php @@ -121,7 +121,6 @@ $lang = array_merge($lang, array( 'LATEST_WARNINGS' => 'Latest 5 warnings', 'LEAVE_SHADOW' => 'Leave shadow topic in place', 'LIST_REPORTS' => array( - 0 => '%d reports', 1 => '%d report', 2 => '%d reports', ), diff --git a/phpBB/language/en/memberlist.php b/phpBB/language/en/memberlist.php index 8138b61ae2..9c36fbe4d0 100644 --- a/phpBB/language/en/memberlist.php +++ b/phpBB/language/en/memberlist.php @@ -94,7 +94,6 @@ $lang = array_merge($lang, array( 'LAST_ACTIVE' => 'Last active', 'LESS_THAN' => 'Less than', 'LIST_USERS' => array( - 0 => '0 users', 1 => '%d user', 2 => '%d users', ), diff --git a/phpBB/language/en/posting.php b/phpBB/language/en/posting.php index a7dbc1bc80..0c8824aabf 100644 --- a/phpBB/language/en/posting.php +++ b/phpBB/language/en/posting.php @@ -162,12 +162,10 @@ $lang = array_merge($lang, array( 'POLL_MAX_OPTIONS_EXPLAIN' => 'This is the number of options each user may select when voting.', 'POLL_OPTIONS' => 'Poll options', 'POLL_OPTIONS_EXPLAIN' => array( - 0 => 'Place each option on a new line. You may enter up to %d options.', 1 => 'Place each option on a new line. You may enter %d option.', 2 => 'Place each option on a new line. You may enter up to %d options.', ), 'POLL_OPTIONS_EDIT_EXPLAIN' => array( - 0 => 'Place each option on a new line. You may enter up to %d options. If you remove or add options all previous votes will be reset.', 1 => 'Place each option on a new line. You may enter %d option. If you remove or add options all previous votes will be reset.', 2 => 'Place each option on a new line. You may enter up to %d options. If you remove or add options all previous votes will be reset.', ), @@ -196,7 +194,6 @@ $lang = array_merge($lang, array( 'PROGRESS_BAR' => 'Progress bar', 'QUOTE_DEPTH_EXCEEDED' => array( - 0 => 'You may embed only %d quotes within each other.', 1 => 'You may embed only %d quote within each other.', 2 => 'You may embed only %d quotes within each other.', ), diff --git a/phpBB/language/en/ucp.php b/phpBB/language/en/ucp.php index 3f09ccb826..59e5cb1952 100644 --- a/phpBB/language/en/ucp.php +++ b/phpBB/language/en/ucp.php @@ -209,7 +209,6 @@ $lang = array_merge($lang, array( 'FOES_UPDATED' => 'Your foes list has been updated successfully.', 'FOLDER_ADDED' => 'Folder successfully added.', 'FOLDER_MESSAGE_STATUS' => array( - 0 => '%2$d from %1$d messages stored', 1 => '%2$d from %1$d message stored', 2 => '%2$d from %1$d messages stored', ), @@ -219,7 +218,6 @@ $lang = array_merge($lang, array( 'FOLDER_RENAMED' => 'Folder successfully renamed.', 'FOLDER_REMOVED' => 'Folder successfully removed.', 'FOLDER_STATUS_MSG' => array( - 0 => 'Folder is %3$d%% full (%2$d from %1$d messages stored)', 1 => 'Folder is %3$d%% full (%2$d from %1$d message stored)', 2 => 'Folder is %3$d%% full (%2$d from %1$d messages stored)', ), From 6c69bdb734af377d91c514bb42d473bc2940c177 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Mon, 21 Nov 2011 15:46:08 +0100 Subject: [PATCH 13/21] [ticket/10345] Fix little type in unit test PHPBB3-10345 --- tests/user/lang_test.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/user/lang_test.php b/tests/user/lang_test.php index bf36811f89..36933a84d2 100644 --- a/tests/user/lang_test.php +++ b/tests/user/lang_test.php @@ -89,7 +89,7 @@ class phpbb_user_lang_test extends phpbb_test_case $this->assertEquals($user->lang('ARRY', 1, 2), '1 post'); $this->assertEquals($user->lang('ARRY', 1, 's', 2), '1 post'); - // ticket PHPBB3-10345 - different plrual rules, not just 0/1/2+ + // ticket PHPBB3-10345 - different plural rules, not just 0/1/2+ $user = new user; $user->lang = array( 'PLURAL_RULE' => 13, From 454280c6e83a3bf41dbeae2382bb8d36fc8e55e1 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Tue, 22 Nov 2011 14:10:16 +0100 Subject: [PATCH 14/21] [ticket/10345] Move rule determination code into a new function PHPBB3-10345 --- phpBB/includes/functions.php | 172 +++++++++++++++++++++++++++++++++++ phpBB/includes/session.php | 154 +------------------------------ 2 files changed, 173 insertions(+), 153 deletions(-) diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index a663286f5f..762676309c 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -4181,6 +4181,178 @@ function phpbb_optionset($bit, $set, $data) return $data; } +/** +* Determine which plural form we should use. +* For some languages this is not as simple as for English. +* +* @param $rule int ID of the plural rule we want to use, see http://wiki.phpbb.com/Plural_Rules#Plural_Rules +* @param $number int|float The number we want to get the plural case for +* @return int The plural-case we need to use for the number plural-rule combination +*/ +function phpbb_get_plural_form($rule, $number) +{ + $number = (int) $number; + + if ($rule > 15 || $rule < 0) + { + trigger_error('INVALID_PLURAL_RULE'); + } + + /** + * The following plural rules are based on a list published by the Mozilla Developer Network + * https://developer.mozilla.org/en/Localization_and_Plurals + */ + switch ($rule) + { + case 0: + /** + * Families: Asian (Chinese, Japanese, Korean, Vietnamese), Persian, Turkic/Altaic (Turkish), Thai, Lao + * 1 - everything: 0, 1, 2, ... + */ + return 1; + + case 1: + /** + * Families: Germanic (Danish, Dutch, English, Faroese, Frisian, German, Norwegian, Swedish), Finno-Ugric (Estonian, Finnish, Hungarian), Language isolate (Basque), Latin/Greek (Greek), Semitic (Hebrew), Romanic (Italian, Portuguese, Spanish, Catalan) + * 1 - 1 + * 2 - everything else: 0, 2, 3, ... + */ + return ($number == 1) ? 1 : 2; + + case 2: + /** + * Families: Romanic (French, Brazilian Portuguese) + * 1 - 0, 1 + * 2 - everything else: 2, 3, ... + */ + return (($number == 0) || ($number == 1)) ? 1 : 2; + + case 3: + /** + * Families: Baltic (Latvian) + * 1 - 0 + * 2 - ends in 1, not 11: 1, 21, ... 101, 121, ... + * 3 - everything else: 2, 3, ... 10, 11, 12, ... 20, 22, ... + */ + return ($number == 0) ? 1 : ((($number % 10 == 1) && ($number % 100 != 11)) ? 2 : 3); + + case 4: + /** + * Families: Celtic (Scottish Gaelic) + * 1 - is 1 or 11: 1, 11 + * 2 - is 2 or 12: 2, 12 + * 3 - others between 3 and 19: 3, 4, ... 10, 13, ... 18, 19 + * 4 - everything else: 0, 20, 21, ... + */ + return ($number == 1 || $number == 11) ? 1 : (($number == 2 || $number == 12) ? 2 : (($number >= 3 && $number <= 19) ? 3 : 4)); + + case 5: + /** + * Families: Romanic (Romanian) + * 1 - 1 + * 2 - is 0 or ends in 01-19: 0, 2, 3, ... 19, 101, 102, ... 119, 201, ... + * 3 - everything else: 20, 21, ... + */ + return ($number == 1) ? 1 : ((($number == 0) || (($number % 100 > 0) && ($number % 100 < 20))) ? 2 : 3); + + case 6: + /** + * Families: Baltic (Lithuanian) + * 1 - ends in 1, not 11: 1, 21, 31, ... 101, 121, ... + * 2 - ends in 0 or ends in 10-20: 0, 10, 11, 12, ... 19, 20, 30, 40, ... + * 3 - everything else: 2, 3, ... 8, 9, 22, 23, ... 29, 32, 33, ... + */ + return (($number % 10 == 1) && ($number % 100 != 11)) ? 1 : ((($number % 10 < 2) || (($number % 100 >= 10) && ($number % 100 < 20))) ? 2 : 3); + + case 7: + /** + * Families: Slavic (Croatian, Serbian, Russian, Ukrainian) + * 1 - ends in 1, not 11: 1, 21, 31, ... 101, 121, ... + * 2 - ends in 2-4, not 12-14: 2, 3, 4, 22, 23, 24, 32, ... + * 3 - everything else: 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 25, 26, ... + */ + return (($number % 10 == 1) && ($number % 100 != 11)) ? 1 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 2 : 3); + + case 8: + /** + * Families: Slavic (Slovak, Czech) + * 1 - 1 + * 2 - 2, 3, 4 + * 3 - everything else: 0, 5, 6, 7, ... + */ + return ($number == 1) ? 1 : ((($number >= 2) && ($number <= 4)) ? 2 : 3); + + case 9: + /** + * Families: Slavic (Polish) + * 1 - 1 + * 2 - ends in 2-4, not 12-14: 2, 3, 4, 22, 23, 24, 32, ... 104, 122, ... + * 3 - everything else: 0, 5, 6, ... 11, 12, 13, 14, 15, ... 20, 21, 25, ... + */ + return ($number == 1) ? 1 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 12) || ($number % 100 > 14))) ? 2 : 3); + + case 10: + /** + * Families: Slavic (Slovenian, Sorbian) + * 1 - ends in 01: 1, 101, 201, ... + * 2 - ends in 02: 2, 102, 202, ... + * 3 - ends in 03-04: 3, 4, 103, 104, 203, 204, ... + * 4 - everything else: 0, 5, 6, 7, 8, 9, 10, 11, ... + */ + return ($number % 100 == 1) ? 1 : (($number % 100 == 2) ? 2 : ((($number % 100 == 3) || ($number % 100 == 4)) ? 3 : 4)); + + case 11: + /** + * Families: Celtic (Irish Gaeilge) + * 1 - 1 + * 2 - 2 + * 3 - is 3-6: 3, 4, 5, 6 + * 4 - is 7-10: 7, 8, 9, 10 + * 5 - everything else: 0, 11, 12, ... + */ + return ($number == 1) ? 1 : (($number == 2) ? 2 : (($number >= 3 && $number <= 6) ? 3 : (($number >= 7 && $number <= 10) ? 4 : 5))); + + case 12: + /** + * Families: Semitic (Arabic) + * 1 - 1 + * 2 - 2 + * 3 - ends in 03-10: 3, 4, ... 10, 103, 104, ... 110, 203, 204, ... + * 4 - ends in 11-99: 11, ... 99, 111, 112, ... + * 5 - everything else: 100, 101, 102, 200, 201, 202, ... + * 6 - 0 + */ + return ($number == 1) ? 1 : (($number == 2) ? 2 : ((($number % 100 >= 3) && ($number % 100 <= 10)) ? 3 : ((($number % 100 >= 11) && ($number % 100 <= 99)) ? 4 : (($number != 0) ? 5 : 6)))); + + case 13: + /** + * Families: Semitic (Maltese) + * 1 - 1 + * 2 - is 0 or ends in 01-10: 0, 2, 3, ... 9, 10, 101, 102, ... + * 3 - ends in 11-19: 11, 12, ... 18, 19, 111, 112, ... + * 4 - everything else: 20, 21, ... + */ + return ($number == 1) ? 1 : ((($number == 0) || (($number % 100 > 1) && ($number % 100 < 11))) ? 2 : ((($number % 100 > 10) && ($number % 100 < 20)) ? 3 : 4)); + + case 14: + /** + * Families: Slavic (Macedonian) + * 1 - ends in 1: 1, 11, 21, ... + * 2 - ends in 2: 2, 12, 22, ... + * 3 - everything else: 0, 3, 4, ... 10, 13, 14, ... 20, 23, ... + */ + return ($number % 10 == 1) ? 1 : (($number % 10 == 2) ? 2 : 3); + + case 15: + /** + * Families: Icelandic + * 1 - ends in 1, not 11: 1, 21, 31, ... 101, 121, 131, ... + * 2 - everything else: 0, 2, 3, ... 10, 11, 12, ... 20, 22, ... + */ + return (($number % 10 == 1) && ($number % 100 != 11)) ? 1 : 2; + } +} + /** * Login using http authenticate. * diff --git a/phpBB/includes/session.php b/phpBB/includes/session.php index c78d0f819a..52eecd695e 100644 --- a/phpBB/includes/session.php +++ b/phpBB/includes/session.php @@ -1930,159 +1930,7 @@ class user extends session trigger_error('INVALID_PLURAL_RULE'); } - /** - * The following plural rules are based on a list published by the Mozilla Developer Network - * https://developer.mozilla.org/en/Localization_and_Plurals - */ - switch ($plural_rule) - { - case 0: - /** - * Families: Asian (Chinese, Japanese, Korean, Vietnamese), Persian, Turkic/Altaic (Turkish), Thai, Lao - * 1 - everything: 0, 1, 2, ... - */ - return 1; - - case 1: - /** - * Families: Germanic (Danish, Dutch, English, Faroese, Frisian, German, Norwegian, Swedish), Finno-Ugric (Estonian, Finnish, Hungarian), Language isolate (Basque), Latin/Greek (Greek), Semitic (Hebrew), Romanic (Italian, Portuguese, Spanish, Catalan) - * 1 - 1 - * 2 - everything else: 0, 2, 3, ... - */ - return ($number == 1) ? 1 : 2; - - case 2: - /** - * Families: Romanic (French, Brazilian Portuguese) - * 1 - 0, 1 - * 2 - everything else: 2, 3, ... - */ - return (($number == 0) || ($number == 1)) ? 1 : 2; - - case 3: - /** - * Families: Baltic (Latvian) - * 1 - 0 - * 2 - ends in 1, not 11: 1, 21, ... 101, 121, ... - * 3 - everything else: 2, 3, ... 10, 11, 12, ... 20, 22, ... - */ - return ($number == 0) ? 1 : ((($number % 10 == 1) && ($number % 100 != 11)) ? 2 : 3); - - case 4: - /** - * Families: Celtic (Scottish Gaelic) - * 1 - is 1 or 11: 1, 11 - * 2 - is 2 or 12: 2, 12 - * 3 - others between 3 and 19: 3, 4, ... 10, 13, ... 18, 19 - * 4 - everything else: 0, 20, 21, ... - */ - return ($number == 1 || $number == 11) ? 1 : (($number == 2 || $number == 12) ? 2 : (($number >= 3 && $number <= 19) ? 3 : 4)); - - case 5: - /** - * Families: Romanic (Romanian) - * 1 - 1 - * 2 - is 0 or ends in 01-19: 0, 2, 3, ... 19, 101, 102, ... 119, 201, ... - * 3 - everything else: 20, 21, ... - */ - return ($number == 1) ? 1 : ((($number == 0) || (($number % 100 > 0) && ($number % 100 < 20))) ? 2 : 3); - - case 6: - /** - * Families: Baltic (Lithuanian) - * 1 - ends in 1, not 11: 1, 21, 31, ... 101, 121, ... - * 2 - ends in 0 or ends in 10-20: 0, 10, 11, 12, ... 19, 20, 30, 40, ... - * 3 - everything else: 2, 3, ... 8, 9, 22, 23, ... 29, 32, 33, ... - */ - return (($number % 10 == 1) && ($number % 100 != 11)) ? 1 : ((($number % 10 < 2) || (($number % 100 >= 10) && ($number % 100 < 20))) ? 2 : 3); - - case 7: - /** - * Families: Slavic (Croatian, Serbian, Russian, Ukrainian) - * 1 - ends in 1, not 11: 1, 21, 31, ... 101, 121, ... - * 2 - ends in 2-4, not 12-14: 2, 3, 4, 22, 23, 24, 32, ... - * 3 - everything else: 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 25, 26, ... - */ - return (($number % 10 == 1) && ($number % 100 != 11)) ? 1 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 2 : 3); - - case 8: - /** - * Families: Slavic (Slovak, Czech) - * 1 - 1 - * 2 - 2, 3, 4 - * 3 - everything else: 0, 5, 6, 7, ... - */ - return ($number == 1) ? 1 : ((($number >= 2) && ($number <= 4)) ? 2 : 3); - - case 9: - /** - * Families: Slavic (Polish) - * 1 - 1 - * 2 - ends in 2-4, not 12-14: 2, 3, 4, 22, 23, 24, 32, ... 104, 122, ... - * 3 - everything else: 0, 5, 6, ... 11, 12, 13, 14, 15, ... 20, 21, 25, ... - */ - return ($number == 1) ? 1 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 12) || ($number % 100 > 14))) ? 2 : 3); - - case 10: - /** - * Families: Slavic (Slovenian, Sorbian) - * 1 - ends in 01: 1, 101, 201, ... - * 2 - ends in 02: 2, 102, 202, ... - * 3 - ends in 03-04: 3, 4, 103, 104, 203, 204, ... - * 4 - everything else: 0, 5, 6, 7, 8, 9, 10, 11, ... - */ - return ($number % 100 == 1) ? 1 : (($number % 100 == 2) ? 2 : ((($number % 100 == 3) || ($number % 100 == 4)) ? 3 : 4)); - - case 11: - /** - * Families: Celtic (Irish Gaeilge) - * 1 - 1 - * 2 - 2 - * 3 - is 3-6: 3, 4, 5, 6 - * 4 - is 7-10: 7, 8, 9, 10 - * 5 - everything else: 0, 11, 12, ... - */ - return ($number == 1) ? 1 : (($number == 2) ? 2 : (($number >= 3 && $number <= 6) ? 3 : (($number >= 7 && $number <= 10) ? 4 : 5))); - - case 12: - /** - * Families: Semitic (Arabic) - * 1 - 1 - * 2 - 2 - * 3 - ends in 03-10: 3, 4, ... 10, 103, 104, ... 110, 203, 204, ... - * 4 - ends in 11-99: 11, ... 99, 111, 112, ... - * 5 - everything else: 100, 101, 102, 200, 201, 202, ... - * 6 - 0 - */ - return ($number == 1) ? 1 : (($number == 2) ? 2 : ((($number % 100 >= 3) && ($number % 100 <= 10)) ? 3 : ((($number % 100 >= 11) && ($number % 100 <= 99)) ? 4 : (($number != 0) ? 5 : 6)))); - - case 13: - /** - * Families: Semitic (Maltese) - * 1 - 1 - * 2 - is 0 or ends in 01-10: 0, 2, 3, ... 9, 10, 101, 102, ... - * 3 - ends in 11-19: 11, 12, ... 18, 19, 111, 112, ... - * 4 - everything else: 20, 21, ... - */ - return ($number == 1) ? 1 : ((($number == 0) || (($number % 100 > 1) && ($number % 100 < 11))) ? 2 : ((($number % 100 > 10) && ($number % 100 < 20)) ? 3 : 4)); - - case 14: - /** - * Families: Slavic (Macedonian) - * 1 - ends in 1: 1, 11, 21, ... - * 2 - ends in 2: 2, 12, 22, ... - * 3 - everything else: 0, 3, 4, ... 10, 13, 14, ... 20, 23, ... - */ - return ($number % 10 == 1) ? 1 : (($number % 10 == 2) ? 2 : 3); - - case 15: - /** - * Families: Icelandic - * 1 - ends in 1, not 11: 1, 21, 31, ... 101, 121, 131, ... - * 2 - everything else: 0, 2, 3, ... 10, 11, 12, ... 20, 22, ... - */ - return (($number % 10 == 1) && ($number % 100 != 11)) ? 1 : 2; - } + return phpbb_get_plural_form($plural_rule, $number); } /** From 2fac1d4c2323797dc4ef977cea4dc3fb894f895a Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Sun, 27 Nov 2011 21:41:22 +0100 Subject: [PATCH 15/21] [ticket/10345] Fix parsing error in language/en/viewtopic.php PHPBB3-10345 --- phpBB/language/en/viewtopic.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpBB/language/en/viewtopic.php b/phpBB/language/en/viewtopic.php index 5bfc4907ce..e59b33d0a8 100644 --- a/phpBB/language/en/viewtopic.php +++ b/phpBB/language/en/viewtopic.php @@ -56,7 +56,7 @@ $lang = array_merge($lang, array( 'EDITED_TIMES_TOTAL' => array( 1 => 'Last edited by %2$s on %3$s, edited %1$d time in total.', 2 => 'Last edited by %2$s on %3$s, edited %1$d times in total.', - ) + ), 'EMAIL_TOPIC' => 'E-mail friend', 'ERROR_NO_ATTACHMENT' => 'The selected attachment does not exist anymore.', From 6472a270e0faf39c7dd9b73a8948f19254e0a17e Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Sun, 27 Nov 2011 21:43:07 +0100 Subject: [PATCH 16/21] [ticket/10345] Add cases for 1 pixel height on MAX_FLASH and MAX_IMG sizes PHPBB3-10345 --- phpBB/language/en/posting.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/phpBB/language/en/posting.php b/phpBB/language/en/posting.php index 0c8824aabf..9119b97ebe 100644 --- a/phpBB/language/en/posting.php +++ b/phpBB/language/en/posting.php @@ -123,15 +123,19 @@ $lang = array_merge($lang, array( 'MAX_FONT_SIZE_EXCEEDED' => 'You may only use fonts up to size %d.', 'MAX_FLASH_HEIGHT_EXCEEDED' => array( + 1 => 'Your flash files may only be up to %d pixel high.', 2 => 'Your flash files may only be up to %d pixels high.', ), 'MAX_FLASH_WIDTH_EXCEEDED' => array( + 1 => 'Your flash files may only be up to %d pixel wide.', 2 => 'Your flash files may only be up to %d pixels wide.', ), 'MAX_IMG_HEIGHT_EXCEEDED' => array( + 1 => 'Your images may only be up to %1$d pixel high.', 2 => 'Your images may only be up to %1$d pixels high.', ), 'MAX_IMG_WIDTH_EXCEEDED' => array( + 1 => 'Your images may only be up to %d pixel wide.', 2 => 'Your images may only be up to %d pixels wide.', ), From b790d2e2839850c053b6fecc4f5d767746c47f20 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 30 Nov 2011 21:03:29 +0100 Subject: [PATCH 17/21] [ticket/10345] Add documentation and phpbb_ prefix to the new avatar functions PHPBB3-10345 --- phpBB/includes/acp/acp_groups.php | 6 +++--- phpBB/includes/acp/acp_users.php | 2 +- phpBB/includes/functions_user.php | 24 ++++++++++++++++++------ phpBB/includes/ucp/ucp_groups.php | 6 +++--- phpBB/includes/ucp/ucp_profile.php | 2 +- 5 files changed, 26 insertions(+), 14 deletions(-) diff --git a/phpBB/includes/acp/acp_groups.php b/phpBB/includes/acp/acp_groups.php index ea4d5f35cb..98b0e4dc56 100644 --- a/phpBB/includes/acp/acp_groups.php +++ b/phpBB/includes/acp/acp_groups.php @@ -371,7 +371,7 @@ class acp_groups { if ($data['width'] > $config['avatar_max_width'] || $data['height'] > $config['avatar_max_height']) { - $error[] = avatar_error_wrong_size($data['width'], $data['height']); + $error[] = phpbb_avatar_error_wrong_size($data['width'], $data['height']); } } @@ -381,7 +381,7 @@ class acp_groups { if ($data['width'] < $config['avatar_min_width'] || $data['height'] < $config['avatar_min_height']) { - $error[] = avatar_error_wrong_size($data['width'], $data['height']); + $error[] = phpbb_avatar_error_wrong_size($data['width'], $data['height']); } } } @@ -627,7 +627,7 @@ class acp_groups 'U_BACK' => $u_back, 'U_SWATCH' => append_sid("{$phpbb_admin_path}swatch.$phpEx", 'form=settings&name=group_colour'), 'U_ACTION' => "{$this->u_action}&action=$action&g=$group_id", - 'L_AVATAR_EXPLAIN' => avatar_explanation_string(), + 'L_AVATAR_EXPLAIN' => phpbb_avatar_explanation_string(), )); return; diff --git a/phpBB/includes/acp/acp_users.php b/phpBB/includes/acp/acp_users.php index a41fd3d17a..c1ad28ca14 100644 --- a/phpBB/includes/acp/acp_users.php +++ b/phpBB/includes/acp/acp_users.php @@ -1748,7 +1748,7 @@ class acp_users 'USER_AVATAR_WIDTH' => $user_row['user_avatar_width'], 'USER_AVATAR_HEIGHT' => $user_row['user_avatar_height'], - 'L_AVATAR_EXPLAIN' => avatar_explanation_string() + 'L_AVATAR_EXPLAIN' => phpbb_avatar_explanation_string(), )); break; diff --git a/phpBB/includes/functions_user.php b/phpBB/includes/functions_user.php index e3537fe328..5631928f96 100644 --- a/phpBB/includes/functions_user.php +++ b/phpBB/includes/functions_user.php @@ -2039,7 +2039,7 @@ function avatar_remote($data, &$error) { if ($width > $config['avatar_max_width'] || $height > $config['avatar_max_height']) { - $error[] = avatar_error_wrong_size($width, $height); + $error[] = phpbb_avatar_error_wrong_size($width, $height); return false; } } @@ -2048,7 +2048,7 @@ function avatar_remote($data, &$error) { if ($width < $config['avatar_min_width'] || $height < $config['avatar_min_height']) { - $error[] = avatar_error_wrong_size($width, $height); + $error[] = phpbb_avatar_error_wrong_size($width, $height); return false; } } @@ -2388,7 +2388,7 @@ function avatar_process_user(&$error, $custom_userdata = false, $can_upload = nu { if ($data['width'] > $config['avatar_max_width'] || $data['height'] > $config['avatar_max_height']) { - $error[] = avatar_error_wrong_size($data['width'], $data['height']); + $error[] = phpbb_avatar_error_wrong_size($data['width'], $data['height']); } } @@ -2398,7 +2398,7 @@ function avatar_process_user(&$error, $custom_userdata = false, $can_upload = nu { if ($data['width'] < $config['avatar_min_width'] || $data['height'] < $config['avatar_min_height']) { - $error[] = avatar_error_wrong_size($data['width'], $data['height']); + $error[] = phpbb_avatar_error_wrong_size($data['width'], $data['height']); } } } @@ -2444,7 +2444,14 @@ function avatar_process_user(&$error, $custom_userdata = false, $can_upload = nu return (sizeof($error)) ? false : true; } -function avatar_error_wrong_size($width, $height) +/** +* Returns a language string with the avatar size of the new avatar and the allowed maximum and minimum +* +* @param $width int The width of the new uploaded/selected avatar +* @param $height int The height of the new uploaded/selected avatar +* @return string +*/ +function phpbb_avatar_error_wrong_size($width, $height) { global $config, $user; @@ -2457,7 +2464,12 @@ function avatar_error_wrong_size($width, $height) $user->lang('PIXELS', (int) $height)); } -function avatar_explanation_string() +/** +* Returns an explanation string with maximum avatar settings +* +* @return string +*/ +function phpbb_avatar_explanation_string() { global $config, $user; diff --git a/phpBB/includes/ucp/ucp_groups.php b/phpBB/includes/ucp/ucp_groups.php index e3e4e8ce22..f2e2e616b7 100644 --- a/phpBB/includes/ucp/ucp_groups.php +++ b/phpBB/includes/ucp/ucp_groups.php @@ -561,7 +561,7 @@ class ucp_groups { if ($data['width'] > $config['avatar_max_width'] || $data['height'] > $config['avatar_max_height']) { - $error[] = avatar_error_wrong_size($data['width'], $data['height']); + $error[] = phpbb_avatar_error_wrong_size($data['width'], $data['height']); } } @@ -571,7 +571,7 @@ class ucp_groups { if ($data['width'] < $config['avatar_min_width'] || $data['height'] < $config['avatar_min_height']) { - $error[] = avatar_error_wrong_size($data['width'], $data['height']); + $error[] = phpbb_avatar_error_wrong_size($data['width'], $data['height']); } } } @@ -732,7 +732,7 @@ class ucp_groups 'U_SWATCH' => append_sid("{$phpbb_root_path}adm/swatch.$phpEx", 'form=ucp&name=group_colour'), 'S_UCP_ACTION' => $this->u_action . "&action=$action&g=$group_id", - 'L_AVATAR_EXPLAIN' => avatar_explanation_string(), + 'L_AVATAR_EXPLAIN' => phpbb_avatar_explanation_string(), )); break; diff --git a/phpBB/includes/ucp/ucp_profile.php b/phpBB/includes/ucp/ucp_profile.php index c2082c99f6..6eb11e6e59 100644 --- a/phpBB/includes/ucp/ucp_profile.php +++ b/phpBB/includes/ucp/ucp_profile.php @@ -602,7 +602,7 @@ class ucp_profile 'S_FORM_ENCTYPE' => ($can_upload && ($config['allow_avatar_upload'] || $config['allow_avatar_remote_upload'])) ? ' enctype="multipart/form-data"' : '', - 'L_AVATAR_EXPLAIN' => avatar_explanation_string(), + 'L_AVATAR_EXPLAIN' => phpbb_avatar_explanation_string(), )); if ($config['allow_avatar'] && $display_gallery && $auth->acl_get('u_chgavatar') && $config['allow_avatar_local']) From b195fce0a47932775dfd47159c6f40509318dbaf Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 30 Nov 2011 21:06:04 +0100 Subject: [PATCH 18/21] [ticket/10345] Remove doubled check for valid plural rule PHPBB3-10345 --- phpBB/includes/session.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/phpBB/includes/session.php b/phpBB/includes/session.php index 52eecd695e..eb84cd81fe 100644 --- a/phpBB/includes/session.php +++ b/phpBB/includes/session.php @@ -1925,10 +1925,6 @@ class user extends session // Default to English system $plural_rule = ($force_rule !== false) ? $force_rule : ((isset($this->lang['PLURAL_RULE'])) ? $this->lang['PLURAL_RULE'] : 1); - if ($plural_rule > 15 || $plural_rule < 0) - { - trigger_error('INVALID_PLURAL_RULE'); - } return phpbb_get_plural_form($plural_rule, $number); } From dd99675f7223b0fb659e4146544969e2aa978fa9 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 30 Nov 2011 21:07:53 +0100 Subject: [PATCH 19/21] [ticket/10345] Document behaviour for floating numbers on phpbb_get_plural_form The numbers are floored by casting to int. PHPBB3-10345 --- phpBB/includes/functions.php | 2 +- phpBB/includes/session.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index 762676309c..901caa6f09 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -4186,7 +4186,7 @@ function phpbb_optionset($bit, $set, $data) * For some languages this is not as simple as for English. * * @param $rule int ID of the plural rule we want to use, see http://wiki.phpbb.com/Plural_Rules#Plural_Rules -* @param $number int|float The number we want to get the plural case for +* @param $number int|float The number we want to get the plural case for. Float numbers are floored. * @return int The plural-case we need to use for the number plural-rule combination */ function phpbb_get_plural_form($rule, $number) diff --git a/phpBB/includes/session.php b/phpBB/includes/session.php index eb84cd81fe..808d1a4a7f 100644 --- a/phpBB/includes/session.php +++ b/phpBB/includes/session.php @@ -1914,7 +1914,7 @@ 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|float The number we want to get the plural case for + * @param $number int|float The number we want to get the plural case for. Float numbers are floored. * @param $force_rule mixed False to use the plural rule of the language package * or an integer to force a certain plural rule * @return int The plural-case we need to use for the number plural-rule combination From 65e6ab55302e5d0c30fa86e06a460fed8167b84a Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 30 Nov 2011 21:23:00 +0100 Subject: [PATCH 20/21] [ticket/10345] Return the language key when the key has an empty array PHPBB3-10345 --- phpBB/includes/session.php | 5 +++++ tests/user/lang_test.php | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/phpBB/includes/session.php b/phpBB/includes/session.php index 808d1a4a7f..401cb0d371 100644 --- a/phpBB/includes/session.php +++ b/phpBB/includes/session.php @@ -1862,6 +1862,11 @@ class user extends session $args[0] = $lang; return call_user_func_array('sprintf', $args); } + else if (sizeof($lang) == 0) + { + // If the language entry is an empty array, we just return the language key + return $args[0]; + } // It is an array... now handle different nullar/singular/plural forms $key_found = false; diff --git a/tests/user/lang_test.php b/tests/user/lang_test.php index 36933a84d2..ee1be3c323 100644 --- a/tests/user/lang_test.php +++ b/tests/user/lang_test.php @@ -38,6 +38,8 @@ class phpbb_user_lang_test extends phpbb_test_case 1 => '1 post', // 1.x 2 => '%1$.1f posts', // 0.x, 2+.x ), + 'ARRY_EMPTY' => array( + ), 'dateformat' => array( 'AGO' => array( 1 => '%d second', @@ -69,6 +71,9 @@ 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'); + // Empty array returns the language key + $this->assertEquals($user->lang('ARRY_EMPTY', 123), 'ARRY_EMPTY'); + // No 0 key defined $this->assertEquals($user->lang('ARRY_NO_ZERO', 0), '0 posts'); $this->assertEquals($user->lang('ARRY_NO_ZERO', 1), '1 post'); From c1311faebf01db1cd0f27420af31c326b0270d37 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 30 Nov 2011 21:36:56 +0100 Subject: [PATCH 21/21] [ticket/10345] Check directly whether the key to use exists PHPBB3-10345 --- phpBB/includes/session.php | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/phpBB/includes/session.php b/phpBB/includes/session.php index 401cb0d371..fcbe8aed2c 100644 --- a/phpBB/includes/session.php +++ b/phpBB/includes/session.php @@ -1886,17 +1886,25 @@ class user extends session else { $use_plural_form = $this->get_plural_form($args[$i]); - $numbers = array_keys($lang); - - foreach ($numbers as $num) + if (isset($lang[$use_plural_form])) { - if ($num > $use_plural_form) - { - // If the key we need to use does not exist, we fall back to the previous one. - break; - } + // The key we should use exists, so we use it. + $key_found = $use_plural_form; + } + else + { + // If the key we need to use does not exist, we fall back to the previous one. + $numbers = array_keys($lang); - $key_found = $num; + foreach ($numbers as $num) + { + if ($num > $use_plural_form) + { + break; + } + + $key_found = $num; + } } break; }