Add mediawiki.api.messages module to easily retrieve a set of messages
authorFlorian <florian.schmidt.stargatewissen@gmail.com>
Sat, 7 Nov 2015 22:56:06 +0000 (23:56 +0100)
committerTimo Tijhof <krinklemail@gmail.com>
Fri, 27 Nov 2015 14:28:02 +0000 (15:28 +0100)
Bug: T40280
Change-Id: I6e3fc4beb56c3120702ca291adf6e1521a0bc21f

resources/Resources.php
resources/src/mediawiki/api/messages.js [new file with mode: 0644]
tests/qunit/QUnitTestResources.php
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.messages.test.js [new file with mode: 0644]

index 66e373a..0eb5118 100644 (file)
@@ -912,6 +912,12 @@ return array(
                        'mediawiki.api',
                ),
        ),
+       'mediawiki.api.messages' => array(
+               'scripts' => 'resources/src/mediawiki/api/messages.js',
+               'dependencies' => array(
+                       'mediawiki.api',
+               ),
+       ),
        'mediawiki.content.json' => array(
                'position' => 'top',
                'styles' => 'resources/src/mediawiki/mediawiki.content.json.css',
diff --git a/resources/src/mediawiki/api/messages.js b/resources/src/mediawiki/api/messages.js
new file mode 100644 (file)
index 0000000..df21eb2
--- /dev/null
@@ -0,0 +1,55 @@
+/**
+ * Allows to retrieve a specific or a set of
+ * messages to be added to mw.messages and returned
+ * by the Api.
+ *
+ * @class mw.Api.plugin.messages
+ * @since 1.27
+ */
+( function ( mw, $ ) {
+       'use strict';
+
+       $.extend( mw.Api.prototype, {
+               /**
+                * Get a set of messages.
+                *
+                * @param {Array} messages Messages to retrieve
+                * @return {jQuery.Promise}
+                */
+               getMessages: function ( messages ) {
+                       return this.get( {
+                               action: 'query',
+                               meta: 'allmessages',
+                               ammessages: messages,
+                               amlang: mw.config.get( 'wgUserLanguage' ),
+                               formatversion: 2
+                       } ).then( function ( data ) {
+                               var result = {};
+
+                               $.each( data.query.allmessages, function ( i, obj ) {
+                                       if ( !obj.missing ) {
+                                               result[ obj.name ] = obj.content;
+                                       }
+                               } );
+
+                               return result;
+                       } );
+               },
+
+               /**
+                * Loads a set of mesages and add them to mw.messages.
+                *
+                * @param {Array} messages Messages to retrieve
+                * @return {jQuery.Promise}
+                */
+               loadMessages: function ( messages ) {
+                       return this.getMessages( messages ).then( $.proxy( mw.messages, 'set' ) );
+               }
+       } );
+
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.messages
+        */
+
+}( mediaWiki, jQuery ) );
index 1db0eeb..545718a 100644 (file)
@@ -81,6 +81,7 @@ return array(
                        'tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js',
                        'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js',
                        'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.category.test.js',
+                       'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.messages.test.js',
                        'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.options.test.js',
                        'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.parse.test.js',
                        'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.upload.test.js',
@@ -111,6 +112,7 @@ return array(
                        'jquery.textSelection',
                        'mediawiki.api',
                        'mediawiki.api.category',
+                       'mediawiki.api.messages',
                        'mediawiki.api.options',
                        'mediawiki.api.parse',
                        'mediawiki.api.upload',
diff --git a/tests/qunit/suites/resources/mediawiki.api/mediawiki.api.messages.test.js b/tests/qunit/suites/resources/mediawiki.api/mediawiki.api.messages.test.js
new file mode 100644 (file)
index 0000000..5880962
--- /dev/null
@@ -0,0 +1,31 @@
+( function ( mw ) {
+       QUnit.module( 'mediawiki.api.messages', QUnit.newMwEnvironment( {
+               setup: function () {
+                       this.server = this.sandbox.useFakeServer();
+               }
+       } ) );
+
+       QUnit.test( '.getMessages()', function ( assert ) {
+               QUnit.expect( 1 );
+
+               var api = new mw.Api();
+               api.getMessages( [ 'foo', 'baz' ] ).then( function ( messages ) {
+                       assert.deepEqual(
+                               messages,
+                               {
+                                       foo: 'Foo bar',
+                                       baz: 'Baz Quux'
+                               }
+                       );
+               } );
+
+               this.server.respond( /ammessages=foo%7Cbaz/, [
+                       200,
+                       { 'Content-Type': 'application/json' },
+                       '{ "query": { "allmessages": [' +
+                               '{ "name": "foo", "content": "Foo bar" },' +
+                               '{ "name": "baz", "content": "Baz Quux" }' +
+                               '] } }'
+               ] );
+       } );
+}( mediaWiki ) );