Added release notes for 'ContentHandler::runLegacyHooks' removal
[mediawiki.git] / resources / lib / jquery.i18n / src / jquery.i18n.messagestore.js
blob759295ce5545493d508a2848fc2d51b3a42e9011
1 /**
2  * jQuery Internationalization library - Message Store
3  *
4  * Copyright (C) 2012 Santhosh Thottingal
5  *
6  * jquery.i18n is dual licensed GPLv2 or later and MIT. You don't have to do anything special to
7  * choose one license or the other and you don't have to notify anyone which license you are using.
8  * You are free to use UniversalLanguageSelector in commercial projects as long as the copyright
9  * header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.
10  *
11  * @licence GNU General Public Licence 2.0 or later
12  * @licence MIT License
13  */
15 ( function ( $, window, undefined ) {
16         'use strict';
18         var MessageStore = function () {
19                 this.messages = {};
20                 this.sources = {};
21         };
23         /**
24          * See https://github.com/wikimedia/jquery.i18n/wiki/Specification#wiki-Message_File_Loading
25          */
26         MessageStore.prototype = {
28                 /**
29                  * General message loading API This can take a URL string for
30                  * the json formatted messages.
31                  * <code>load('path/to/all_localizations.json');</code>
32                  *
33                  * This can also load a localization file for a locale <code>
34                  * load( 'path/to/de-messages.json', 'de' );
35                  * </code>
36                  * A data object containing message key- message translation mappings
37                  * can also be passed Eg:
38                  * <code>
39                  * load( { 'hello' : 'Hello' }, optionalLocale );
40                  * </code> If the data argument is
41                  * null/undefined/false,
42                  * all cached messages for the i18n instance will get reset.
43                  *
44                  * @param {String|Object} source
45                  * @param {String} locale Language tag
46                  * @return {jQuery.Promise}
47                  */
48                 load: function ( source, locale ) {
49                         var key = null,
50                                 deferred = null,
51                                 deferreds = [],
52                                 messageStore = this;
54                         if ( typeof source === 'string' ) {
55                                 // This is a URL to the messages file.
56                                 $.i18n.log( 'Loading messages from: ' + source );
57                                 deferred = jsonMessageLoader( source )
58                                         .done( function ( localization ) {
59                                                 messageStore.set( locale, localization );
60                                         } );
62                                 return deferred.promise();
63                         }
65                         if ( locale ) {
66                                 // source is an key-value pair of messages for given locale
67                                 messageStore.set( locale, source );
69                                 return $.Deferred().resolve();
70                         } else {
71                                 // source is a key-value pair of locales and their source
72                                 for ( key in source ) {
73                                         if ( Object.prototype.hasOwnProperty.call( source, key ) ) {
74                                                 locale = key;
75                                                 // No {locale} given, assume data is a group of languages,
76                                                 // call this function again for each language.
77                                                 deferreds.push( messageStore.load( source[key], locale ) );
78                                         }
79                                 }
80                                 return $.when.apply( $, deferreds );
81                         }
83                 },
85                 /**
86                  * Set messages to the given locale.
87                  * If locale exists, add messages to the locale.
88                  * @param locale
89                  * @param messages
90                  */
91                 set: function ( locale, messages ) {
92                         if ( !this.messages[locale] ) {
93                                 this.messages[locale] = messages;
94                         } else {
95                                 this.messages[locale] = $.extend( this.messages[locale], messages );
96                         }
97                 },
99                 /**
100                  *
101                  * @param locale
102                  * @param messageKey
103                  * @returns {Boolean}
104                  */
105                 get: function ( locale, messageKey ) {
106                         return this.messages[locale] && this.messages[locale][messageKey];
107                 }
108         };
110         function jsonMessageLoader( url ) {
111                 var deferred = $.Deferred();
113                 $.getJSON( url )
114                         .done( deferred.resolve )
115                         .fail( function ( jqxhr, settings, exception ) {
116                                 $.i18n.log( 'Error in loading messages from ' + url + ' Exception: ' + exception );
117                                 // Ignore 404 exception, because we are handling fallabacks explicitly
118                                 deferred.resolve();
119                         } );
121                 return deferred.promise();
122         }
124         $.extend( $.i18n.messageStore, new MessageStore() );
125 }( jQuery, window ) );