mirror of
https://git.tt-rss.org/git/tt-rss.git
synced 2025-12-15 15:25:56 +00:00
build custom layer of Dojo to speed up loading of tt-rss (refs #293)
This commit is contained in:
395
lib/dojo/i18n.js
395
lib/dojo/i18n.js
@@ -5,167 +5,254 @@
|
||||
*/
|
||||
|
||||
|
||||
if(!dojo._hasResource["dojo.i18n"]){
|
||||
dojo._hasResource["dojo.i18n"]=true;
|
||||
if(!dojo._hasResource["dojo.i18n"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
|
||||
dojo._hasResource["dojo.i18n"] = true;
|
||||
dojo.provide("dojo.i18n");
|
||||
dojo.i18n.getLocalization=function(_1,_2,_3){
|
||||
_3=dojo.i18n.normalizeLocale(_3);
|
||||
var _4=_3.split("-");
|
||||
var _5=[_1,"nls",_2].join(".");
|
||||
var _6=dojo._loadedModules[_5];
|
||||
if(_6){
|
||||
var _7;
|
||||
for(var i=_4.length;i>0;i--){
|
||||
var _8=_4.slice(0,i).join("_");
|
||||
if(_6[_8]){
|
||||
_7=_6[_8];
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(!_7){
|
||||
_7=_6.ROOT;
|
||||
}
|
||||
if(_7){
|
||||
var _9=function(){
|
||||
|
||||
/*=====
|
||||
dojo.i18n = {
|
||||
// summary: Utility classes to enable loading of resources for internationalization (i18n)
|
||||
};
|
||||
_9.prototype=_7;
|
||||
return new _9();
|
||||
}
|
||||
}
|
||||
throw new Error("Bundle not found: "+_2+" in "+_1+" , locale="+_3);
|
||||
=====*/
|
||||
|
||||
dojo.i18n.getLocalization = function(/*String*/packageName, /*String*/bundleName, /*String?*/locale){
|
||||
// summary:
|
||||
// Returns an Object containing the localization for a given resource
|
||||
// bundle in a package, matching the specified locale.
|
||||
// description:
|
||||
// Returns a hash containing name/value pairs in its prototypesuch
|
||||
// that values can be easily overridden. Throws an exception if the
|
||||
// bundle is not found. Bundle must have already been loaded by
|
||||
// `dojo.requireLocalization()` or by a build optimization step. NOTE:
|
||||
// try not to call this method as part of an object property
|
||||
// definition (`var foo = { bar: dojo.i18n.getLocalization() }`). In
|
||||
// some loading situations, the bundle may not be available in time
|
||||
// for the object definition. Instead, call this method inside a
|
||||
// function that is run after all modules load or the page loads (like
|
||||
// in `dojo.addOnLoad()`), or in a widget lifecycle method.
|
||||
// packageName:
|
||||
// package which is associated with this resource
|
||||
// bundleName:
|
||||
// the base filename of the resource bundle (without the ".js" suffix)
|
||||
// locale:
|
||||
// the variant to load (optional). By default, the locale defined by
|
||||
// the host environment: dojo.locale
|
||||
|
||||
locale = dojo.i18n.normalizeLocale(locale);
|
||||
|
||||
// look for nearest locale match
|
||||
var elements = locale.split('-');
|
||||
var module = [packageName,"nls",bundleName].join('.');
|
||||
var bundle = dojo._loadedModules[module];
|
||||
if(bundle){
|
||||
var localization;
|
||||
for(var i = elements.length; i > 0; i--){
|
||||
var loc = elements.slice(0, i).join('_');
|
||||
if(bundle[loc]){
|
||||
localization = bundle[loc];
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(!localization){
|
||||
localization = bundle.ROOT;
|
||||
}
|
||||
|
||||
// make a singleton prototype so that the caller won't accidentally change the values globally
|
||||
if(localization){
|
||||
var clazz = function(){};
|
||||
clazz.prototype = localization;
|
||||
return new clazz(); // Object
|
||||
}
|
||||
}
|
||||
|
||||
throw new Error("Bundle not found: " + bundleName + " in " + packageName+" , locale=" + locale);
|
||||
};
|
||||
dojo.i18n.normalizeLocale=function(_a){
|
||||
var _b=_a?_a.toLowerCase():dojo.locale;
|
||||
if(_b=="root"){
|
||||
_b="ROOT";
|
||||
}
|
||||
return _b;
|
||||
|
||||
dojo.i18n.normalizeLocale = function(/*String?*/locale){
|
||||
// summary:
|
||||
// Returns canonical form of locale, as used by Dojo.
|
||||
//
|
||||
// description:
|
||||
// All variants are case-insensitive and are separated by '-' as specified in [RFC 3066](http://www.ietf.org/rfc/rfc3066.txt).
|
||||
// If no locale is specified, the dojo.locale is returned. dojo.locale is defined by
|
||||
// the user agent's locale unless overridden by djConfig.
|
||||
|
||||
var result = locale ? locale.toLowerCase() : dojo.locale;
|
||||
if(result == "root"){
|
||||
result = "ROOT";
|
||||
}
|
||||
return result; // String
|
||||
};
|
||||
dojo.i18n._requireLocalization=function(_c,_d,_e,_f){
|
||||
var _10=dojo.i18n.normalizeLocale(_e);
|
||||
var _11=[_c,"nls",_d].join(".");
|
||||
var _12="";
|
||||
if(_f){
|
||||
var _13=_f.split(",");
|
||||
for(var i=0;i<_13.length;i++){
|
||||
if(_10["indexOf"](_13[i])==0){
|
||||
if(_13[i].length>_12.length){
|
||||
_12=_13[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!_12){
|
||||
_12="ROOT";
|
||||
}
|
||||
}
|
||||
var _14=_f?_12:_10;
|
||||
var _15=dojo._loadedModules[_11];
|
||||
var _16=null;
|
||||
if(_15){
|
||||
if(dojo.config.localizationComplete&&_15._built){
|
||||
return;
|
||||
}
|
||||
var _17=_14.replace(/-/g,"_");
|
||||
var _18=_11+"."+_17;
|
||||
_16=dojo._loadedModules[_18];
|
||||
}
|
||||
if(!_16){
|
||||
_15=dojo["provide"](_11);
|
||||
var _19=dojo._getModuleSymbols(_c);
|
||||
var _1a=_19.concat("nls").join("/");
|
||||
var _1b;
|
||||
dojo.i18n._searchLocalePath(_14,_f,function(loc){
|
||||
var _1c=loc.replace(/-/g,"_");
|
||||
var _1d=_11+"."+_1c;
|
||||
var _1e=false;
|
||||
if(!dojo._loadedModules[_1d]){
|
||||
dojo["provide"](_1d);
|
||||
var _1f=[_1a];
|
||||
if(loc!="ROOT"){
|
||||
_1f.push(loc);
|
||||
}
|
||||
_1f.push(_d);
|
||||
var _20=_1f.join("/")+".js";
|
||||
_1e=dojo._loadPath(_20,null,function(_21){
|
||||
var _22=function(){
|
||||
};
|
||||
_22.prototype=_1b;
|
||||
_15[_1c]=new _22();
|
||||
for(var j in _21){
|
||||
_15[_1c][j]=_21[j];
|
||||
}
|
||||
});
|
||||
}else{
|
||||
_1e=true;
|
||||
}
|
||||
if(_1e&&_15[_1c]){
|
||||
_1b=_15[_1c];
|
||||
}else{
|
||||
_15[_1c]=_1b;
|
||||
}
|
||||
if(_f){
|
||||
return true;
|
||||
}
|
||||
});
|
||||
}
|
||||
if(_f&&_10!=_12){
|
||||
_15[_10.replace(/-/g,"_")]=_15[_12.replace(/-/g,"_")];
|
||||
}
|
||||
|
||||
dojo.i18n._requireLocalization = function(/*String*/moduleName, /*String*/bundleName, /*String?*/locale, /*String?*/availableFlatLocales){
|
||||
// summary:
|
||||
// See dojo.requireLocalization()
|
||||
// description:
|
||||
// Called by the bootstrap, but factored out so that it is only
|
||||
// included in the build when needed.
|
||||
|
||||
var targetLocale = dojo.i18n.normalizeLocale(locale);
|
||||
var bundlePackage = [moduleName, "nls", bundleName].join(".");
|
||||
// NOTE:
|
||||
// When loading these resources, the packaging does not match what is
|
||||
// on disk. This is an implementation detail, as this is just a
|
||||
// private data structure to hold the loaded resources. e.g.
|
||||
// `tests/hello/nls/en-us/salutations.js` is loaded as the object
|
||||
// `tests.hello.nls.salutations.en_us={...}` The structure on disk is
|
||||
// intended to be most convenient for developers and translators, but
|
||||
// in memory it is more logical and efficient to store in a different
|
||||
// order. Locales cannot use dashes, since the resulting path will
|
||||
// not evaluate as valid JS, so we translate them to underscores.
|
||||
|
||||
//Find the best-match locale to load if we have available flat locales.
|
||||
var bestLocale = "";
|
||||
if(availableFlatLocales){
|
||||
var flatLocales = availableFlatLocales.split(",");
|
||||
for(var i = 0; i < flatLocales.length; i++){
|
||||
//Locale must match from start of string.
|
||||
//Using ["indexOf"] so customBase builds do not see
|
||||
//this as a dojo._base.array dependency.
|
||||
if(targetLocale["indexOf"](flatLocales[i]) == 0){
|
||||
if(flatLocales[i].length > bestLocale.length){
|
||||
bestLocale = flatLocales[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!bestLocale){
|
||||
bestLocale = "ROOT";
|
||||
}
|
||||
}
|
||||
|
||||
//See if the desired locale is already loaded.
|
||||
var tempLocale = availableFlatLocales ? bestLocale : targetLocale;
|
||||
var bundle = dojo._loadedModules[bundlePackage];
|
||||
var localizedBundle = null;
|
||||
if(bundle){
|
||||
if(dojo.config.localizationComplete && bundle._built){return;}
|
||||
var jsLoc = tempLocale.replace(/-/g, '_');
|
||||
var translationPackage = bundlePackage+"."+jsLoc;
|
||||
localizedBundle = dojo._loadedModules[translationPackage];
|
||||
}
|
||||
|
||||
if(!localizedBundle){
|
||||
bundle = dojo["provide"](bundlePackage);
|
||||
var syms = dojo._getModuleSymbols(moduleName);
|
||||
var modpath = syms.concat("nls").join("/");
|
||||
var parent;
|
||||
|
||||
dojo.i18n._searchLocalePath(tempLocale, availableFlatLocales, function(loc){
|
||||
var jsLoc = loc.replace(/-/g, '_');
|
||||
var translationPackage = bundlePackage + "." + jsLoc;
|
||||
var loaded = false;
|
||||
if(!dojo._loadedModules[translationPackage]){
|
||||
// Mark loaded whether it's found or not, so that further load attempts will not be made
|
||||
dojo["provide"](translationPackage);
|
||||
var module = [modpath];
|
||||
if(loc != "ROOT"){module.push(loc);}
|
||||
module.push(bundleName);
|
||||
var filespec = module.join("/") + '.js';
|
||||
loaded = dojo._loadPath(filespec, null, function(hash){
|
||||
// Use singleton with prototype to point to parent bundle, then mix-in result from loadPath
|
||||
var clazz = function(){};
|
||||
clazz.prototype = parent;
|
||||
bundle[jsLoc] = new clazz();
|
||||
for(var j in hash){ bundle[jsLoc][j] = hash[j]; }
|
||||
});
|
||||
}else{
|
||||
loaded = true;
|
||||
}
|
||||
if(loaded && bundle[jsLoc]){
|
||||
parent = bundle[jsLoc];
|
||||
}else{
|
||||
bundle[jsLoc] = parent;
|
||||
}
|
||||
|
||||
if(availableFlatLocales){
|
||||
//Stop the locale path searching if we know the availableFlatLocales, since
|
||||
//the first call to this function will load the only bundle that is needed.
|
||||
return true;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
//Save the best locale bundle as the target locale bundle when we know the
|
||||
//the available bundles.
|
||||
if(availableFlatLocales && targetLocale != bestLocale){
|
||||
bundle[targetLocale.replace(/-/g, '_')] = bundle[bestLocale.replace(/-/g, '_')];
|
||||
}
|
||||
};
|
||||
|
||||
(function(){
|
||||
var _23=dojo.config.extraLocale;
|
||||
if(_23){
|
||||
if(!_23 instanceof Array){
|
||||
_23=[_23];
|
||||
}
|
||||
var req=dojo.i18n._requireLocalization;
|
||||
dojo.i18n._requireLocalization=function(m,b,_24,_25){
|
||||
req(m,b,_24,_25);
|
||||
if(_24){
|
||||
return;
|
||||
}
|
||||
for(var i=0;i<_23.length;i++){
|
||||
req(m,b,_23[i],_25);
|
||||
}
|
||||
};
|
||||
}
|
||||
// If other locales are used, dojo.requireLocalization should load them as
|
||||
// well, by default.
|
||||
//
|
||||
// Override dojo.requireLocalization to do load the default bundle, then
|
||||
// iterate through the extraLocale list and load those translations as
|
||||
// well, unless a particular locale was requested.
|
||||
|
||||
var extra = dojo.config.extraLocale;
|
||||
if(extra){
|
||||
if(!extra instanceof Array){
|
||||
extra = [extra];
|
||||
}
|
||||
|
||||
var req = dojo.i18n._requireLocalization;
|
||||
dojo.i18n._requireLocalization = function(m, b, locale, availableFlatLocales){
|
||||
req(m,b,locale, availableFlatLocales);
|
||||
if(locale){return;}
|
||||
for(var i=0; i<extra.length; i++){
|
||||
req(m,b,extra[i], availableFlatLocales);
|
||||
}
|
||||
};
|
||||
}
|
||||
})();
|
||||
dojo.i18n._searchLocalePath=function(_26,_27,_28){
|
||||
_26=dojo.i18n.normalizeLocale(_26);
|
||||
var _29=_26.split("-");
|
||||
var _2a=[];
|
||||
for(var i=_29.length;i>0;i--){
|
||||
_2a.push(_29.slice(0,i).join("-"));
|
||||
}
|
||||
_2a.push(false);
|
||||
if(_27){
|
||||
_2a.reverse();
|
||||
}
|
||||
for(var j=_2a.length-1;j>=0;j--){
|
||||
var loc=_2a[j]||"ROOT";
|
||||
var _2b=_28(loc);
|
||||
if(_2b){
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
dojo.i18n._searchLocalePath = function(/*String*/locale, /*Boolean*/down, /*Function*/searchFunc){
|
||||
// summary:
|
||||
// A helper method to assist in searching for locale-based resources.
|
||||
// Will iterate through the variants of a particular locale, either up
|
||||
// or down, executing a callback function. For example, "en-us" and
|
||||
// true will try "en-us" followed by "en" and finally "ROOT".
|
||||
|
||||
locale = dojo.i18n.normalizeLocale(locale);
|
||||
|
||||
var elements = locale.split('-');
|
||||
var searchlist = [];
|
||||
for(var i = elements.length; i > 0; i--){
|
||||
searchlist.push(elements.slice(0, i).join('-'));
|
||||
}
|
||||
searchlist.push(false);
|
||||
if(down){searchlist.reverse();}
|
||||
|
||||
for(var j = searchlist.length - 1; j >= 0; j--){
|
||||
var loc = searchlist[j] || "ROOT";
|
||||
var stop = searchFunc(loc);
|
||||
if(stop){ break; }
|
||||
}
|
||||
};
|
||||
dojo.i18n._preloadLocalizations=function(_2c,_2d){
|
||||
function _2e(_2f){
|
||||
_2f=dojo.i18n.normalizeLocale(_2f);
|
||||
dojo.i18n._searchLocalePath(_2f,true,function(loc){
|
||||
for(var i=0;i<_2d.length;i++){
|
||||
if(_2d[i]==loc){
|
||||
dojo["require"](_2c+"_"+loc);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
});
|
||||
};
|
||||
_2e();
|
||||
var _30=dojo.config.extraLocale||[];
|
||||
for(var i=0;i<_30.length;i++){
|
||||
_2e(_30[i]);
|
||||
}
|
||||
|
||||
dojo.i18n._preloadLocalizations = function(/*String*/bundlePrefix, /*Array*/localesGenerated){
|
||||
// summary:
|
||||
// Load built, flattened resource bundles, if available for all
|
||||
// locales used in the page. Only called by built layer files.
|
||||
|
||||
function preload(locale){
|
||||
locale = dojo.i18n.normalizeLocale(locale);
|
||||
dojo.i18n._searchLocalePath(locale, true, function(loc){
|
||||
for(var i=0; i<localesGenerated.length;i++){
|
||||
if(localesGenerated[i] == loc){
|
||||
dojo["require"](bundlePrefix+"_"+loc);
|
||||
return true; // Boolean
|
||||
}
|
||||
}
|
||||
return false; // Boolean
|
||||
});
|
||||
}
|
||||
preload();
|
||||
var extra = dojo.config.extraLocale||[];
|
||||
for(var i=0; i<extra.length; i++){
|
||||
preload(extra[i]);
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user