From bb084a35739e3f3c54c8680f756ebebb90e13f28 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Bartosz=20Dziewo=C5=84ski?= Date: Sat, 27 Oct 2018 22:01:39 +0200 Subject: [PATCH] Support message parameters in JavaScript messages with uselang=qqx Change-Id: I2266ec0770f08e826892a28f52f3201dfd10191d --- .../src/mediawiki.base/mediawiki.base.js | 34 ++++++++++++++++++- .../mediawiki.jqueryMsg.js | 16 ++++++--- .../mediawiki/mediawiki.jqueryMsg.test.js | 6 +++- .../resources/mediawiki/mediawiki.test.js | 3 ++ 4 files changed, 52 insertions(+), 7 deletions(-) diff --git a/resources/src/mediawiki.base/mediawiki.base.js b/resources/src/mediawiki.base/mediawiki.base.js index 8a44dcc686..04ed5d6653 100644 --- a/resources/src/mediawiki.base/mediawiki.base.js +++ b/resources/src/mediawiki.base/mediawiki.base.js @@ -103,7 +103,13 @@ * @return {string} Parsed message */ parser: function () { - return mw.format.apply( null, [ this.map.get( this.key ) ].concat( this.parameters ) ); + var text; + if ( mw.config.get( 'wgUserLanguage' ) === 'qqx' ) { + text = '(' + this.key + '$*)'; + } else { + text = this.map.get( this.key ); + } + return mw.format.apply( null, [ text ].concat( this.parameters ) ); }, /** @@ -217,6 +223,9 @@ * @return {boolean} */ exists: function () { + if ( mw.config.get( 'wgUserLanguage' ) === 'qqx' ) { + return true; + } return this.map.exists( this.key ); } }; @@ -238,6 +247,28 @@ } ); }; + /** + * Replace $* with a list of parameters for &uselang=qqx. + * + * @since 1.33 + * @param {string} formatString Format string + * @param {Array} parameters Values for $N replacements + * @return {string} Transformed format string + */ + mw.transformFormatForQqx = function ( formatString, parameters ) { + var parametersString; + if ( formatString.indexOf( '$*' ) !== -1 ) { + parametersString = ''; + if ( parameters.length ) { + parametersString = ': ' + parameters.map( function ( _, i ) { + return '$' + ( i + 1 ); + } ).join( ', ' ); + } + return formatString.replace( '$*', parametersString ); + } + return formatString; + }; + /** * Format a string. Replace $1, $2 ... $N with positional arguments. * @@ -250,6 +281,7 @@ */ mw.format = function ( formatString ) { var parameters = slice.call( arguments, 1 ); + formatString = mw.transformFormatForQqx( formatString, parameters ); return formatString.replace( /\$(\d+)/g, function ( str, match ) { var index = parseInt( match, 10 ) - 1; return parameters[ index ] !== undefined ? parameters[ index ] : '$' + match; diff --git a/resources/src/mediawiki.jqueryMsg/mediawiki.jqueryMsg.js b/resources/src/mediawiki.jqueryMsg/mediawiki.jqueryMsg.js index ebb469f4b8..3dc09b7d8a 100644 --- a/resources/src/mediawiki.jqueryMsg/mediawiki.jqueryMsg.js +++ b/resources/src/mediawiki.jqueryMsg/mediawiki.jqueryMsg.js @@ -297,7 +297,7 @@ * @return {jQuery} */ parse: function ( key, replacements ) { - var ast = this.getAst( key ); + var ast = this.getAst( key, replacements ); return this.emitter.emit( ast, replacements ); }, @@ -306,16 +306,22 @@ * Note that we pass '⧼' + key + '⧽' back for a missing message here. * * @param {string} key + * @param {Array} replacements Variable replacements for $1, $2... $n * @return {string|Array} string of '⧼key⧽' if message missing, simple string if possible, array of arrays if needs parsing */ - getAst: function ( key ) { + getAst: function ( key, replacements ) { var wikiText; if ( !Object.prototype.hasOwnProperty.call( this.astCache, key ) ) { - wikiText = this.settings.messages.get( key ); - if ( typeof wikiText !== 'string' ) { - wikiText = '⧼' + key + '⧽'; + if ( mw.config.get( 'wgUserLanguage' ) === 'qqx' ) { + wikiText = '(' + key + '$*)'; + } else { + wikiText = this.settings.messages.get( key ); + if ( typeof wikiText !== 'string' ) { + wikiText = '⧼' + key + '⧽'; + } } + wikiText = mw.transformFormatForQqx( wikiText, replacements ); this.astCache[ key ] = this.wikiTextToAst( wikiText ); } return this.astCache[ key ]; diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js index 913022d6e3..1c7d8ee14a 100644 --- a/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js +++ b/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js @@ -1220,7 +1220,7 @@ } ); QUnit.test( 'Integration', function ( assert ) { - var expected, msg; + var expected, msg, $bar; expected = 'Bold!'; mw.messages.set( 'integration-test', '[[Bold]]!' ); @@ -1279,6 +1279,10 @@ 'Link', 'Calling .parse() multiple times does not duplicate link contents' ); + + mw.config.set( 'wgUserLanguage', 'qqx' ); + $bar = $( '' ).text( 'bar' ); + assert.strictEqual( mw.message( 'foo', $bar, 'baz' ).parse(), '(foo: bar, baz)', 'qqx message with parameters' ); } ); QUnit.test( 'setParserDefaults', function ( assert ) { diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.test.js index 0353694c00..425e18e6f5 100644 --- a/tests/qunit/suites/resources/mediawiki/mediawiki.test.js +++ b/tests/qunit/suites/resources/mediawiki/mediawiki.test.js @@ -333,6 +333,9 @@ 'Script escaped when using parse format' ); + mw.config.set( 'wgUserLanguage', 'qqx' ); + assert.strictEqual( mw.message( 'foo' ).plain(), '(foo)', 'qqx message' ); + assert.strictEqual( mw.message( 'foo', 'bar', 'baz' ).plain(), '(foo: bar, baz)', 'qqx message with parameters' ); } ); QUnit.test( 'mw.msg', function ( assert ) { -- 2.20.1