From 710d3bba384002c1361e193482f10b48cc1fe83a Mon Sep 17 00:00:00 2001 From: Santhosh Thottingal Date: Sat, 13 Jul 2013 16:41:56 +0530 Subject: [PATCH] Support explicit plural forms at client side l10n Adds support for explicit plural forms like n=form Example: message: There {{plural:$1|is one car|are $1 cars|0=are no cars|12=are a dozen cars}} with $1=12, this gives: There are a dozen cars Includes qunit tests. Bug: 51284 Change-Id: I82b906769ccdd9907d2d8022a689232f496c033e --- .../mediawiki.language/mediawiki.language.js | 24 +++++++++++++++++++ .../resources/mediawiki/mediawiki.test.js | 12 +++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/resources/mediawiki.language/mediawiki.language.js b/resources/mediawiki.language/mediawiki.language.js index 7f729bdc8e..8cf358b8be 100644 --- a/resources/mediawiki.language/mediawiki.language.js +++ b/resources/mediawiki.language/mediawiki.language.js @@ -45,11 +45,35 @@ var language = { */ convertPlural: function ( count, forms ) { var pluralRules, + formCount, + explicitPluralPattern = new RegExp( '\\d+=', 'i' ), + form, + index, + equalsPosition, pluralFormIndex = 0; if ( !forms || forms.length === 0 ) { return ''; } + + // Handle for explicit n= forms + for ( index = 0; index < forms.length; index++ ) { + form = forms[index]; + if ( explicitPluralPattern.test( form ) ) { + equalsPosition = form.indexOf( '=' ); + formCount = parseInt( form.substring( 0, equalsPosition ), 10 ); + if ( formCount === count ) { + return form.substr( equalsPosition + 1 ); + } + forms[index] = undefined; + } + } + + // Remove explicit plural forms from the forms. + forms = $.map( forms, function ( form ) { + return form; + } ); + pluralRules = mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'pluralRules' ); if ( !pluralRules ) { // default fallback. diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.test.js index 73dcf34a14..502b55b7bd 100644 --- a/tests/qunit/suites/resources/mediawiki/mediawiki.test.js +++ b/tests/qunit/suites/resources/mediawiki/mediawiki.test.js @@ -130,7 +130,7 @@ assert.ok( mw.config instanceof mw.Map, 'mw.config instance of mw.Map' ); } ); - QUnit.test( 'mw.message & mw.messages', 83, function ( assert ) { + QUnit.test( 'mw.message & mw.messages', 100, function ( assert ) { var goodbye, hello; // Convenience method for asserting the same result for multiple formats @@ -205,6 +205,16 @@ assertMultipleFormats( ['plural-test-msg', 6], ['text', 'parse', 'escaped'], 'There are 6 results', 'plural get resolved' ); assert.equal( mw.message( 'plural-test-msg', 6 ).plain(), 'There {{PLURAL:6|is|are}} 6 {{PLURAL:6|result|results}}', 'Parameter is substituted but plural is not resolved in plain' ); + assert.ok( mw.messages.set( 'plural-test-msg-explicit', 'There {{plural:$1|is one car|are $1 cars|0=are no cars|12=are a dozen cars}}' ), 'mw.messages.set: Register message with explicit plural forms' ); + assertMultipleFormats( ['plural-test-msg-explicit', 12], ['text', 'parse', 'escaped'], 'There are a dozen cars', 'explicit plural get resolved' ); + + assert.ok( mw.messages.set( 'plural-test-msg-explicit-beginning', 'Basket has {{plural:$1|0=no eggs|12=a dozen eggs|6=half a dozen eggs|one egg|$1 eggs}}' ), 'mw.messages.set: Register message with explicit plural forms' ); + assertMultipleFormats( ['plural-test-msg-explicit-beginning', 1], ['text', 'parse', 'escaped'], 'Basket has one egg', 'explicit plural given at beginning get resolved for singular' ); + assertMultipleFormats( ['plural-test-msg-explicit-beginning', 4], ['text', 'parse', 'escaped'], 'Basket has 4 eggs', 'explicit plural given at beginning get resolved for plural' ); + assertMultipleFormats( ['plural-test-msg-explicit-beginning', 6], ['text', 'parse', 'escaped'], 'Basket has half a dozen eggs', 'explicit plural given at beginning get resolved for 6' ); + assertMultipleFormats( ['plural-test-msg-explicit-beginning', 0], ['text', 'parse', 'escaped'], 'Basket has no eggs', 'explicit plural given at beginning get resolved for 0' ); + + assertMultipleFormats( ['mediawiki-test-pagetriage-del-talk-page-notify-summary'], ['plain', 'text'], mw.messages.get( 'mediawiki-test-pagetriage-del-talk-page-notify-summary' ), 'Double square brackets with no parameters unchanged' ); assertMultipleFormats( ['mediawiki-test-pagetriage-del-talk-page-notify-summary', specialCharactersPageName], ['plain', 'text'], 'Notifying author of deletion nomination for [[' + specialCharactersPageName + ']]', 'Double square brackets with one parameter' ); -- 2.20.1