wikimedia/mediawiki-core

View on GitHub
resources/lib/jquery.i18n/src/jquery.i18n.messagestore.js

Summary

Maintainability
A
0 mins
Test Coverage
/*!
 * 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 ( $ ) {
    'use strict';

    var MessageStore = function () {
        this.messages = {};
        this.sources = {};
    };

    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();
    }

    /**
     * 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,
                deferreds = [],
                messageStore = this;

            if ( typeof source === 'string' ) {
                // This is a URL to the messages file.
                $.i18n.log( 'Loading messages from: ' + source );
                return jsonMessageLoader( source )
                    .then( function ( localization ) {
                        return messageStore.load( localization, locale );
                    } );
            }

            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 {string} locale
         * @param {Object} messages
         */
        set: function ( locale, messages ) {
            if ( !this.messages[ locale ] ) {
                this.messages[ locale ] = messages;
            } else {
                this.messages[ locale ] = $.extend( this.messages[ locale ], messages );
            }
        },

        /**
         *
         * @param {string} locale
         * @param {string} messageKey
         * @return {boolean}
         */
        get: function ( locale, messageKey ) {
            return this.messages[ locale ] && this.messages[ locale ][ messageKey ];
        }
    };

    $.extend( $.i18n.messageStore, new MessageStore() );
}( jQuery ) );