From 6d97bfde475170d2ba75991578e560e211333c79 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Niklas=20Laxstr=C3=B6m?= Date: Sun, 18 Nov 2007 20:15:49 +0000 Subject: [PATCH] * Reworked convertPlural so that it accepts variable number of arguments nicely * Should also fix bug 11991 --- includes/CoreParserFunctions.php | 5 ++-- languages/Language.php | 32 ++++++++++++++++++------- languages/classes/LanguageAr.php | 6 +++-- languages/classes/LanguageBat_smg.php | 13 ++++++---- languages/classes/LanguageBe.php | 15 +++++++----- languages/classes/LanguageBe_tarask.php | 14 ++++++----- languages/classes/LanguageBs.php | 14 ++++++----- languages/classes/LanguageCs.php | 25 +++++++++---------- languages/classes/LanguageCu.php | 15 +++++++----- languages/classes/LanguageDsb.php | 17 +++++++------ languages/classes/LanguageFr.php | 10 +++++--- languages/classes/LanguageHe.php | 11 +++++---- languages/classes/LanguageHr.php | 15 +++++++----- languages/classes/LanguageHsb.php | 17 +++++++------ languages/classes/LanguageHy.php | 12 ++++------ languages/classes/LanguageKsh.php | 16 +++++++------ languages/classes/LanguageLt.php | 12 ++++++---- languages/classes/LanguageLv.php | 7 ++++-- languages/classes/LanguagePt_br.php | 9 ++++--- languages/classes/LanguageRu.php | 18 +++++++------- languages/classes/LanguageSk.php | 7 +++--- languages/classes/LanguageSl.php | 7 +++--- languages/classes/LanguageSr_ec.php | 14 ++++++----- languages/classes/LanguageSr_el.php | 14 ++++++----- languages/classes/LanguageUk.php | 14 ++++++----- 25 files changed, 196 insertions(+), 143 deletions(-) diff --git a/includes/CoreParserFunctions.php b/includes/CoreParserFunctions.php index af4458adf9..2507bda15e 100644 --- a/includes/CoreParserFunctions.php +++ b/includes/CoreParserFunctions.php @@ -92,9 +92,10 @@ class CoreParserFunctions { return $parser->getFunctionLang()->convertGrammar( $word, $case ); } - static function plural( $parser, $text = '', $arg0 = null, $arg1 = null, $arg2 = null, $arg3 = null, $arg4 = null ) { + static function plural( $parser, $text = '') { + $forms = array_slice( func_get_args(), 2); $text = $parser->getFunctionLang()->parseFormattedNumber( $text ); - return $parser->getFunctionLang()->convertPlural( $text, $arg0, $arg1, $arg2, $arg3, $arg4 ); + return $parser->getFunctionLang()->convertPlural( $text, $forms ); } /** diff --git a/languages/Language.php b/languages/Language.php index 0fda0db4d4..76619f4d41 100644 --- a/languages/Language.php +++ b/languages/Language.php @@ -1702,16 +1702,30 @@ class Language { * * Example: {{plural:{{NUMBEROFARTICLES}}|article|articles}} * - * @param integer $count - * @param string $wordform1 - * @param string $wordform2 - * @param string $wordform3 (optional) - * @param string $wordform4 (optional) - * @param string $wordform5 (optional) - * @return string + * @param integer $count Non-localized number + * @param array $forms Different plural forms + * @return string Correct form of plural for $count in this language + */ + function convertPlural( $count, $forms ) { + if ( !count($forms) ) { return ''; } + $forms = $this->preConvertPlural( $forms, 2 ); + + return ( abs($count) == 1 ) ? $forms[0] : $forms[1]; + } + + /** + * Checks that convertPlural was given an array and pads it to requested + * amound of forms by copying the last one. + * + * @param integer $count How many forms should there be at least + * @param array $forms Array of forms given to convertPlural + * @return array Padded array of forms or an exception if not an array */ - function convertPlural( $count, $w1, $w2, $w3, $w4, $w5) { - return ( $count == '1' || $count == '-1' ) ? $w1 : $w2; + protected function preConvertPlural( Array $forms, $count ) { + while ( count($forms) < $count ) { + $forms[] = $forms[count($forms)-1]; + } + return $forms; } /** diff --git a/languages/classes/LanguageAr.php b/languages/classes/LanguageAr.php index 514ff028c6..1b9ae7bff5 100644 --- a/languages/classes/LanguageAr.php +++ b/languages/classes/LanguageAr.php @@ -7,8 +7,10 @@ */ class LanguageAr extends Language { - function convertPlural( $count, $w1, $w2, $w3, $w4, $w5) { - $forms = array($w1, $w2, $w3, $w4, $w5); + function convertPlural( $count, $forms ) { + if ( !count($forms) ) { return ''; } + $forms = $this->preConvertPlural( $forms, 5 ); + if ( $count == 1 ) { $index = 0; } elseif( $count == 2 ) { diff --git a/languages/classes/LanguageBat_smg.php b/languages/classes/LanguageBat_smg.php index 5869d03e1f..fc830cf5a2 100644 --- a/languages/classes/LanguageBat_smg.php +++ b/languages/classes/LanguageBat_smg.php @@ -7,16 +7,19 @@ */ class LanguageBat_smg extends Language { - public function convertPlural( $count, $w1, $w2, $w3, $w4, $w5) { + function convertPlural( $count, $forms ) { + if ( !count($forms) ) { return ''; } + $forms = $this->preConvertPlural( $forms, 4 ); + $count = abs( $count ); if ( $count === 0 || ($count%100 === 0 || ($count%100 >= 10 && $count%100 < 20)) ) { - return $w3; + return $forms[2]; } elseif ( $count%10 === 1 ) { - return $w1; + return $forms[0]; } elseif ( $count%10 === 2 ) { - return $w2; + return $forms[1]; } else { - return $w4; + return $forms[3]; } } diff --git a/languages/classes/LanguageBe.php b/languages/classes/LanguageBe.php index e0665e6899..cc3e4e3774 100644 --- a/languages/classes/LanguageBe.php +++ b/languages/classes/LanguageBe.php @@ -14,17 +14,20 @@ */ class LanguageBe extends Language { - function convertPlural( $count, $wordform1, $wordform2, $wordform3, $w4, $w5) { - $count = str_replace ('.', '', $count); + + function convertPlural( $count, $forms ) { + if ( !count($forms) ) { return ''; } + $forms = $this->preConvertPlural( $forms, 3 ); + if ($count > 10 && floor(($count % 100) / 10) == 1) { - return $wordform3; + return $forms[2]; } else { switch ($count % 10) { - case 1: return $wordform1; + case 1: return $forms[0]; case 2: case 3: - case 4: return $wordform2; - default: return $wordform3; + case 4: return $forms[1]; + default: return $forms[2]; } } } diff --git a/languages/classes/LanguageBe_tarask.php b/languages/classes/LanguageBe_tarask.php index 5e168b7e67..770844045a 100644 --- a/languages/classes/LanguageBe_tarask.php +++ b/languages/classes/LanguageBe_tarask.php @@ -11,17 +11,19 @@ */ class LanguageBe_tarask extends Language { - function convertPlural( $count, $wordform1, $wordform2, $wordform3, $w4, $w5) { - $count = str_replace ('.', '', $count); + function convertPlural( $count, $forms ) { + if ( !count($forms) ) { return ''; } + $forms = $this->preConvertPlural( $forms, 3 ); + if ($count > 10 && floor(($count % 100) / 10) == 1) { - return $wordform3; + return $forms[2]; } else { switch ($count % 10) { - case 1: return $wordform1; + case 1: return $forms[0]; case 2: case 3: - case 4: return $wordform2; - default: return $wordform3; + case 4: return $forms[1]; + default: return $forms[2]; } } } diff --git a/languages/classes/LanguageBs.php b/languages/classes/LanguageBs.php index 119280e690..410c3d6233 100644 --- a/languages/classes/LanguageBs.php +++ b/languages/classes/LanguageBs.php @@ -6,17 +6,19 @@ class LanguageBs extends Language { - function convertPlural( $count, $wordform1, $wordform2, $wordform3, $w4, $w5) { - $count = str_replace ('.', '', $count); + function convertPlural( $count, $forms ) { + if ( !count($forms) ) { return ''; } + $forms = $this->preConvertPlural( $forms, 3 ); + if ($count > 10 && floor(($count % 100) / 10) == 1) { - return $wordform3; + return $forms[2]; } else { switch ($count % 10) { - case 1: return $wordform1; + case 1: return $forms[0]; case 2: case 3: - case 4: return $wordform2; - default: return $wordform3; + case 4: return $forms[1]; + default: return $forms[2]; } } } diff --git a/languages/classes/LanguageCs.php b/languages/classes/LanguageCs.php index 0e4731e1d0..4a52368e73 100644 --- a/languages/classes/LanguageCs.php +++ b/languages/classes/LanguageCs.php @@ -78,20 +78,17 @@ class LanguageCs extends Language { return $word; } - # Plural form transformations, needed for some languages. - # Invoked by {{plural:count|wordform1|wordform2|wordform3}} - function convertPlural( $count, $wordform1, $wordform2, $wordform3, $w4, $w5) { - switch ( $count ) { - case 1: - return $wordform1; + function convertPlural( $count, $forms ) { + if ( !count($forms) ) { return ''; } + $forms = $this->preConvertPlural( $forms, 3 ); - case 2: - case 3: - case 4: - return $wordform2; + switch ( $count ) { + case 1: return $forms[0]; + case 2: + case 3: + case 4: return $forms[1]; + default: return $forms[2]; + } + } - default: - return $wordform3; - }; - } } diff --git a/languages/classes/LanguageCu.php b/languages/classes/LanguageCu.php index 61128f2488..fba895ecbf 100644 --- a/languages/classes/LanguageCu.php +++ b/languages/classes/LanguageCu.php @@ -35,13 +35,16 @@ class LanguageCu extends Language { return $word; } - function convertPlural( $count, $wordform1, $wordform2, $wordform3, $wordform4, $w5) { + function convertPlural( $count, $forms ) { + if ( !count($forms) ) { return ''; } + $forms = $this->preConvertPlural( $forms, 4 ); + switch ($count % 10) { - case 1: return $wordform1; - case 2: return $wordform2; - case 3: return $wordform3; - case 4: return $wordform3; - default: return $wordform4; + case 1: return $forms[0]; + case 2: return $forms[1]; + case 3: + case 4: return $forms[2]; + default: return $forms[3]; } } diff --git a/languages/classes/LanguageDsb.php b/languages/classes/LanguageDsb.php index 3f6cf9d59f..7408217eef 100644 --- a/languages/classes/LanguageDsb.php +++ b/languages/classes/LanguageDsb.php @@ -100,17 +100,16 @@ class LanguageDsb extends Language { return $word; # this will return the original value for 'nominatiw' (nominativ) and all undefined case values } - function convertPlural( $count, $singular, $dual, $plural, $pluralgen, $w5 ) { + function convertPlural( $count, $forms ) { + if ( !count($forms) ) { return ''; } + $forms = $this->preConvertPlural( $forms, 4 ); + switch ( abs( $count ) % 100 ) { - case 1: - return $singular; - case 2: - return $dual; + case 1: return $forms[0]; // singular + case 2: return $forms[1]; // dual case 3: - case 4: - return $plural; - default: - return $pluralgen; + case 4: return $forms[2]; // plural + default: return $forms[3]; // pluralgen } } } diff --git a/languages/classes/LanguageFr.php b/languages/classes/LanguageFr.php index 87d28b2214..dfd8af4b66 100644 --- a/languages/classes/LanguageFr.php +++ b/languages/classes/LanguageFr.php @@ -9,8 +9,12 @@ class LanguageFr extends Language { /** * Use singular form for zero (see bug 7309) */ - function convertPlural( $count, $w1, $w2, $w3, $w4, $w5) { - return $count <= '1' ? $w1 : $w2; - } + function convertPlural( $count, $forms ) { + if ( !count($forms) ) { return ''; } + $forms = $this->preConvertPlural( $forms, 2 ); + + return ($count <= 1) ? $forms[0] : $forms[1]; + } + } diff --git a/languages/classes/LanguageHe.php b/languages/classes/LanguageHe.php index ca760c1a36..1742dcb45e 100644 --- a/languages/classes/LanguageHe.php +++ b/languages/classes/LanguageHe.php @@ -57,13 +57,16 @@ class LanguageHe extends Language { * * @return string of the suited form of word */ - public function convertPlural( $count, $w1, $w2, $w3, $w4, $w5) { + function convertPlural( $count, $forms ) { + if ( !count($forms) ) { return ''; } + $forms = $this->preConvertPlural( $forms, 3 ); + if ( $count == '1' ) { - return $w1; + return $forms[0]; } elseif ( $count == '2' && $w3 ) { - return $w3; + return $forms[2]; } else { - return $w2; + return $forms[1]; } } } diff --git a/languages/classes/LanguageHr.php b/languages/classes/LanguageHr.php index 5a875a71ea..4a64f87971 100644 --- a/languages/classes/LanguageHr.php +++ b/languages/classes/LanguageHr.php @@ -5,17 +5,20 @@ */ class LanguageHr extends Language { - function convertPlural( $count, $wordform1, $wordform2, $wordform3, $w4, $w5) { - $count = str_replace ('.', '', $count); + + function convertPlural( $count, $forms ) { + if ( !count($forms) ) { return ''; } + $forms = $this->preConvertPlural( $forms, 3 ); + if ($count > 10 && floor(($count % 100) / 10) == 1) { - return $wordform3; + return $forms[2]; } else { switch ($count % 10) { - case 1: return $wordform1; + case 1: return $forms[0]; case 2: case 3: - case 4: return $wordform2; - default: return $wordform3; + case 4: return $forms[1]; + default: return $forms[2]; } } } diff --git a/languages/classes/LanguageHsb.php b/languages/classes/LanguageHsb.php index 7cbc17deff..68df96bee4 100644 --- a/languages/classes/LanguageHsb.php +++ b/languages/classes/LanguageHsb.php @@ -100,17 +100,16 @@ class LanguageHsb extends Language { return $word; # this will return the original value for 'nominatiw' (nominativ) and all undefined case values } - function convertPlural( $count, $singular, $dual, $plural, $pluralgen, $w5 ) { + function convertPlural( $count, $forms ) { + if ( !count($forms) ) { return ''; } + $forms = $this->preConvertPlural( $forms, 4 ); + switch ( abs( $count ) % 100 ) { - case 1: - return $singular; - case 2: - return $dual; + case 1: return $forms[0]; // singular + case 2: return $forms[1]; // dual case 3: - case 4: - return $plural; - default: - return $pluralgen; + case 4: return $forms[2]; // plural + default: return $forms[3]; // pluralgen } } } diff --git a/languages/classes/LanguageHy.php b/languages/classes/LanguageHy.php index 236e8ba278..cc3492be34 100644 --- a/languages/classes/LanguageHy.php +++ b/languages/classes/LanguageHy.php @@ -49,13 +49,11 @@ class LanguageHy extends Language { return $word; } - function convertPlural( $count, $wordform1, $wordform2, $w3, $w4, $w5) { - $count = str_replace (' ', '', $count); - if (abs($count) <= 1) { - return $wordform1; - } else { - return $wordform2; - } + function convertPlural( $count, $forms ) { + if ( !count($forms) ) { return ''; } + $forms = $this->preConvertPlural( $forms, 2 ); + + return (abs($count) <= 1) ? $forms[0] : $forms[1]; } /* diff --git a/languages/classes/LanguageKsh.php b/languages/classes/LanguageKsh.php index c53667cfbb..f72046e7a9 100644 --- a/languages/classes/LanguageKsh.php +++ b/languages/classes/LanguageKsh.php @@ -21,14 +21,16 @@ class LanguageKsh extends Language { /** * Handle cases of (1, other, 0) or (1, other) */ - public function convertPlural( $count, $w1, $w2, $w3, $w4, $w5 ) { - $count = str_replace (' ', '', $count); - if ( $count == '1' ) { - return $w1; - } elseif ( $count == '0' && $w3 ) { - return $w3; + function convertPlural( $count, $forms ) { + if ( !count($forms) ) { return ''; } + $forms = $this->preConvertPlural( $forms, 3 ); + + if ( $count == 1 ) { + return $forms[0]; + } elseif ( $count == 0 ) { + return $forms[2]; } else { - return $w2; + return $forms[1]; } } } diff --git a/languages/classes/LanguageLt.php b/languages/classes/LanguageLt.php index f2b29cad81..bbe619d735 100644 --- a/languages/classes/LanguageLt.php +++ b/languages/classes/LanguageLt.php @@ -11,11 +11,13 @@ class LanguageLt extends Language { 2 - trys (3) lapai 3 - penkiolika (15) lapų */ - function convertPlural( $count, $wordform1, $wordform2, $wordform3, $w4, $w5) { - if ($count%10==1 && $count%100!=11) return $wordform1; - if ($count%10>=2 && ($count%100<10 || $count%100>=20)) return $wordform2; - //if third form not specified, then use second form - return empty($wordform3)?$wordform2:$wordform3; + function convertPlural( $count, $forms ) { + if ( !count($forms) ) { return ''; } + $forms = $this->preConvertPlural( $forms, 3 ); + + if ($count%10==1 && $count%100!=11) return $forms[0]; + if ($count%10>=2 && ($count%100<10 || $count%100>=20)) return $forms[1]; + return $forms[2]; } } diff --git a/languages/classes/LanguageLv.php b/languages/classes/LanguageLv.php index 8a46bb9d66..a3f076e832 100644 --- a/languages/classes/LanguageLv.php +++ b/languages/classes/LanguageLv.php @@ -21,8 +21,11 @@ class LanguageLv extends Language { * @param string $wordform3 (not used) * @return string */ - function convertPlural( $count, $wordform1, $wordform2, $wordform3, $w4, $w5 ) { - return ( ( $count % 10 == 1 ) && ( $count % 100 != 11 ) ) ? $wordform1 : $wordform2; + function convertPlural( $count, $forms ) { + if ( !count($forms) ) { return ''; } + $forms = $this->preConvertPlural( $forms, 2 ); + + return ( ( $count % 10 == 1 ) && ( $count % 100 != 11 ) ) ? $forms[0] : $forms[1]; } # Convert from the nominative form of a noun to some other case diff --git a/languages/classes/LanguagePt_br.php b/languages/classes/LanguagePt_br.php index 31574ed8a9..78965ae30f 100644 --- a/languages/classes/LanguagePt_br.php +++ b/languages/classes/LanguagePt_br.php @@ -9,8 +9,11 @@ class LanguagePt_br extends Language { /** * Use singular form for zero (see bug 7309) */ - function convertPlural( $count, $w1, $w2, $w3, $w4, $w5) { - return $count <= '1' ? $w1 : $w2; - } + function convertPlural( $count, $forms ) { + if ( !count($forms) ) { return ''; } + $forms = $this->preConvertPlural( $forms, 2 ); + + return ($count <= 1) ? $forms[0] : $forms[1]; + } } diff --git a/languages/classes/LanguageRu.php b/languages/classes/LanguageRu.php index bb8437e9e3..ddca9ea61c 100644 --- a/languages/classes/LanguageRu.php +++ b/languages/classes/LanguageRu.php @@ -73,21 +73,23 @@ class LanguageRu extends Language { * */ - function convertPlural( $count, $wordform1, $wordform2, $wordform3, $wordform4, $wordform5) { - $count=abs($count); + function convertPlural( $count, $forms ) { + if ( !count($forms) ) { return ''; } + $forms = $this->preConvertPlural( $forms, 3 ); - if ( $wordform4 && $count <> 1 ) - return $wordform4; + $count = abs( $count ); + if ( isset($forms[3]) && $count != 1 ) + return $forms[3]; if ($count > 10 && floor(($count % 100) / 10) == 1) { - return $wordform3; + return $forms[2]; } else { switch ($count % 10) { - case 1: return $wordform1; + case 1: return $forms[0]; case 2: case 3: - case 4: return $wordform2; - default: return $wordform3; + case 4: return $forms[1]; + default: return $forms[2]; } } } diff --git a/languages/classes/LanguageSk.php b/languages/classes/LanguageSk.php index 1b9832cc4b..edbe011cc6 100644 --- a/languages/classes/LanguageSk.php +++ b/languages/classes/LanguageSk.php @@ -76,9 +76,10 @@ class LanguageSk extends Language { return $word; } - function convertPlural( $count, $w1, $w2, $w3, $w4, $w5) { - $count = str_replace ('.', '', $count); - $forms = array( $w1, $w2, $w3); + function convertPlural( $count, $forms ) { + if ( !count($forms) ) { return ''; } + $forms = $this->preConvertPlural( $forms, 3 ); + if ( $count == 1 ) { $index = 0; } elseif ( $count == 2 || $count == 3 || $count == 4 ) { diff --git a/languages/classes/LanguageSl.php b/languages/classes/LanguageSl.php index 2513d6bdc3..9b1e5c2be1 100644 --- a/languages/classes/LanguageSl.php +++ b/languages/classes/LanguageSl.php @@ -71,9 +71,10 @@ class LanguageSl extends Language { return $word; # this will return the original value for 'imenovalnik' (nominativ) and all undefined case values } - function convertPlural( $count, $w1, $w2, $w3, $w4, $w5) { - $count = str_replace ('.', '', $count); - $forms = array( $w1, $w2, $w3, $w4, $w5 ); + function convertPlural( $count, $forms ) { + if ( !count($forms) ) { return ''; } + $forms = $this->preConvertPlural( $forms, 5 ); + if ( $count % 100 == 1 ) { $index = 0; } elseif ( $count % 100 == 2 ) { diff --git a/languages/classes/LanguageSr_ec.php b/languages/classes/LanguageSr_ec.php index 42647ae630..1f9bb7169c 100644 --- a/languages/classes/LanguageSr_ec.php +++ b/languages/classes/LanguageSr_ec.php @@ -8,17 +8,19 @@ #-------------------------------------------------------------------------- class LanguageSr_ec extends Language { - function convertPlural( $count, $wordform1, $wordform2, $wordform3, $w4, $w5) { - $count = str_replace ('.', '', $count); + function convertPlural( $count, $forms ) { + if ( !count($forms) ) { return ''; } + $forms = $this->preConvertPlural( $forms, 3 ); + if ($count > 10 && floor(($count % 100) / 10) == 1) { - return $wordform3; + return $forms[2]; } else { switch ($count % 10) { - case 1: return $wordform1; + case 1: return $forms[0]; case 2: case 3: - case 4: return $wordform2; - default: return $wordform3; + case 4: return $forms[1]; + default: return $forms[2]; } } } diff --git a/languages/classes/LanguageSr_el.php b/languages/classes/LanguageSr_el.php index 66118cc96b..a444e3b72d 100644 --- a/languages/classes/LanguageSr_el.php +++ b/languages/classes/LanguageSr_el.php @@ -8,17 +8,19 @@ #-------------------------------------------------------------------------- class LanguageSr_el extends Language { - function convertPlural( $count, $wordform1, $wordform2, $wordform3, $w4, $w5) { - $count = str_replace ('.', '', $count); + function convertPlural( $count, $forms ) { + if ( !count($forms) ) { return ''; } + $forms = $this->preConvertPlural( $forms, 3 ); + if ($count > 10 && floor(($count % 100) / 10) == 1) { - return $wordform3; + return $forms[2]; } else { switch ($count % 10) { - case 1: return $wordform1; + case 1: return $forms[0]; case 2: case 3: - case 4: return $wordform2; - default: return $wordform3; + case 4: return $forms[1]; + default: return $forms[2]; } } } diff --git a/languages/classes/LanguageUk.php b/languages/classes/LanguageUk.php index d87b7f580c..7d2f58bfbf 100644 --- a/languages/classes/LanguageUk.php +++ b/languages/classes/LanguageUk.php @@ -58,17 +58,19 @@ class LanguageUk extends Language { return $word; } - function convertPlural( $count, $wordform1, $wordform2, $wordform3, $w4, $w5) { - $count = str_replace (' ', '', $count); + function convertPlural( $count, $forms ) { + if ( !count($forms) ) { return ''; } + $forms = $this->preConvertPlural( $forms, 3 ); + if ($count > 10 && floor(($count % 100) / 10) == 1) { - return $wordform3; + return $forms[2]; } else { switch ($count % 10) { - case 1: return $wordform1; + case 1: return $forms[0]; case 2: case 3: - case 4: return $wordform2; - default: return $wordform3; + case 4: return $forms[1]; + default: return $forms[2]; } } } -- 2.20.1