]> scripts.mit.edu Git - autoinstallsdev/mediawiki.git/blobdiff - resources/lib/jquery.i18n/src/jquery.i18n.messagestore.js
MediaWiki 1.30.2
[autoinstallsdev/mediawiki.git] / resources / lib / jquery.i18n / src / jquery.i18n.messagestore.js
diff --git a/resources/lib/jquery.i18n/src/jquery.i18n.messagestore.js b/resources/lib/jquery.i18n/src/jquery.i18n.messagestore.js
new file mode 100644 (file)
index 0000000..759295c
--- /dev/null
@@ -0,0 +1,125 @@
+/**
+ * jQuery Internationalization library - Message Store
+ *
+ * Copyright (C) 2012 Santhosh Thottingal
+ *
+ * jquery.i18n is dual licensed GPLv2 or later and MIT. You don't have to do anything special to
+ * choose one license or the other and you don't have to notify anyone which license you are using.
+ * You are free to use UniversalLanguageSelector in commercial projects as long as the copyright
+ * header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.
+ *
+ * @licence GNU General Public Licence 2.0 or later
+ * @licence MIT License
+ */
+
+( function ( $, window, undefined ) {
+       'use strict';
+
+       var MessageStore = function () {
+               this.messages = {};
+               this.sources = {};
+       };
+
+       /**
+        * See https://github.com/wikimedia/jquery.i18n/wiki/Specification#wiki-Message_File_Loading
+        */
+       MessageStore.prototype = {
+
+               /**
+                * General message loading API This can take a URL string for
+                * the json formatted messages.
+                * <code>load('path/to/all_localizations.json');</code>
+                *
+                * This can also load a localization file for a locale <code>
+                * load( 'path/to/de-messages.json', 'de' );
+                * </code>
+                * A data object containing message key- message translation mappings
+                * can also be passed Eg:
+                * <code>
+                * load( { 'hello' : 'Hello' }, optionalLocale );
+                * </code> If the data argument is
+                * null/undefined/false,
+                * all cached messages for the i18n instance will get reset.
+                *
+                * @param {String|Object} source
+                * @param {String} locale Language tag
+                * @return {jQuery.Promise}
+                */
+               load: function ( source, locale ) {
+                       var key = null,
+                               deferred = null,
+                               deferreds = [],
+                               messageStore = this;
+
+                       if ( typeof source === 'string' ) {
+                               // This is a URL to the messages file.
+                               $.i18n.log( 'Loading messages from: ' + source );
+                               deferred = jsonMessageLoader( source )
+                                       .done( function ( localization ) {
+                                               messageStore.set( locale, localization );
+                                       } );
+
+                               return deferred.promise();
+                       }
+
+                       if ( locale ) {
+                               // source is an key-value pair of messages for given locale
+                               messageStore.set( locale, source );
+
+                               return $.Deferred().resolve();
+                       } else {
+                               // source is a key-value pair of locales and their source
+                               for ( key in source ) {
+                                       if ( Object.prototype.hasOwnProperty.call( source, key ) ) {
+                                               locale = key;
+                                               // No {locale} given, assume data is a group of languages,
+                                               // call this function again for each language.
+                                               deferreds.push( messageStore.load( source[key], locale ) );
+                                       }
+                               }
+                               return $.when.apply( $, deferreds );
+                       }
+
+               },
+
+               /**
+                * Set messages to the given locale.
+                * If locale exists, add messages to the locale.
+                * @param locale
+                * @param messages
+                */
+               set: function ( locale, messages ) {
+                       if ( !this.messages[locale] ) {
+                               this.messages[locale] = messages;
+                       } else {
+                               this.messages[locale] = $.extend( this.messages[locale], messages );
+                       }
+               },
+
+               /**
+                *
+                * @param locale
+                * @param messageKey
+                * @returns {Boolean}
+                */
+               get: function ( locale, messageKey ) {
+                       return this.messages[locale] && this.messages[locale][messageKey];
+               }
+       };
+
+       function jsonMessageLoader( url ) {
+               var deferred = $.Deferred();
+
+               $.getJSON( url )
+                       .done( deferred.resolve )
+                       .fail( function ( jqxhr, settings, exception ) {
+                               $.i18n.log( 'Error in loading messages from ' + url + ' Exception: ' + exception );
+                               // Ignore 404 exception, because we are handling fallabacks explicitly
+                               deferred.resolve();
+                       } );
+
+               return deferred.promise();
+       }
+
+       $.extend( $.i18n.messageStore, new MessageStore() );
+}( jQuery, window ) );