ilib
Version:
iLib is a cross-engine library of internationalization (i18n) classes written in pure JS
1 lines • 3.87 kB
JavaScript
var ilib=require("./ilib.js"),Locale=require("./Locale.js"),JSUtils=require("./JSUtils.js"),Path=require("./Path.js"),ISet=require("./ISet.js"),Utils={};function dataNotExists(basename,pathname){var localeBits=pathname.split("/").slice(0,-1).join("_"),property=localeBits?basename+"_"+localeBits:basename;return!ilib.data[property]}Utils.getSublocales=function(locale){var ret=["root"],loc="string"==typeof locale?new Locale(locale):locale;return loc.getLanguage()&&ret.push(loc.getLanguage()),loc.getRegion()&&ret.push("und-"+loc.getRegion()),loc.getLanguage()&&(loc.getScript()&&ret.push(loc.getLanguage()+"-"+loc.getScript()),loc.getRegion()&&ret.push(loc.getLanguage()+"-"+loc.getRegion())),loc.getRegion()&&loc.getVariant()&&ret.push("und-"+loc.getRegion()+"-"+loc.getVariant()),loc.getLanguage()&&(loc.getScript()&&loc.getRegion()&&ret.push(loc.getLanguage()+"-"+loc.getScript()+"-"+loc.getRegion()),loc.getRegion()&&loc.getVariant()&&ret.push(loc.getLanguage()+"-"+loc.getRegion()+"-"+loc.getVariant()),loc.getScript()&&loc.getRegion()&&loc.getVariant()&&ret.push(loc.getLanguage()+"-"+loc.getScript()+"-"+loc.getRegion()+"-"+loc.getVariant())),ret},Utils.mergeLocData=function(prefix,locale,replaceArrays,returnOne){var mostSpecific,data=void 0,loc=locale||new Locale();return mostSpecific=data={},Utils.getSublocales(loc).forEach(function(l){var property="root"===l?prefix:prefix+"_"+l.replace(/-/g,"_");ilib.data[property]&&(data=JSUtils.merge(data,ilib.data[property],replaceArrays),mostSpecific=ilib.data[property])}),returnOne?mostSpecific:data},Utils.getLocFiles=function(locale,name){var filename=name||"resources.json",loc=locale||new Locale();return Utils.getSublocales(loc).map(function(l){return"root"===l?filename:Path.join(l.replace(/-/g,"/"),filename)})},Utils._callLoadData=function(files,sync,params,callback){return"function"==typeof ilib._load?ilib._load(files,sync,params,callback):"object"==typeof ilib._load&&"function"==typeof ilib._load.loadFiles?ilib._load.loadFiles(files,sync,params,callback):void 0},Utils.loadData=function(params){var basename,name="resources.json",locale=new Locale(ilib.getLocale()),sync=!1,type=void 0,loadParams={},callback=void 0,nonlocale=!1,replace=!1;if(!params||"function"!=typeof params.callback)throw"Utils.loadData called without a callback. It must have a callback to work.";if(params.name&&(name=params.name),params.locale&&(locale="string"==typeof params.locale?new Locale(params.locale):params.locale),params.type&&(type=params.type),params.loadParams&&(loadParams=params.loadParams),params.sync&&(sync=params.sync),params.nonlocale&&(nonlocale=!!params.nonlocale),"boolean"==typeof params.replace&&(replace=params.replace),callback=params.callback,!type){var dot=name.lastIndexOf(".");type=-1!==dot?name.substring(dot+1):"text"}var data,returnOne=loadParams&&loadParams.returnOne||"json"!==type;if(basename=name.substring(0,name.lastIndexOf(".")).replace(/[\.:\(\)\/\\\+\-]/g,"_"),void 0!==ilib._load){var files=nonlocale?[name||"resources.json"]:Utils.getLocFiles(locale,name);if(void 0===ilib.data.cache&&(ilib.data.cache={}),void 0===ilib.data.cache.fileSet&&(ilib.data.cache.fileSet=new ISet),(files=files.filter(ilib.bind(this,function(file){return!ilib.data.cache.fileSet.has(file)&&dataNotExists(basename,file)}))).length)return void Utils._callLoadData(files,sync,loadParams,ilib.bind(this,function(arr){for(var i=0;i<files.length;i++){if(arr[i]){var localeBits=files[i].split("/").slice(0,-1).join("_"),property=!nonlocale&&localeBits?basename+"_"+localeBits:basename;ilib.data[property]||(ilib.data[property]=arr[i])}ilib.data.cache.fileSet.add(files[i])}data=nonlocale?ilib.data[basename]:Utils.mergeLocData(basename,locale,replace,returnOne),callback(data)}))}data=nonlocale?ilib.data[basename]:Utils.mergeLocData(basename,locale,replace,returnOne),callback(data)},module.exports=Utils;