UNPKG

ilib

Version:

iLib is a cross-engine library of internationalization (i18n) classes written in pure JS

2 lines 6.21 kB
// !data unitfmt var ilib=require("../index.js"),Utils=require("./Utils.js"),Locale=require("./Locale.js"),IString=require("./IString.js"),NumFmt=require("./NumFmt.js"),ListFmt=require("./ListFmt.js"),Measurement=require("./Measurement.js"),lenMap={full:"long",long:"long",medium:"short",short:"short"},UnitFmt=function(options){var sync=!0,loadParams=void 0;this.length="long",this.scale=!0,this.measurementType="undefined",this.convert=!0,this.locale=new Locale(),(options=options||{sync:!0}).locale&&(this.locale="string"==typeof options.locale?new Locale(options.locale):options.locale),"boolean"==typeof options.sync&&(sync=options.sync),void 0!==options.loadParams&&(loadParams=options.loadParams),options.length&&(this.length=lenMap[options.length]||"long"),"boolean"==typeof options.autoScale&&(this.scale=options.autoScale),"string"==typeof options.style&&(this.style=options.style),"string"==typeof options.usage&&(this.usage=options.usage),"boolean"==typeof options.autoConvert&&(this.convert=options.autoConvert),"boolean"==typeof options.useNative&&(this.useNative=options.useNative),options.measurementSystem&&(this.measurementSystem=options.measurementSystem),void 0!==options.maxFractionDigits&&(this.maxFractionDigits=Number(options.maxFractionDigits)),void 0!==options.minFractionDigits&&(this.minFractionDigits=Number(options.minFractionDigits)),void 0!==options.significantDigits&&(this.significantDigits=Number(options.significantDigits)),this.roundingMode=options.roundingMode||"halfup",IString.loadPlurals(sync,this.locale,loadParams,ilib.bind(this,function(){Utils.loadData({object:"UnitFmt",locale:this.locale,name:"unitfmt.json",sync:sync,loadParams:loadParams,callback:ilib.bind(this,function(format){this.template=format.unitfmt[this.length],this.usage&&format.usages&&format.usages[this.usage]&&(this.usageInfo=format.usages[this.usage],"number"!=typeof this.maxFractionDigits&&"number"==typeof this.usageInfo.maxFractionDigits&&(this.maxFractionDigits=this.usageInfo.maxFractionDigits),"number"!=typeof this.minFractionDigits&&"number"==typeof this.usageInfo.minFractionDigits&&(this.minFractionDigits=this.usageInfo.minFractionDigits),"number"!=typeof this.significantDigits&&"number"==typeof this.usageInfo.significantDigits&&(this.significantDigits=this.usageInfo.significantDigits),!this.measurementSystem&&this.usageInfo.system&&(this.measurementSystem=this.usageInfo.system),this.units=this.usageInfo.units,!this.style&&this.usageInfo.style&&(this.style=this.usageInfo.style),this.usageInfo.systems)?(this.units={metric:this.usageInfo.systems.metric.units,uscustomary:this.usageInfo.systems.uscustomary.units,imperial:this.usageInfo.systems.imperial.units},this.numFmt={},this._initNumFmt(sync,loadParams,this.usageInfo.systems.metric,ilib.bind(this,function(numfmt){this.numFmt.metric=numfmt,this._initNumFmt(sync,loadParams,this.usageInfo.systems.uscustomary,ilib.bind(this,function(numfmt){this.numFmt.uscustomary=numfmt,this._initNumFmt(sync,loadParams,this.usageInfo.systems.imperial,ilib.bind(this,function(numfmt){this.numFmt.imperial=numfmt,this._init(sync,loadParams,ilib.bind(this,function(){options&&"function"==typeof options.onLoad&&options.onLoad(this)}))}))}))}))):this._initFormatters(sync,loadParams,{},ilib.bind(this,function(){options&&"function"==typeof options.onLoad&&options.onLoad(this)}))})})}))};UnitFmt.prototype={_initNumFmt:function(sync,loadParams,options,callback){new NumFmt({locale:this.locale,useNative:this.useNative,maxFractionDigits:(void 0!==this.maxFractionDigits?this:options).maxFractionDigits,minFractionDigits:(void 0!==this.minFractionDigits?this:options).minFractionDigits,significantDigits:(void 0!==this.significantDigits?this:options).significantDigits,roundingMode:this.roundingMode||options.roundingMode,sync:sync,loadParams:loadParams,onLoad:ilib.bind(this,function(numfmt){callback(numfmt)})})},_initFormatters:function(sync,loadParams,options,callback){this._initNumFmt(sync,loadParams,{},ilib.bind(this,function(numfmt){this.numFmt={metric:numfmt,uscustomary:numfmt,imperial:numfmt},this._init(sync,loadParams,callback)}))},_init:function(sync,loadParams,callback){"list"===this.style||this.usageInfo&&this.usageInfo.systems&&("list"===this.usageInfo.systems.metric.style||"list"===this.usageInfo.systems.uscustomary.style||"list"===this.usageInfo.systems.imperial.style)?new ListFmt({locale:this.locale,style:"unit",sync:sync,loadParams:loadParams,onLoad:ilib.bind(this,function(listFmt){this.listFmt=listFmt,callback()})}):callback()},getLocale:function(){return this.locale},getTemplate:function(){return this.template},toString:function(){return this.getTemplate()},getScale:function(){return this.scale},getMeasurementSystem:function(){return this.measurementSystem},_format:function(u,system){var unit="long-ton"===u.getUnit()?"ton":u.getUnit(),unit=new IString(this.template[unit]),rounded=(unit.setLocale(this.locale,!0,void 0,void 0),this.numFmt[system].constrain(u.amount));return 0<(unit=unit.formatChoice(rounded,{n:this.numFmt[system].format(u.amount)})).length?unit:rounded+" "+u.unit},format:function(measurement){var system,listStyle,u=measurement,doScale=this.scale;return this.convert&&(this.measurementSystem?this.measurementSystem!==measurement.getMeasurementSystem()&&(u=u.convertSystem(this.measurementSystem)):this.usageInfo&&Measurement.getMeasurementSystemForLocale(this.locale)===u.getMeasurementSystem()||(u=measurement.localize(this.locale)),doScale=this.usageInfo&&measurement.getMeasurementSystem()!==u.getMeasurementSystem()||this.scale),system=u.getMeasurementSystem()||this.getMeasurementSystem()||"metric",listStyle="list"===this.style||this.usageInfo&&this.usageInfo.systems&&"list"===this.usageInfo.systems[system].style,doScale&&(u=this.usageInfo&&measurement.getMeasure()===this.usageInfo.type&&!listStyle?u.scale(system,this.units):u.scale()),listStyle?(doScale=this.numFmt[system],measurement=(u=u.expand(void 0,this.units,ilib.bind(doScale,doScale.constrain),this.scale)).map(ilib.bind(this,function(unit){return this._format(unit,system)})),this.listFmt&&measurement.length?this.listFmt.format(measurement):measurement.join(" ")):this._format(u,system)}},module.exports=UnitFmt;