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

Reply via email to