From 616b6176db162b51ff663a03c4a5908774e08883 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Bartosz=20Dziewo=C5=84ski?= Date: Tue, 14 May 2019 07:41:17 +0200 Subject: [PATCH] jqueryMsg: Allow sneaking in non-qqx JavaScript messages in qqx mode In commit bb084a35739e3f3c54c8680f756ebebb90e13f28 I assumed that with uselang=qqx, any messages defined in JavaScript would be just the message key wrapped in parentheses. It turns out that extensions (e.g. VisualEditor) have been sneaking in messages in content language using the system we assumed to only contain messages in user language. This trick stopped working. Detect this and return the real message, if it's defined. Bug: T222944 Change-Id: I3f2a6ceb249402ef76e788c494fd5bdc519faf65 --- resources/src/mediawiki.base/mediawiki.base.js | 9 +++++---- .../src/mediawiki.jqueryMsg/mediawiki.jqueryMsg.js | 13 +++++++------ .../resources/mediawiki/mediawiki.jqueryMsg.test.js | 10 +++++++++- .../suites/resources/mediawiki/mediawiki.test.js | 11 +++++++++-- 4 files changed, 30 insertions(+), 13 deletions(-) diff --git a/resources/src/mediawiki.base/mediawiki.base.js b/resources/src/mediawiki.base/mediawiki.base.js index 9016c7c274..00a74fe468 100644 --- a/resources/src/mediawiki.base/mediawiki.base.js +++ b/resources/src/mediawiki.base/mediawiki.base.js @@ -103,11 +103,12 @@ * @return {string} Parsed message */ parser: function () { - var text; - if ( mw.config.get( 'wgUserLanguage' ) === 'qqx' ) { + var text = this.map.get( this.key ); + if ( + mw.config.get( 'wgUserLanguage' ) === 'qqx' && + ( !text || text === '(' + this.key + ')' ) + ) { text = '(' + this.key + '$*)'; - } else { - text = this.map.get( this.key ); } return mw.format.apply( null, [ text ].concat( this.parameters ) ); }, diff --git a/resources/src/mediawiki.jqueryMsg/mediawiki.jqueryMsg.js b/resources/src/mediawiki.jqueryMsg/mediawiki.jqueryMsg.js index 641661290e..e0c9833a90 100644 --- a/resources/src/mediawiki.jqueryMsg/mediawiki.jqueryMsg.js +++ b/resources/src/mediawiki.jqueryMsg/mediawiki.jqueryMsg.js @@ -317,13 +317,14 @@ mw.jqueryMsg.Parser.prototype = { var wikiText; if ( !Object.prototype.hasOwnProperty.call( this.astCache, key ) ) { - if ( mw.config.get( 'wgUserLanguage' ) === 'qqx' ) { + wikiText = this.settings.messages.get( key ); + if ( + mw.config.get( 'wgUserLanguage' ) === 'qqx' && + ( !wikiText || wikiText === '(' + key + ')' ) + ) { wikiText = '(' + key + '$*)'; - } else { - wikiText = this.settings.messages.get( key ); - if ( typeof wikiText !== 'string' ) { - wikiText = '⧼' + key + '⧽'; - } + } else if ( typeof wikiText !== 'string' ) { + wikiText = '⧼' + key + '⧽'; } wikiText = mw.internalDoTransformFormatForQqx( wikiText, replacements ); this.astCache[ key ] = this.wikiTextToAst( wikiText ); diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js index 1c7d8ee14a..2fcf61ec53 100644 --- a/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js +++ b/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js @@ -1281,8 +1281,16 @@ ); mw.config.set( 'wgUserLanguage', 'qqx' ); + $bar = $( '' ).text( 'bar' ); - assert.strictEqual( mw.message( 'foo', $bar, 'baz' ).parse(), '(foo: bar, baz)', 'qqx message with parameters' ); + mw.messages.set( 'qqx-message', '(qqx-message)' ); + mw.messages.set( 'non-qqx-message', 'hello world' ); + + assert.strictEqual( mw.message( 'missing-message' ).parse(), '(missing-message)', 'qqx message (missing)' ); + assert.strictEqual( mw.message( 'missing-message', $bar, 'baz' ).parse(), '(missing-message: bar, baz)', 'qqx message (missing) with parameters' ); + assert.strictEqual( mw.message( 'qqx-message' ).parse(), '(qqx-message)', 'qqx message (defined)' ); + assert.strictEqual( mw.message( 'qqx-message', $bar, 'baz' ).parse(), '(qqx-message: bar, baz)', 'qqx message (defined) with parameters' ); + assert.strictEqual( mw.message( 'non-qqx-message' ).parse(), 'hello world', 'non-qqx message in qqx mode' ); } ); 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 425e18e6f5..08262b2f28 100644 --- a/tests/qunit/suites/resources/mediawiki/mediawiki.test.js +++ b/tests/qunit/suites/resources/mediawiki/mediawiki.test.js @@ -334,8 +334,15 @@ ); 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' ); + + mw.messages.set( 'qqx-message', '(qqx-message)' ); + mw.messages.set( 'non-qqx-message', 'hello world' ); + + assert.strictEqual( mw.message( 'missing-message' ).plain(), '(missing-message)', 'qqx message (missing)' ); + assert.strictEqual( mw.message( 'missing-message', 'bar', 'baz' ).plain(), '(missing-message: bar, baz)', 'qqx message (missing) with parameters' ); + assert.strictEqual( mw.message( 'qqx-message' ).plain(), '(qqx-message)', 'qqx message (defined)' ); + assert.strictEqual( mw.message( 'qqx-message', 'bar', 'baz' ).plain(), '(qqx-message: bar, baz)', 'qqx message (defined) with parameters' ); + assert.strictEqual( mw.message( 'non-qqx-message' ).plain(), 'hello world', 'non-qqx message in qqx mode' ); } ); QUnit.test( 'mw.msg', function ( assert ) { -- 2.20.1