202 lines
8.0 KiB
JavaScript
202 lines
8.0 KiB
JavaScript
/**
|
|
* 2007-2018 PrestaShop
|
|
*
|
|
* NOTICE OF LICENSE
|
|
*
|
|
* This source file is subject to the Open Software License (OSL 3.0)
|
|
* that is bundled with this package in the file LICENSE.txt.
|
|
* It is also available through the world-wide-web at this URL:
|
|
* https://opensource.org/licenses/OSL-3.0
|
|
* If you did not receive a copy of the license and are unable to
|
|
* obtain it through the world-wide-web, please send an email
|
|
* to license@prestashop.com so we can send you a copy immediately.
|
|
*
|
|
* DISCLAIMER
|
|
*
|
|
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
|
|
* versions in the future. If you wish to customize PrestaShop for your
|
|
* needs please refer to http://www.prestashop.com for more information.
|
|
*
|
|
* @author PrestaShop SA <contact@prestashop.com>
|
|
* @copyright 2007-2018 PrestaShop SA
|
|
* @license https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
|
|
* International Registered Trademark & Property of PrestaShop SA
|
|
*/
|
|
|
|
/* CLDR globals */
|
|
var cldrLoadedCatalogs = [];
|
|
var cldrLoaderError = false;
|
|
var cldrCatalogsPath = (typeof baseDir !== 'undefined' ? baseDir : '') + 'translations/cldr/datas/';
|
|
|
|
/* Variables avoiding several loading of the same file */
|
|
var deferreds = [];
|
|
var deferredUrls = [];
|
|
|
|
/**
|
|
* Will get list of CLDR catalogs by XHR.
|
|
* Please do not call this directly except if you know what you do. Prefer to call the wrapper methods cldrForXXX()
|
|
* containing catalogs depending on the locale type you want to use.
|
|
*
|
|
* Asynchronous behavior: If callback is defined and callable, then each ajax request will be
|
|
* asynchronous and the callback will be called with a Globalize object in its parameter.
|
|
*
|
|
* Synchronous behavior: If callback is undefined, then ajax request will be SYNCHRONOUS.
|
|
* The function will return a Globalize object instance.
|
|
* WARNING: Please avoid as much as you can this SYNC behavior till its deprecated for browser
|
|
* because of a slow down process in browsers (will freeze javascript process until each CLDR
|
|
* catalogs are fully loaded).
|
|
*
|
|
* @param catalogs An array of strings representing the catalogs to load.
|
|
* @param callback A function to execute in ASYNC behavior. This will receive a Globalize object as parameter.
|
|
* @returns Globalize instance in SYNC behavior only.
|
|
*/
|
|
function cldrLazyLoadCatalogs(catalogs, callback) {
|
|
if (typeof catalogs !== 'object' || catalogs.length < 1) {
|
|
throw Error('No catalog to load!');
|
|
}
|
|
var sync = (typeof callback === 'undefined' || !$.isFunction(callback));
|
|
var culture = full_cldr_language_code;
|
|
|
|
if (sync) {
|
|
// Warning, Sync behavior will slow down Browser performances!
|
|
catalogs.forEach(function(catalog) {
|
|
var url = cldrCatalogsPath + catalog.replace(/main\/[^\/]+/, 'main/'+culture) + '.json';
|
|
if ($.inArray(url, cldrLoadedCatalogs) === -1) {
|
|
$.ajax({
|
|
url: url,
|
|
dataType: 'json',
|
|
async: false, // deprecated for modern browser, but not really other choice...
|
|
success: function(data) {
|
|
Globalize.load(data);
|
|
cldrLoadedCatalogs.push(url);
|
|
},
|
|
error: function(xhr) {
|
|
cldrLoaderError = true;
|
|
}
|
|
});
|
|
}
|
|
});
|
|
|
|
if (!cldrLoaderError) {
|
|
return new Globalize(culture);
|
|
}
|
|
} else {
|
|
catalogs.forEach(function(catalog) {
|
|
var url = cldrCatalogsPath + catalog.replace(/main\/[^\/]+/, 'main/'+culture) + '.json';
|
|
if ($.inArray(url, cldrLoadedCatalogs) === -1 && $.inArray(url, deferredUrls) === -1) {
|
|
deferredUrls.push(url);
|
|
this.push($.get(url).done(function() {
|
|
cldrLoadedCatalogs.push(url);
|
|
}).fail(function() {
|
|
cldrLoaderError = true;
|
|
}).always(function() {
|
|
deferredUrls.splice(deferredUrls.indexOf(url), 1)
|
|
}));
|
|
}
|
|
}, deferreds);
|
|
|
|
if (deferreds.length > 0) {
|
|
$.when.apply($, deferreds).then(function() {
|
|
return [].slice.apply( arguments, [ 0 ] ).map(function( result ) {
|
|
return result[ 0 ];
|
|
});
|
|
}).then( Globalize.load ).then(function() {
|
|
if (!cldrLoaderError) {
|
|
callback(new Globalize(culture));
|
|
} else {
|
|
throw Error('Cannot load given catalogs.');
|
|
}
|
|
});
|
|
} else {
|
|
callback(new Globalize(culture));
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Will load CLDR catalogs for Number conversions.
|
|
*
|
|
* Asynchronous behavior: If callback is defined and callable, then each ajax request will be
|
|
* asynchronous and the callback will be called with a Globalize object in its parameter.
|
|
*
|
|
* Synchronous behavior: If callback is undefined, then ajax request will be SYNCHRONOUS.
|
|
* The function will return a Globalize object instance.
|
|
* WARNING: Please avoid as much as you can this SYNC behavior till its deprecated for browser
|
|
* because of a slow down process in browsers (will freeze javascript process until each CLDR
|
|
* catalogs are fully loaded).
|
|
*
|
|
* @param callback A function to execute in ASYNC behavior. This will receive a Globalize object as parameter.
|
|
* @returns Globalize instance in SYNC behavior only.
|
|
*/
|
|
function cldrForNumber(callback) {
|
|
var catalogs = ['main/en/numbers', 'supplemental/likelySubtags', 'supplemental/numberingSystems'];
|
|
return cldrLazyLoadCatalogs(catalogs, callback);
|
|
}
|
|
|
|
/**
|
|
* Will load CLDR catalogs for Currencies conversions.
|
|
*
|
|
* Asynchronous behavior: If callback is defined and callable, then each ajax request will be
|
|
* asynchronous and the callback will be called with a Globalize object in its parameter.
|
|
*
|
|
* Synchronous behavior: If callback is undefined, then ajax request will be SYNCHRONOUS.
|
|
* The function will return a Globalize object instance.
|
|
* WARNING: Please avoid as much as you can this SYNC behavior till its deprecated for browser
|
|
* because of a slow down process in browsers (will freeze javascript process until each CLDR
|
|
* catalogs are fully loaded).
|
|
*
|
|
* @param callback A function to execute in ASYNC behavior. This will receive a Globalize object as parameter.
|
|
* @returns Globalize instance in SYNC behavior only.
|
|
*/
|
|
function cldrForCurrencies(callback) {
|
|
var catalogs = ['main/en/numbers', 'main/en/currencies', 'supplemental/likelySubtags',
|
|
'supplemental/currencyData', 'supplemental/plurals'];
|
|
return cldrLazyLoadCatalogs(catalogs, callback);
|
|
}
|
|
|
|
/**
|
|
* A small wrapper for currency, returning directly the currency formatter with the good currency.
|
|
* Works in SYNC or ASYNC behaviors.
|
|
* Warning: SYNC behavior should be avoided.
|
|
* @see cldrForCurrencies(callback)
|
|
*
|
|
* @param callback A function to execute in ASYNC behavior. This will receive a currencyFormatter object as parameter.
|
|
* @param options An option hash table to transfer to formatter factory.
|
|
* @returns currencyFormatter instance in SYNC behavior only.
|
|
*/
|
|
function cldrForCurrencyFormatterWrapper(callback, options) {
|
|
var sync = (typeof callback === 'undefined' || !$.isFunction(callback));
|
|
var currencyIsoCode = currency.iso_code;
|
|
|
|
if (sync) {
|
|
var globalize = cldrForCurrencies();
|
|
return globalize.currencyFormatter(currencyIsoCode, options);
|
|
} else {
|
|
var callbackEncap = function(globalize) {
|
|
callback(globalize.currencyFormatter(currencyIsoCode, options));
|
|
};
|
|
cldrForCurrencies(callbackEncap);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Will load CLDR catalogs for Date conversions.
|
|
*
|
|
* Asynchronous behavior: If callback is defined and callable, then each ajax request will be
|
|
* asynchronous and the callback will be called with a Globalize object in its parameter.
|
|
*
|
|
* Synchronous behavior: If callback is undefined, then ajax request will be SYNCHRONOUS.
|
|
* The function will return a Globalize object instance.
|
|
* WARNING: Please avoid as much as you can this SYNC behavior till its deprecated for browser
|
|
* because of a slow down process in browsers (will freeze javascript process until each CLDR
|
|
* catalogs are fully loaded).
|
|
*
|
|
* @param callback A function to execute in ASYNC behavior. This will receive a Globalize object as parameter.
|
|
* @returns Globalize instance in SYNC behavior only.
|
|
*/
|
|
function cldrForDate(callback) {
|
|
var catalogs = ['main/en/numbers', 'main/en/ca-gregorian', 'main/en/timeZoneNames', 'supplemental/timeData',
|
|
'supplemental/weekData', 'supplemental/likelySubtags'];
|
|
return cldrLazyLoadCatalogs(catalogs, callback);
|
|
}
|