diff --git a/lib/jquery.i18n.js b/lib/jquery.i18n.js index 7bdb5c47..7321f260 100644 --- a/lib/jquery.i18n.js +++ b/lib/jquery.i18n.js @@ -49,7 +49,7 @@ // Override String.localeString method String.prototype.toLocaleString = function () { - var localeParts, messages, localePartIndex, value, locale, fallbackIndex; + var localeParts, messageLocation, localePartIndex, value, locale, fallbackIndex; value = this.valueOf(); locale = i18n.locale; @@ -64,22 +64,25 @@ do { var _locale = localeParts.slice( 0, localePartIndex ).join( "-" ); - if ( !i18n.messageStore.messages[_locale] && i18n.options.messageLocationResolver ) { - messages = i18n.options.messageLocationResolver( _locale, value ); + if ( i18n.options.messageLocationResolver ) { + messageLocation = i18n.options.messageLocationResolver( _locale, value ); - if ( messages ) { - i18n.messageStore.load( messages, _locale ); + if ( messageLocation + && ( !i18n.messageStore.isLoaded(_locale ,messageLocation ) ) ) + { + i18n.messageStore.load( messageLocation, _locale ); } } var message = i18n.messageStore.get( _locale, value ); + if ( message ) { return message; } localePartIndex--; } while (localePartIndex); - if ( locale === "en" ) { + if ( locale === 'en' ) { break; } @@ -294,10 +297,8 @@ messageStore.load( $link.attr( "href" ) ); } else if ( $.inArray( "localization", rel ) !== -1 ) { // single localization - var localization = {}; - localization[ ( $link.attr( "hreflang" ) || "" ).toLowerCase()] = $link - .attr( "href" ); - messageStore.load( localization ); + messageStore.queue( ( $link.attr( "hreflang" ) || "" ) + .toLowerCase(), $link.attr( "href" ) ); } } }, @@ -332,7 +333,7 @@ messageStore.messages = {}; return; } - + /* // Only process this data load if the locale is our current // locale. Otherwise, put in the source queue for later. if ( locale && messageStore.locale !== locale ) { @@ -340,17 +341,16 @@ if ( ! ( locale in messageStore.sources ) ) { messageStore.sources[locale] = []; } - messageStore.log( "Queueing: " + locale + " Current locale " + messageStore.locale ); - messageStore.sources[locale].push( data ); + this.queue( locale, data ); return; - } + }*/ if ( typeof data === 'string' ) { // This is a URL to the messages file. messageStore.log( "Loading messages from: " + data ); messageStore.jsonMessageLoader( data ).done( function ( localization, textStatus ) { messageStore.load( localization, locale ); - delete messageStore.sources[locale]; + messageStore.markLoaded( locale, data ); } ); } else { // Data is either a group of messages for {locale}, @@ -387,6 +387,43 @@ } }, + markLoaded: function ( locale, messageLocation ) { + var i, queue = this.sources[locale]; + + if ( !queue ) { + this.queue( locale, messageLocation ); + queue = this.sources[locale]; + } + this.sources[locale] = this.sources[locale] || []; + for (i = 0; i < queue.length; i++) { + if ( queue[i].source.url === messageLocation ) { + queue[i].source.loaded = true; + return; + } + } + }, + + queue: function ( locale, messageLocation ) { + var i, + queue = this.sources[locale]; + + this.sources[locale] = this.sources[locale] || []; + if ( queue ) { + for (i = 0; i < queue.length; i++) { + if ( queue[i].source.url === messageLocation ) { + return; + } + } + } + this.log( 'Source for: ' + locale + ' : ' + messageLocation + ' registered' ); + this.sources[locale].push( { + source: { + url: messageLocation, + loaded: false + } + } ); + }, + /** * Load the messages from the source queue for the locale * @@ -395,10 +432,29 @@ loadFromQueue: function ( locale ) { var i, queue = this.sources[locale]; - for ( i = 0; i < queue.length; i++ ) { - this.load( queue[i], locale ); + + + if ( queue ) { + for (i = 0; i < queue.length; i++) { + if ( !queue[i].source.loaded ) { + this.load( queue[i].source.url, locale ); + this.sources[locale][i].source.loaded = true; + } + } } - delete this.sources[locale]; + }, + + isLoaded: function ( locale, messageLocation ) { + var i, sources = this.sources[locale], result = false; + + if ( sources ) { + for (i = 0; i < sources.length; i++) { + if ( sources[i].source.url === messageLocation ) { + result = true; + } + } + } + return result; }, jsonMessageLoader: function ( url ) { @@ -421,9 +477,7 @@ */ get: function ( locale, messageKey ) { // load locale if not loaded - if ( this.sources[locale] ) { - // We need to switch to this locale - this.locale = locale; + if ( !this.messages[locale] ) { this.loadFromQueue( locale ); } return this.messages[locale] && this.messages[locale][messageKey]; @@ -1688,7 +1742,8 @@ */ digitTransformTable: function ( language ) { var tables = { - ar: '۰۱۲۳۴۵۶۷۸۹', + ar: '٠١٢٣٤٥٦٧٨٩', + fa: '۰۱۲۳۴۵۶۷۸۹', ml: '൦൧൨൩൪൫൬൭൮൯', kn: '೦೧೨೩೪೫೬೭೮೯', lo: '໐໑໒໓໔໕໖໗໘໙', diff --git a/resources/js/ext.uls.init.js b/resources/js/ext.uls.init.js index bcf79b52..66355279 100644 --- a/resources/js/ext.uls.init.js +++ b/resources/js/ext.uls.init.js @@ -124,8 +124,6 @@ } } ); - // localization for mediaWiki ULS - fallback locale - i18n.load( extensionPath + 'i18n/en.json', 'en' ); } $( document ).ready( function () {