MarkAHershberger has submitted this change and it was merged. Change subject: Fixes for plural handling ......................................................................
Fixes for plural handling * A new protected method looks for explicitly defined forms. Every overriden language class is required to use this method. * Make explicit plural forms work for Russian. Russian has overridden convertPlural method, that was not taking care of explicit plural forms. * Plural rules were updated to CLDR 24 for Manx (gv). Bug: 46422 Bug: 47099 Bug: 54514 Change-Id: I46ab3dadc7fe08c1e60bbd81a1ee841e166e9608 --- M RELEASE-NOTES-1.22 M languages/Language.php M languages/classes/LanguageBe_tarask.php D languages/classes/LanguageGv.php M languages/classes/LanguageHr.php M languages/classes/LanguageKsh.php M languages/classes/LanguageRu.php M languages/classes/LanguageSr.php M languages/classes/LanguageSr_ec.php M languages/classes/LanguageSr_el.php M languages/classes/LanguageUk.php M languages/data/plurals-mediawiki.xml M tests/phpunit/languages/LanguageBe_taraskTest.php M tests/phpunit/languages/LanguageGvTest.php M tests/phpunit/languages/LanguageRuTest.php M tests/phpunit/languages/LanguageUkTest.php 16 files changed, 113 insertions(+), 81 deletions(-) Approvals: MarkAHershberger: Looks good to me, approved diff --git a/RELEASE-NOTES-1.22 b/RELEASE-NOTES-1.22 index dad2438..8d93542 100644 --- a/RELEASE-NOTES-1.22 +++ b/RELEASE-NOTES-1.22 @@ -473,6 +473,10 @@ regularly. Below only new and removed languages are listed, as well as changes to languages because of Bugzilla reports. +* (bug 47099) Plural rules were updated to those from CLDR 24 for Manx (gv). +* (bug 54514) Explicit plural forms now work for Russian. +* (bug 46422) Explicit plural forms for languages that use a custom + implementation for Language::convertPlural now work correctly. * Batak Toba (bbc-latn) added. * (bug 46751) Made Buryat (Russia) (буряад) (bxr) fallback to Russian. diff --git a/languages/Language.php b/languages/Language.php index c24dc18..11d9103 100644 --- a/languages/Language.php +++ b/languages/Language.php @@ -3633,17 +3633,10 @@ */ function convertPlural( $count, $forms ) { // Handle explicit n=pluralform cases - foreach ( $forms as $index => $form ) { - if ( preg_match( '/^\d+=/i', $form ) ) { - $pos = strpos( $form, '=' ); - if ( substr( $form, 0, $pos ) === (string)$count ) { - return substr( $form, $pos + 1 ); - } - unset( $forms[$index] ); - } + $forms = $this->handleExplicitPluralForms( $count, $forms ); + if ( is_string( $forms ) ) { + return $forms; } - - $forms = array_values( $forms ); if ( !count( $forms ) ) { return ''; } @@ -3654,6 +3647,34 @@ } /** + * Handles explicit plural forms for Language::convertPlural() + * + * In {{PLURAL:$1|0=nothing|one|many}}, 0=nothing will be returned if $1 equals zero. + * If an explicitly defined plural form matches the $count, then + * string value returned, otherwise array returned for further consideration + * by CLDR rules or overridden convertPlural(). + * + * @since 1.22.1 + * + * @param int $count non-localized number + * @param array $forms different plural forms + * + * @return array|string + */ + protected function handleExplicitPluralForms( $count, array $forms ) { + foreach ( $forms as $index => $form ) { + if ( preg_match( '/\d+=/i', $form ) ) { + $pos = strpos( $form, '=' ); + if ( substr( $form, 0, $pos ) === (string) $count ) { + return substr( $form, $pos + 1 ); + } + unset( $forms[$index] ); + } + } + return array_values( $forms ); + } + + /** * Checks that convertPlural was given an array and pads it to requested * amount of forms by copying the last one. * diff --git a/languages/classes/LanguageBe_tarask.php b/languages/classes/LanguageBe_tarask.php index 6497b50..d3e78fe 100644 --- a/languages/classes/LanguageBe_tarask.php +++ b/languages/classes/LanguageBe_tarask.php @@ -46,6 +46,10 @@ * @return string */ function convertPlural( $count, $forms ) { + $forms = $this->handleExplicitPluralForms( $count, $forms ); + if ( is_string( $forms ) ) { + return $forms; + } if ( !count( $forms ) ) { return ''; } diff --git a/languages/classes/LanguageGv.php b/languages/classes/LanguageGv.php deleted file mode 100644 index ba8a53c..0000000 --- a/languages/classes/LanguageGv.php +++ /dev/null @@ -1,55 +0,0 @@ -<?php -/** - * Manx (Gaelg) specific code. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * http://www.gnu.org/copyleft/gpl.html - * - * @file - * @author Niklas Laxström - * @ingroup Language - */ - -/** - * Manx (Gaelg) - * - * @ingroup Language - */ -class LanguageGv extends Language { - - /** - * @param $count int - * @param $forms array - * @return string - */ - function convertPlural( $count, $forms ) { - if ( !count( $forms ) ) { - return ''; - } - - $forms = $this->preConvertPlural( $forms, 4 ); - - if ( $count > 0 && ( $count % 20 ) === 0 ) { - return $forms[0]; - } else { - switch ( $count % 10 ) { - case 1: return $forms[1]; - case 2: return $forms[2]; - default: return $forms[3]; - } - } - } - -} diff --git a/languages/classes/LanguageHr.php b/languages/classes/LanguageHr.php index 910bc10..0c65ec7 100644 --- a/languages/classes/LanguageHr.php +++ b/languages/classes/LanguageHr.php @@ -34,6 +34,10 @@ * @return string */ function convertPlural( $count, $forms ) { + $forms = $this->handleExplicitPluralForms( $count, $forms ); + if ( is_string( $forms ) ) { + return $forms; + } if ( !count( $forms ) ) { return ''; } diff --git a/languages/classes/LanguageKsh.php b/languages/classes/LanguageKsh.php index 09c5727..d25ce71 100644 --- a/languages/classes/LanguageKsh.php +++ b/languages/classes/LanguageKsh.php @@ -189,6 +189,10 @@ * @return string */ function convertPlural( $count, $forms ) { + $forms = $this->handleExplicitPluralForms( $count, $forms ); + if ( is_string( $forms ) ) { + return $forms; + } if ( !count( $forms ) ) { return ''; } diff --git a/languages/classes/LanguageRu.php b/languages/classes/LanguageRu.php index 11b42cf..243a876 100644 --- a/languages/classes/LanguageRu.php +++ b/languages/classes/LanguageRu.php @@ -122,6 +122,10 @@ * @return string */ function convertPlural( $count, $forms ) { + $forms = $this->handleExplicitPluralForms( $count, $forms ); + if ( is_string( $forms ) ) { + return $forms; + } if ( !count( $forms ) ) { return ''; } diff --git a/languages/classes/LanguageSr.php b/languages/classes/LanguageSr.php index 6f0ff4b..7310e8e 100644 --- a/languages/classes/LanguageSr.php +++ b/languages/classes/LanguageSr.php @@ -246,6 +246,10 @@ * @return string */ function convertPlural( $count, $forms ) { + $forms = $this->handleExplicitPluralForms( $count, $forms ); + if ( is_string( $forms ) ) { + return $forms; + } if ( !count( $forms ) ) { return ''; } diff --git a/languages/classes/LanguageSr_ec.php b/languages/classes/LanguageSr_ec.php index cb9e819..4787856 100644 --- a/languages/classes/LanguageSr_ec.php +++ b/languages/classes/LanguageSr_ec.php @@ -34,6 +34,10 @@ * @return string */ function convertPlural( $count, $forms ) { + $forms = $this->handleExplicitPluralForms( $count, $forms ); + if ( is_string( $forms ) ) { + return $forms; + } if ( !count( $forms ) ) { return ''; } diff --git a/languages/classes/LanguageSr_el.php b/languages/classes/LanguageSr_el.php index 99d1293..3f086df 100644 --- a/languages/classes/LanguageSr_el.php +++ b/languages/classes/LanguageSr_el.php @@ -34,6 +34,10 @@ * @return string */ function convertPlural( $count, $forms ) { + $forms = $this->handleExplicitPluralForms( $count, $forms ); + if ( is_string( $forms ) ) { + return $forms; + } if ( !count( $forms ) ) { return ''; } diff --git a/languages/classes/LanguageUk.php b/languages/classes/LanguageUk.php index 4ad272b..aabe390 100644 --- a/languages/classes/LanguageUk.php +++ b/languages/classes/LanguageUk.php @@ -92,6 +92,10 @@ * @return string */ function convertPlural( $count, $forms ) { + $forms = $this->handleExplicitPluralForms( $count, $forms ); + if ( is_string( $forms ) ) { + return $forms; + } if ( !count( $forms ) ) { return ''; } diff --git a/languages/data/plurals-mediawiki.xml b/languages/data/plurals-mediawiki.xml index 70d45a3..3314793 100644 --- a/languages/data/plurals-mediawiki.xml +++ b/languages/data/plurals-mediawiki.xml @@ -39,5 +39,11 @@ <pluralRule count="two">n mod 10 is 2 and n mod 100 is not 12</pluralRule> <pluralRule count="few">n is 0 or n mod 100 is 0 or n mod 100 in 10..19</pluralRule> </pluralRules> + <!-- Override as per https://bugzilla.wikimedia.org/show_bug.cgi?id=47099, porting from CLDR 24 --> + <pluralRules locales="gv"> + <pluralRule count="one">n mod 10 is 1</pluralRule> + <pluralRule count="two">n mod 10 is 2</pluralRule> + <pluralRule count="few">n mod 100 in 0,20,40,60</pluralRule> + </pluralRules> </plurals> </supplementalData> diff --git a/tests/phpunit/languages/LanguageBe_taraskTest.php b/tests/phpunit/languages/LanguageBe_taraskTest.php index d5822f4..97a17ec 100644 --- a/tests/phpunit/languages/LanguageBe_taraskTest.php +++ b/tests/phpunit/languages/LanguageBe_taraskTest.php @@ -79,12 +79,13 @@ * @covers Language::convertPlural */ public function testPluralTwoForms( $result, $value ) { - $forms = array( 'one', 'other' ); + $forms = array( 'one', 'other', '0=one' ); $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) ); } public static function providePluralTwoForms() { return array( + array( 'one', 0 ), array( 'one', 1 ), array( 'other', 11 ), array( 'other', 91 ), diff --git a/tests/phpunit/languages/LanguageGvTest.php b/tests/phpunit/languages/LanguageGvTest.php index a0def62..fc58022 100644 --- a/tests/phpunit/languages/LanguageGvTest.php +++ b/tests/phpunit/languages/LanguageGvTest.php @@ -1,20 +1,19 @@ <?php /** + * Test for Manx (Gaelg) language + * * @author Santhosh Thottingal - * @copyright Copyright © 2012, Santhosh Thottingal + * @copyright Copyright © 2013, Santhosh Thottingal * @file */ -/** Tests for MediaWiki languages/classes/LanguageGv.php */ class LanguageGvTest extends LanguageClassesTestCase { /** * @dataProvider providePlural * @covers Language::convertPlural */ public function testPlural( $result, $value ) { - // This is not compatible with CLDR plural rules http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#gv - // What does this mean? Is there a hard-coded override for gv somewhere? -Ryan Kaldari 2013-01-28 - $forms = array( 'Form 1', 'Form 2', 'Form 3', 'Form 4' ); + $forms = array( 'one', 'two', 'few', 'other' ); $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) ); } @@ -23,21 +22,23 @@ * @covers Language::getPluralRuleType */ public function testGetPluralRuleType( $result, $value ) { - $this->markTestSkipped( "This test won't work since convertPlural for gv doesn't seem to actually follow our plural rules." ); $this->assertEquals( $result, $this->getLang()->getPluralRuleType( $value ) ); } public static function providePlural() { return array( - array( 'Form 4', 0 ), - array( 'Form 2', 1 ), - array( 'Form 3', 2 ), - array( 'Form 4', 3 ), - array( 'Form 1', 20 ), - array( 'Form 2', 21 ), - array( 'Form 3', 22 ), - array( 'Form 4', 23 ), - array( 'Form 4', 50 ), + array( 'few', 0 ), + array( 'one', 1 ), + array( 'two', 2 ), + array( 'other', 3 ), + array( 'few', 20 ), + array( 'one', 21 ), + array( 'two', 22 ), + array( 'other', 23 ), + array( 'other', 50 ), + array( 'few', 60 ), + array( 'other', 80 ), + array( 'few', 100 ) ); } } diff --git a/tests/phpunit/languages/LanguageRuTest.php b/tests/phpunit/languages/LanguageRuTest.php index e938be7..56f8490 100644 --- a/tests/phpunit/languages/LanguageRuTest.php +++ b/tests/phpunit/languages/LanguageRuTest.php @@ -18,6 +18,17 @@ } /** + * Test explicit plural forms - n=FormN forms + * @covers Language::convertPlural + */ + public function testExplicitPlural() { + $forms = array( 'one', 'few', 'many', 'other', '12=dozen' ); + $this->assertEquals( 'dozen', $this->getLang()->convertPlural( 12, $forms ) ); + $forms = array( 'one', 'few', 'many', '100=hundred', 'other', '12=dozen' ); + $this->assertEquals( 'hundred', $this->getLang()->convertPlural( 100, $forms ) ); + } + + /** * @dataProvider providePlural * @covers Language::getPluralRuleType */ diff --git a/tests/phpunit/languages/LanguageUkTest.php b/tests/phpunit/languages/LanguageUkTest.php index 0783fcf..1d81bc5 100644 --- a/tests/phpunit/languages/LanguageUkTest.php +++ b/tests/phpunit/languages/LanguageUkTest.php @@ -18,6 +18,17 @@ } /** + * Test explicit plural forms - n=FormN forms + * @covers Language::convertPlural + */ + public function testExplicitPlural() { + $forms = array( 'one', 'few', 'many', 'other', '12=dozen' ); + $this->assertEquals( 'dozen', $this->getLang()->convertPlural( 12, $forms ) ); + $forms = array( 'one', 'few', 'many', '100=hundred', 'other', '12=dozen' ); + $this->assertEquals( 'hundred', $this->getLang()->convertPlural( 100, $forms ) ); + } + + /** * @dataProvider providePlural * @covers Language::getPluralRuleType */ -- To view, visit https://gerrit.wikimedia.org/r/102082 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: I46ab3dadc7fe08c1e60bbd81a1ee841e166e9608 Gerrit-PatchSet: 4 Gerrit-Project: mediawiki/core Gerrit-Branch: REL1_22 Gerrit-Owner: Siebrand <siebr...@wikimedia.org> Gerrit-Reviewer: MarkAHershberger <mhershber...@wikimedia.org> Gerrit-Reviewer: Mglaser <gla...@hallowelt.biz> Gerrit-Reviewer: Santhosh <santhosh.thottin...@gmail.com> Gerrit-Reviewer: Wizardist <p.selits...@gmail.com> Gerrit-Reviewer: jenkins-bot _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits