diff --git a/packages/runtime/dist/index.cjs b/packages/runtime/dist/index.cjs deleted file mode 100644 index f9654b0..0000000 --- a/packages/runtime/dist/index.cjs +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";var e=require("@babel/runtime-corejs3/core-js-stable/weak-map"),t=require("@babel/runtime-corejs3/core-js-stable/instance/reduce"),r=require("@babel/runtime-corejs3/core-js-stable/object/keys"),a=require("@babel/runtime-corejs3/core-js-stable/object/create"),n=require("@babel/runtime-corejs3/core-js-stable/symbol/replace"),l=require("@babel/runtime-corejs3/core-js-stable/array/from"),u=require("@babel/runtime-corejs3/core-js-stable/symbol"),s=require("@babel/runtime-corejs3/core-js/get-iterator-method"),i=require("@babel/runtime-corejs3/core-js-stable/reflect/construct");require("core-js/modules/es.regexp.constructor.js"),require("core-js/modules/es.regexp.dot-all.js"),require("core-js/modules/es.regexp.sticky.js"),require("core-js/modules/es.regexp.test.js"),require("core-js/modules/es.reflect.to-string-tag.js");var c=require("@babel/runtime-corejs3/helpers/asyncToGenerator"),o=require("@babel/runtime-corejs3/helpers/classCallCheck"),f=require("@babel/runtime-corejs3/helpers/createClass"),d=require("@babel/runtime-corejs3/helpers/assertThisInitialized"),g=require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"),h=require("@babel/runtime-corejs3/helpers/getPrototypeOf"),b=require("@babel/runtime-corejs3/helpers/typeof"),p=require("@babel/runtime-corejs3/helpers/toConsumableArray"),v=require("@babel/runtime-corejs3/helpers/slicedToArray"),m=require("@babel/runtime-corejs3/helpers/taggedTemplateLiteral"),y=require("@babel/runtime-corejs3/helpers/inherits"),j=require("@babel/runtime-corejs3/helpers/setPrototypeOf"),k=require("@babel/runtime-corejs3/regenerator");require("core-js/modules/es.regexp.exec.js"),require("core-js/modules/es.string.split.js"),require("core-js/modules/es.string.substr.js"),require("core-js/modules/es.function.name.js"),require("core-js/modules/es.error.to-string.js"),require("core-js/modules/es.date.to-string.js"),require("core-js/modules/es.object.to-string.js"),require("core-js/modules/es.regexp.to-string.js"),require("core-js/modules/esnext.array.last-index.js"),require("core-js/modules/es.string.replace.js"),require("core-js/modules/es.error.cause.js"),require("core-js/modules/es.array.iterator.js"),require("core-js/modules/es.promise.js"),require("core-js/modules/es.promise.all-settled.js"),require("core-js/modules/es.string.iterator.js"),require("core-js/modules/web.dom-collections.iterator.js");var _=require("@babel/runtime-corejs3/core-js-stable/string/raw"),x=require("@babel/runtime-corejs3/core-js-stable/instance/includes"),q=require("@babel/runtime-corejs3/core-js-stable/instance/map"),L=require("@babel/runtime-corejs3/core-js-stable/instance/trim"),w=require("@babel/runtime-corejs3/core-js-stable/instance/index-of"),S=require("@babel/runtime-corejs3/core-js-stable/instance/last-index-of"),M=require("@babel/runtime-corejs3/core-js-stable/parse-int"),$=require("@babel/runtime-corejs3/core-js-stable/instance/starts-with"),F=require("@babel/runtime-corejs3/core-js-stable/instance/ends-with"),E=require("@babel/runtime-corejs3/core-js-stable/instance/find-index"),D=require("@babel/runtime-corejs3/core-js-stable/object/assign"),A=require("@babel/runtime-corejs3/core-js/instance/replace-all"),I=require("@babel/runtime-corejs3/core-js-stable/array/is-array"),N=require("@babel/runtime-corejs3/core-js-stable/json/stringify"),T=require("@babel/runtime-corejs3/core-js-stable/instance/concat"),O=require("@babel/runtime-corejs3/core-js-stable/instance/splice"),P=require("@babel/runtime-corejs3/core-js-stable/instance/for-each"),C=require("@babel/runtime-corejs3/core-js-stable/object/entries"),R=require("@babel/runtime-corejs3/core-js-stable/instance/slice"),V=require("@babel/runtime-corejs3/core-js-stable/promise"),z=require("@babel/runtime-corejs3/core-js-stable/object/get-prototype-of"),B=require("@babel/runtime-corejs3/core-js-stable/set"),U=require("@babel/runtime-corejs3/core-js/global-this"),Y=require("@babel/runtime-corejs3/core-js-stable/instance/bind");function H(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var J=H(e),W=H(t),G=H(r),K=H(a),Q=H(n),X=H(l),Z=H(u),ee=H(s),te=H(i),re=H(c),ae=H(o),ne=H(f),le=H(d),ue=H(g),se=H(h),ie=H(b),ce=H(p),oe=H(v),fe=H(m),de=H(y),ge=H(j),he=H(k),be=H(_),pe=H(x),ve=H(q),me=H(L),ye=H(w),je=H(S),ke=H(M),_e=H($),xe=H(F),qe=H(E),Le=H(D),we=H(A),Se=H(I),Me=H(N),$e=H(T),Fe=H(O),Ee=H(P),De=H(C),Ae=H(R),Ie=H(V),Ne=H(z),Te=H(B),Oe=H(U),Pe=H(Y);var Ce,Re=function(e){if("object"!==ie.default(e)||null===e)return!1;var t=Ne.default(e);if(null===t)return!0;for(var r=t;null!==Ne.default(r);)r=Ne.default(r);return t===r},Ve=function(e){return!isNaN(ke.default(e))},ze=function e(t,r){var a,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},l=Le.default({},t);return Ee.default(a=De.default(r)).call(a,(function(t){var r=oe.default(t,2),a=r[0],u=r[1];if(a in l)if("object"===ie.default(u)&&null!==u)if(Se.default(u)){if(0===n.array)l[a]=u;else if(1===n.array){var s;l[a]=$e.default(s=[]).call(s,ce.default(l[a]),ce.default(u))}else if(2===n.array){var i;l[a]=ce.default(new Te.default($e.default(i=[]).call(i,ce.default(l[a]),ce.default(u))))}}else l[a]=e(l[a],u,n);else l[a]=u;else l[a]=u})),l},Be=function(e){return null===e?"Null":void 0===e?"Undefined":"function"==typeof e?"Function":e.constructor&&e.constructor.name},Ue=function(){function e(){ae.default(this,e),this._callbacks=[]}var t;return ne.default(e,[{key:"on",value:function(e){var t;pe.default(t=this._callbacks).call(t,e)||this._callbacks.push(e)}},{key:"off",value:function(e){for(var t=0;t0&&void 0!==arguments[0]?arguments[0]:{},r=arguments.length>1?arguments[1]:void 0;if(ae.default(this,e),this._id=t.id||(new Date).getTime().toString()+ke.default(1e3*Math.random()),this._languages=t.languages,this._defaultLanguage=t.defaultLanguage||"zh",this._activeLanguage=t.activeLanguage,this._default=t.default,this._messages=t.messages,this._idMap=t.idMap,this._formatters=t.formatters,this._loaders=t.loaders,this._global=null,this._patchMessages={},this.$cache={activeLanguage:null,typedFormatters:{},formatters:{}},!Oe.default.VoerkaI18n){var a=jt.I18nManager;Oe.default.VoerkaI18n=new a({defaultLanguage:this.defaultLanguage,activeLanguage:this.activeLanguage,languages:t.languages})}this.global=Oe.default.VoerkaI18n,this._mergePatchedMessages(),this._patch(this._messages,newLanguage),this._loading=!1,this.register(r)}var t,r;return ne.default(e,[{key:"id",get:function(){return this._id}},{key:"defaultLanguage",get:function(){return this._defaultLanguage}},{key:"activeLanguage",get:function(){return this._activeLanguage}},{key:"default",get:function(){return this._default}},{key:"messages",get:function(){return this._messages}},{key:"idMap",get:function(){return this._idMap}},{key:"formatters",get:function(){return this._formatters}},{key:"languages",get:function(){return this._languages}},{key:"loaders",get:function(){return this._loaders}},{key:"global",get:function(){return this._global},set:function(e){this._global=e}},{key:"register",value:function(e){"function"===!ie.default(e)&&(e=function(){}),this.global.register(this).then(e).catch(e)}},{key:"registerFormatter",value:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},a=r.language,n=void 0===a?"*":a;if("function"===!ie.default(t)||"string"!=typeof e)throw new TypeError("Formatter must be a function");pe.default(He).call(He,e)?this.formatters[n].$types[e]=t:this.formatters[n][e]=t}},{key:"registerDefaultLoader",value:function(e){this.global.registerDefaultLoader(e)}},{key:"_fallback",value:function(){this._messages=this._default,this._activeLanguage=this.defaultLanguage}},{key:"refresh",value:(r=re.default(he.default.mark((function e(t){var r,a,n;return he.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this._loading=Ie.default.resolve(),t||(t=this.activeLanguage),t!==this.defaultLanguage){e.next=7;break}return this._messages=this._default,e.next=6,this._patch(this._messages,t);case 6:return e.abrupt("return");case 7:if(r=this.loaders[t],e.prev=8,"function"!=typeof r){e.next=18;break}return e.next=12,r();case 12:return this._messages=e.sent.default,this._activeLanguage=t,e.next=16,this._patch(this._messages,t);case 16:e.next=26;break;case 18:if("function"!=typeof this.global.defaultMessageLoader){e.next=25;break}return e.next=21,this.global.loadMessagesFromDefaultLoader(t,this);case 21:this._messages=e.sent,this._activeLanguage=t,e.next=26;break;case 25:this._fallback();case 26:e.next=32;break;case 28:e.prev=28,e.t0=e.catch(8),console.warn($e.default(a=$e.default(n="Error while loading language <".concat(t,"> on i18nScope(")).call(n,this.id,"): ")).call(a,e.t0.message)),this._fallback();case 32:case"end":return e.stop()}}),e,this,[[8,28]])}))),function(e){return r.apply(this,arguments)})},{key:"_patch",value:(t=re.default(he.default.mark((function e(t,r){var a;return he.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if("function"==typeof this.global.loadMessagesFromDefaultLoader){e.next=2;break}return e.abrupt("return");case 2:return e.prev=2,e.next=5,this.global.loadMessagesFromDefaultLoader(r,this);case 5:a=e.sent,Ye(a)&&(Le.default(t,a),this._savePatchedMessages(a,r)),e.next=11;break;case 9:e.prev=9,e.t0=e.catch(2);case 11:case"end":return e.stop()}}),e,this,[[2,9]])}))),function(e,r){return t.apply(this,arguments)})},{key:"_mergePatchedMessages",value:function(){var e=this._getPatchedMessages(this.activeLanguage);Ye(e)&&Le.default(this._messages,e)}},{key:"_savePatchedMessages",value:function(e,t){try{var r;if(Oe.default.localStorage)Oe.default.localStorage.setItem($e.default(r="voerkai18n_".concat(this.id,"_")).call(r,t,"_patched_messages"),Me.default(e))}catch(e){console.error("Error while save voerkai18n patched messages:",e.message)}}},{key:"_getPatchedMessages",value:function(e){try{var t;return JSON.parse(localStorage.getItem($e.default(t="voerkai18n_".concat(this.id,"_")).call(t,e,"_patched_messages")))}catch(e){return{}}}},{key:"on",get:function(){var e;return Pe.default(e=this.global.on).call(e,this.global)}},{key:"off",get:function(){var e;return Pe.default(e=this.global.off).call(e,this.global)}},{key:"offAll",get:function(){var e;return Pe.default(e=this.global.offAll).call(e,this.global)}},{key:"change",get:function(){var e;return Pe.default(e=this.global.change).call(e,this.global)}}]),e}();function We(e){var t=function(){if("undefined"==typeof Reflect||!te.default)return!1;if(te.default.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(te.default(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var r,a=se.default(e);if(t){var n=se.default(this).constructor;r=te.default(a,arguments,n)}else r=a.apply(this,arguments);return ue.default(this,r)}}function Ge(e,t){var r=void 0!==Z.default&&ee.default(e)||e["@@iterator"];if(!r){if(Se.default(e)||(r=function(e,t){var r;if(!e)return;if("string"==typeof e)return Ke(e,t);var a=Ae.default(r=Object.prototype.toString.call(e)).call(r,8,-1);"Object"===a&&e.constructor&&(a=e.constructor.name);if("Map"===a||"Set"===a)return X.default(e);if("Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a))return Ke(e,t)}(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var a=0,n=function(){};return{s:n,n:function(){return a>=e.length?{done:!0}:{done:!1,value:e[a++]}},e:function(e){throw e},f:n}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var l,u=!0,s=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return u=e.done,e},e:function(e){s=!0,l=e},f:function(){try{u||null==r.return||r.return()}finally{if(s)throw l}}}}function Ke(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,a=new Array(t);r]+)>/g,(function(e,t){return"$"+l[t]})))}if("function"==typeof n){var u=this;return e[Q.default].call(this,r,(function(){var e=arguments;return"object"!=ie.default(e[e.length-1])&&(e=Ae.default([]).call(e)).push(a(e,u)),n.apply(this,e)}))}return e[Q.default].call(this,r,n)},Qe.apply(this,arguments)}var Xe=Be,Ze=Ve,et=Re,tt=ze,rt=Ue,at=Je,nt={"*":{$types:{Date:function(e){return e.toLocaleString()}},time:function(e){return e.toLocaleTimeString()},shorttime:function(e){return e.toLocaleTimeString()},date:function(e){return e.toLocaleDateString()},dict:function(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),a=1;a0&&r.length%2!=0?r[r.length-1]:e}},zh:{$types:{Date:function(e){var t,r,a,n,l;return $e.default(t=$e.default(r=$e.default(a=$e.default(n=$e.default(l="".concat(e.getFullYear(),"年")).call(l,e.getMonth()+1,"月")).call(n,e.getDate(),"日 ")).call(a,e.getHours(),"点")).call(r,e.getMinutes(),"分")).call(t,e.getSeconds(),"秒")}},shortime:function(e){return e.toLocaleTimeString()},time:function(e){var t,r;return $e.default(t=$e.default(r="".concat(e.getHours(),"点")).call(r,e.getMinutes(),"分")).call(t,e.getSeconds(),"秒")},date:function(e){var t,r;return $e.default(t=$e.default(r="".concat(e.getFullYear(),"年")).call(r,e.getMonth()+1,"月")).call(t,e.getDate(),"日")},shortdate:function(e){var t,r;return $e.default(t=$e.default(r="".concat(e.getFullYear(),"-")).call(r,e.getMonth()+1,"-")).call(t,e.getDate())},currency:function(e){return"".concat(e,"元")}},en:{currency:function(e){return"$".concat(e)}}},lt=Qe(/\{\s*(\w+)?((\s*\|\s*\w*(\(.*\))?\s*)*)\s*\}/g,{varname:1,formatters:2});function ut(e){return pe.default(e).call(e,"{")&&pe.default(e).call(e,"}")}be.default(Ce||(Ce=fe.default(["{s*{varname}s*}"],["\\{\\s*{varname}\\s*\\}"])));var st=["String","Number","Boolean","Object","Array","Function","Error","Symbol","RegExp","Date","Null","Undefined","Set","Map","WeakSet","WeakMap"];function it(e){var t,r;if(!e)return[];var a=ve.default(t=me.default(r=me.default(e).call(e).substr(1)).call(r).split("|")).call(t,(function(e){return me.default(e).call(e)}));return ve.default(a).call(a,(function(e){var t=ye.default(e).call(e,"("),r=je.default(e).call(e,")");if(-1!==t&&-1!==r){var a,n,l=me.default(a=e.substr(t+1,r-t-1)).call(a),u=""==l?[]:ve.default(n=l.split(",")).call(n,(function(e){if(e=me.default(e).call(e),!isNaN(ke.default(e)))return ke.default(e);if(_e.default(e).call(e,'"')&&xe.default(e).call(e,'"')||_e.default(e).call(e,"'")&&xe.default(e).call(e,"'"))return e.substr(1,e.length-2);if("true"===e.toLowerCase()||"false"===e.toLowerCase())return"true"===e.toLowerCase();if(!(_e.default(e).call(e,"{")&&xe.default(e).call(e,"}")||_e.default(e).call(e,"[")&&xe.default(e).call(e,"]")))return String(e);try{return JSON.parse(e)}catch(t){return String(e)}}));return[e.substr(0,t),u]}return[e,[]]}))}function ct(e,t){var r,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=e,l=Le.default({replaceAll:!0},a);for(lt.lastIndex=0;null!==(r=lt.exec(n));){var u=r.groups.varname||"",s=it(r.groups.formatters);if("function"==typeof t)try{n=we.default(l)?we.default(n).call(n,r[0],t(u,s,r[0])):n.replace(r[0],t(u,s,r[0]))}catch(e){break}lt.lastIndex=0}return n}function ot(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;e.$cache={activeLanguage:t,typedFormatters:{},formatters:{}}}function ft(e,t,r){var a,n=[],l=Ge(r);try{var u=function(){var r=a.value;if(r[0]){var l=function(e,t,r){if(e.$cache||ot(e),e.$cache.activeLanguage===t){if(r in e.$cache.formatters)return e.$cache.formatters[r]}else ot(e,t);for(var a=0,n=[e.formatters,e.global.formatters];a1?a-1:0),l=1;li)return dt(t,r,a,s[i++]);throw new Error}),{replaceAll:!1})}var ht={defaultLanguage:"zh",activeLanguage:"zh",languages:[{name:"zh",title:"中文",default:!0},{name:"en",title:"英文"}],formatters:nt};function bt(e){return ke.default(e)>0}function pt(e,t){try{return Se.default(e)?e.length>t?e[t]:e[e.length-1]:e}catch(t){return Se.default(e)?e[0]:e}}function vt(e){var t,r,a,n,l,u,s,i;return we.default(t=we.default(r=we.default(a=we.default(n=we.default(l=we.default(u=we.default(s=we.default(i=we.default(e).call(e,/\\(?![trnbvf'"]{1})/g,"\\\\")).call(i,"\t","\\t")).call(s,"\n","\\n")).call(u,"\b","\\b")).call(l,"\r","\\r")).call(n,"\f","\\f")).call(a,"'","\\'")).call(r,'"','\\"')).call(t,"\v","\\v")}function mt(e){var t,r,a,n,l,u,s,i;return we.default(t=we.default(r=we.default(a=we.default(n=we.default(l=we.default(u=we.default(s=we.default(i=we.default(e).call(e,"\\t","\t")).call(i,"\\n","\n")).call(s,"\\b","\b")).call(u,"\\r","\r")).call(l,"\\f","\f")).call(n,"\\'","'")).call(a,'\\"','"')).call(r,"\\v","\v")).call(t,/\\\\(?![trnbvf'"]{1})/g,"\\")}var yt=function(e){de.default(s,e);var t,r,a,n,l,u=We(s);function s(){var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return ae.default(this,s),e=u.call(this),null!=s.instance||(s.instance=le.default(e),e._settings=tt(ht,t),e._scopes=[],e._defaultMessageLoader=null),ue.default(e,s.instance)}return ne.default(s,[{key:"settings",get:function(){return this._settings}},{key:"scopes",get:function(){return this._scopes}},{key:"activeLanguage",get:function(){return this._settings.activeLanguage}},{key:"defaultLanguage",get:function(){return this._settings.defaultLanguage}},{key:"languages",get:function(){return this._settings.languages}},{key:"formatters",get:function(){return nt}},{key:"defaultMessageLoader",get:function(){return this._defaultMessageLoader}},{key:"loadMessagesFromDefaultLoader",value:(l=re.default(he.default.mark((function e(t,r){return he.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if("function"==typeof this._defaultMessageLoader){e.next=2;break}return e.abrupt("return");case 2:return e.next=4,this._defaultMessageLoader.call(r,t,r);case 4:return e.abrupt("return",e.sent);case 5:case"end":return e.stop()}}),e,this)}))),function(e,t){return l.apply(this,arguments)})},{key:"change",value:(n=re.default(he.default.mark((function e(t){var r;return he.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=me.default(t).call(t),-1===qe.default(r=this.languages).call(r,(function(e){return e.name===t}))&&"function"!=typeof this._defaultMessageLoader){e.next=9;break}return e.next=4,this._refreshScopes(t);case 4:return this._settings.activeLanguage=t,e.next=7,this.emit(t);case 7:e.next=10;break;case 9:throw new Error("Not supported language:"+t);case 10:case"end":return e.stop()}}),e,this)}))),function(e){return n.apply(this,arguments)})},{key:"_refreshScopes",value:(a=re.default(he.default.mark((function e(t){var r,a;return he.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,a=ve.default(r=this._scopes).call(r,(function(e){return e.refresh(t)})),!Ie.default.allSettled){e.next=7;break}return e.next=5,Ie.default.allSettled(a);case 5:e.next=9;break;case 7:return e.next=9,Ie.default.all(a);case 9:e.next=14;break;case 11:e.prev=11,e.t0=e.catch(0),console.warn("Error while refreshing i18n scopes:",e.t0.message);case 14:case"end":return e.stop()}}),e,this,[[0,11]])}))),function(e){return a.apply(this,arguments)})},{key:"register",value:(r=re.default(he.default.mark((function e(t){return he.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t instanceof at){e.next=2;break}throw new TypeError("Scope must be an instance of I18nScope");case 2:return this._scopes.push(t),e.next=5,t.refresh(this.activeLanguage);case 5:case"end":return e.stop()}}),e,this)}))),function(e){return r.apply(this,arguments)})},{key:"registerFormatter",value:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},a=r.language,n=void 0===a?"*":a;if("function"===!ie.default(t)||"string"!=typeof e)throw new TypeError("Formatter must be a function");pe.default(st).call(st,e)?this.formatters[n].$types[e]=t:this.formatters[n][e]=t}},{key:"registerDefaultLoader",value:function(e){if("function"!=typeof e)throw new Error("The default loader must be a async function or promise returned");this._defaultMessageLoader=e,this.refresh()}},{key:"refresh",value:(t=re.default(he.default.mark((function e(){var t,r;return he.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,r=ve.default(t=this._scopes).call(t,(function(e){return e.refresh()})),!Ie.default.allSettled){e.next=7;break}return e.next=5,Ie.default.allSettled(r);case 5:e.next=9;break;case 7:return e.next=9,Ie.default.all(r);case 9:e.next=13;break;case 11:e.prev=11,e.t0=e.catch(0);case 13:case"end":return e.stop()}}),e,this,[[0,11]])}))),function(){return t.apply(this,arguments)})}]),s}(rt),jt={getInterpolatedVars:function(e){var t=[];return ct(e,(function(e,r,a){var n={name:e,formatters:ve.default(r).call(r,(function(e){var t=oe.default(e,2);return{name:t[0],args:t[1]}})),match:a};return-1===qe.default(t).call(t,(function(e){return e.name===n.name&&n.formatters.toString()==e.formatters.toString()}))&&t.push(n),""})),t},replaceInterpolatedVars:gt,I18nManager:yt,translate:function(e){var t=this,r=t.global.activeLanguage,a=e,n=[],l=[],u=null;if("string"===!ie.default(e))return e;try{var s,i;if(2===arguments.length&&et(arguments[1]))Ee.default(s=De.default(arguments[1])).call(s,(function(e){var t=oe.default(e,2),r=t[0],a=t[1];if("function"==typeof a)try{n[r]=a()}catch(e){n[r]=a}_e.default(r).call(r,"$")&&"number"==typeof n[r]&&l.push(r)})),n=[arguments[1]];else if(arguments.length>=2){var c,o;n=ve.default(c=Fe.default(o=Ae.default(Array.prototype).call(arguments)).call(o,1)).call(c,(function(e,t){try{e="function"==typeof e?e():e,Ze(e)&&(u=ke.default(e))}catch(e){}return e}))}if(r===t.defaultLanguage)bt(a)&&(a=t.default[a]||e);else{var f=bt(a)?a:t.idMap[vt(a)];a=t.messages[f]||a,a=Se.default(a)?ve.default(a).call(a,(function(e){return mt(e)})):mt(a)}return Se.default(a)&&a.length>0&&(a=null!==u?pt(a,u):pluralVar.length>0?pt(a,ke.default(n(pluralVar[0]))):a[0]),0==n.length?a:gt.call.apply(gt,$e.default(i=[t,a]).call(i,ce.default(n)))}catch(e){return a}},i18nScope:at,defaultLanguageSettings:ht,getDataTypeName:Xe,isNumber:Ze,isPlainObject:et};module.exports=jt; -//# sourceMappingURL=index.cjs.map diff --git a/packages/runtime/dist/index.cjs.map b/packages/runtime/dist/index.cjs.map deleted file mode 100644 index ea41723..0000000 --- a/packages/runtime/dist/index.cjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.cjs","sources":["../utils.js","../eventemitter.js","../scope.js","../index.js","../formatters.js"],"sourcesContent":["\r\n/**\r\n * 判断是否是JSON对象\r\n * @param {*} obj \r\n * @returns \r\n */\r\n function isPlainObject(obj){\r\n if (typeof obj !== 'object' || obj === null) return false;\r\n var proto = Object.getPrototypeOf(obj);\r\n if (proto === null) return true;\r\n var baseProto = proto;\r\n\r\n while (Object.getPrototypeOf(baseProto) !== null) {\r\n baseProto = Object.getPrototypeOf(baseProto);\r\n }\r\n return proto === baseProto; \r\n}\r\n\r\nfunction isNumber(value){\r\n return !isNaN(parseInt(value))\r\n}\r\n \r\n/**\r\n * 简单进行对象合并\r\n * \r\n * options={\r\n * array:0 , // 数组合并策略,0-替换,1-合并,2-去重合并\r\n * }\r\n * \r\n * @param {*} toObj \r\n * @param {*} formObj \r\n * @returns 合并后的对象\r\n */\r\nfunction deepMerge(toObj,formObj,options={}){\r\n let results = Object.assign({},toObj)\r\n Object.entries(formObj).forEach(([key,value])=>{\r\n if(key in results){\r\n if(typeof value === \"object\" && value !== null){\r\n if(Array.isArray(value)){\r\n if(options.array === 0){\r\n results[key] = value\r\n }else if(options.array === 1){\r\n results[key] = [...results[key],...value]\r\n }else if(options.array === 2){\r\n results[key] = [...new Set([...results[key],...value])]\r\n }\r\n }else{\r\n results[key] = deepMerge(results[key],value,options)\r\n }\r\n }else{\r\n results[key] = value\r\n }\r\n }else{\r\n results[key] = value\r\n }\r\n })\r\n return results\r\n}\r\n\r\n\r\n/**\r\n * 获取指定变量类型名称\r\n * getDataTypeName(1) == Number\r\n * getDataTypeName(\"\") == String\r\n * getDataTypeName(null) == Null\r\n * getDataTypeName(undefined) == Undefined\r\n * getDataTypeName(new Date()) == Date\r\n * getDataTypeName(new Error()) == Error\r\n * \r\n * @param {*} v \r\n * @returns \r\n */\r\n function getDataTypeName(v){\r\n\tif (v === null) return 'Null' \r\n\tif (v === undefined) return 'Undefined' \r\n if(typeof(v)===\"function\") return \"Function\"\r\n\treturn v.constructor && v.constructor.name;\r\n};\r\n\r\n\r\n\r\n\r\n\r\nmodule.exports ={\r\n isPlainObject,\r\n isNumber,\r\n deepMerge,\r\n getDataTypeName\r\n}","/**\r\n* \r\n* 简单的事件触发器\r\n* \r\n*/\r\nmodule.exports = class EventEmitter{\r\n constructor(){\r\n this._callbacks = []\r\n }\r\n on(callback){\r\n if(this._callbacks.includes(callback)) return\r\n this._callbacks.push(callback)\r\n }\r\n off(callback){\r\n for(let i=0;icb(...args)))\r\n }else{\r\n await Promise.all(this._callbacks.map(cb=>cb(...args)))\r\n }\r\n } \r\n}","const { isPlainObject } = require(\"./utils\")\r\n\r\nconst DataTypes = [\"String\",\"Number\",\"Boolean\",\"Object\",\"Array\",\"Function\",\"Null\",\"Undefined\",\"Symbol\",\"Date\",\"RegExp\",\"Error\"];\r\n\r\nmodule.exports = class i18nScope {\r\n constructor(options={},callback){\r\n // 每个作用域都有一个唯一的id\r\n this._id = options.id || (new Date().getTime().toString()+parseInt(Math.random()*1000))\r\n this._languages = options.languages // 当前作用域的语言列表\r\n this._defaultLanguage = options.defaultLanguage || \"zh\" // 默认语言名称\r\n this._activeLanguage = options.activeLanguage // 当前语言名称\r\n this._default = options.default // 默认语言包\r\n this._messages = options.messages // 当前语言包\r\n this._idMap = options.idMap // 消息id映射列表\r\n this._formatters = options.formatters // 当前作用域的格式化函数列表\r\n this._loaders = options.loaders // 异步加载语言文件的函数列表\r\n this._global = null // 引用全局VoerkaI18n配置,注册后自动引用 \r\n this._patchMessages = {} // 语言包补丁信息 {:{....},:{....}}\r\n // 主要用来缓存格式化器的引用,当使用格式化器时可以直接引用,避免检索\r\n this.$cache={\r\n activeLanguage : null,\r\n typedFormatters: {},\r\n formatters : {},\r\n }\r\n // 如果不存在全局VoerkaI18n实例,说明当前Scope是唯一或第一个加载的作用域,\r\n // 则使用当前作用域来初始化全局VoerkaI18n实例\r\n if(!globalThis.VoerkaI18n){\r\n const { I18nManager } = require(\"./\")\r\n globalThis.VoerkaI18n = new I18nManager({\r\n defaultLanguage: this.defaultLanguage,\r\n activeLanguage : this.activeLanguage,\r\n languages: options.languages,\r\n })\r\n } \r\n this.global = globalThis.VoerkaI18n \r\n this._mergePatchedMessages()\r\n this._patch(this._messages,newLanguage) \r\n // 正在加载语言包标识\r\n this._loading=false\r\n // 在全局注册作用域\r\n this.register(callback)\r\n }\r\n // 作用域\r\n get id(){return this._id}\r\n // 默认语言名称\r\n get defaultLanguage(){return this._defaultLanguage}\r\n // 默认语言名称\r\n get activeLanguage(){return this._activeLanguage}\r\n // 默认语言包\r\n get default(){return this._default}\r\n // 当前语言包\r\n get messages(){return this._messages}\r\n // 消息id映射列表\r\n get idMap(){return this._idMap}\r\n // 当前作用域的格式化函数列表\r\n get formatters(){return this._formatters}\r\n // 当前作用域支持的语言\r\n get languages(){return this._languages}\r\n // 异步加载语言文件的函数列表\r\n get loaders(){return this._loaders}\r\n // 引用全局VoerkaI18n配置,注册后自动引用\r\n get global(){return this._global}\r\n set global(value){this._global = value}\r\n /**\r\n * 在全局注册作用域\r\n * @param {*} callback 当注册\r\n */\r\n register(callback){\r\n if(!typeof(callback)===\"function\") callback = ()=>{} \r\n this.global.register(this).then(callback).catch(callback) \r\n }\r\n registerFormatter(name,formatter,{language=\"*\"}={}){\r\n if(!typeof(formatter)===\"function\" || typeof(name)!==\"string\"){\r\n throw new TypeError(\"Formatter must be a function\")\r\n } \r\n if(DataTypes.includes(name)){\r\n this.formatters[language].$types[name] = formatter\r\n }else{\r\n this.formatters[language][name] = formatter\r\n }\r\n }\r\n /**\r\n * 注册默认文本信息加载器\r\n * @param {Function} 必须是异步函数或者是返回Promise\r\n */\r\n registerDefaultLoader(fn){\r\n this.global.registerDefaultLoader(fn)\r\n }\r\n /**\r\n * 回退到默认语言\r\n */\r\n _fallback(){\r\n this._messages = this._default \r\n this._activeLanguage = this.defaultLanguage\r\n }\r\n /**\r\n * 刷新当前语言包\r\n * @param {*} newLanguage \r\n */\r\n async refresh(newLanguage){\r\n this._loading = Promise.resolve()\r\n if(!newLanguage) newLanguage = this.activeLanguage\r\n // 默认语言,默认语言采用静态加载方式,只需要简单的替换即可\r\n if(newLanguage === this.defaultLanguage){\r\n this._messages = this._default\r\n await this._patch(this._messages,newLanguage) // 异步补丁\r\n return \r\n }\r\n // 非默认语言需要异步加载语言包文件,加载器是一个异步函数\r\n // 如果没有加载器,则无法加载语言包,因此回退到默认语言\r\n let loader = this.loaders[newLanguage]\r\n try{\r\n if(typeof(loader) === \"function\"){\r\n this._messages = (await loader()).default\r\n this._activeLanguage = newLanguage \r\n await this._patch(this._messages,newLanguage) \r\n }else if(typeof(this.global.defaultMessageLoader) === \"function\"){// 如果该语言没有指定加载器,则使用全局配置的默认加载器\r\n this._messages = await this.global.loadMessagesFromDefaultLoader(newLanguage,this)\r\n this._activeLanguage = newLanguage\r\n }else{\r\n this._fallback()\r\n }\r\n }catch(e){\r\n console.warn(`Error while loading language <${newLanguage}> on i18nScope(${this.id}): ${e.message}`)\r\n this._fallback()\r\n } \r\n }\r\n /**\r\n * 当指定了默认语言包加载器后,会从服务加载语言补丁包来更新本地的语言包\r\n * \r\n * 补丁包会自动存储到本地的LocalStorage中 \r\n * \r\n * @param {*} messages \r\n * @param {*} newLanguage \r\n * @returns \r\n */\r\n async _patch(messages,newLanguage){\r\n if(typeof(this.global.loadMessagesFromDefaultLoader) !== 'function') return\r\n try{\r\n let pachedMessages = await this.global.loadMessagesFromDefaultLoader(newLanguage,this)\r\n if(isPlainObject(pachedMessages)){\r\n Object.assign(messages,pachedMessages)\r\n this._savePatchedMessages(pachedMessages,newLanguage)\r\n }\r\n }catch{}\r\n }\r\n /**\r\n * 从本地存储中读取语言包补丁合并到当前语言包中\r\n */\r\n _mergePatchedMessages(){ \r\n let patchedMessages= this._getPatchedMessages(this.activeLanguage)\r\n if(isPlainObject(patchedMessages)){\r\n Object.assign(this._messages,patchedMessages)\r\n }\r\n }\r\n /**\r\n * 将读取的补丁包保存到本地的LocalStorage中\r\n * \r\n * 为什么要保存到本地的LocalStorage中?\r\n * \r\n * 因为默认语言是静态嵌入到源码中的,而加载语言包补丁是延后异步的,\r\n * 当应用启动第一次就会渲染出来的是没有打过补丁的内容。\r\n * \r\n * - 如果还需要等待从服务器加载语言补丁合并后再渲染会影响速度\r\n * - 如果不等待从服务器加载语言补丁就渲染,则会先显示未打补丁的内容,然后在打完补丁后再对应用进行重新渲染生效\r\n * 这明显不是个好的方式\r\n * \r\n * 因此,采用的方式是:\r\n * - 加载语言包补丁后,将之保存到到本地的LocalStorage中\r\n * - 当应用加载时会查询是否存在补丁,如果存在就会合并渲染\r\n * - \r\n * \r\n * @param {*} messages \r\n */\r\n _savePatchedMessages(messages,language){\r\n try{\r\n if(globalThis.localStorage){\r\n globalThis.localStorage.setItem(`voerkai18n_${this.id}_${language}_patched_messages`, JSON.stringify(messages));\r\n }\r\n }catch(e){\r\n console.error(\"Error while save voerkai18n patched messages:\",e.message)\r\n }\r\n }\r\n _getPatchedMessages(language){\r\n try{\r\n return JSON.parse(localStorage.getItem(`voerkai18n_${this.id}_${language}_patched_messages`))\r\n }catch(e){\r\n return {}\r\n }\r\n }\r\n // 以下方法引用全局VoerkaI18n实例的方法\r\n get on(){return this.global.on.bind(this.global)}\r\n get off(){return this.global.off.bind(this.global)}\r\n get offAll(){return this.global.offAll.bind(this.global)}\r\n get change(){\r\n return this.global.change.bind(this.global)\r\n }\r\n}","const { getDataTypeName,isNumber,isPlainObject,deepMerge } = require(\"./utils\")\r\nconst EventEmitter = require(\"./eventemitter\")\r\nconst i18nScope = require(\"./scope.js\")\r\nlet inlineFormatters = require(\"./formatters\") // 内置格式化器\r\n\r\n\r\n\r\n// 用来提取字符里面的插值变量参数 , 支持管道符 { var | formatter | formatter }\r\n// 不支持参数: let varWithPipeRegexp = /\\{\\s*(?\\w+)?(?(\\s*\\|\\s*\\w*\\s*)*)\\s*\\}/g\r\n\r\n// 支持参数: { var | formatter(x,x,..) | formatter }\r\nlet varWithPipeRegexp = /\\{\\s*(?\\w+)?(?(\\s*\\|\\s*\\w*(\\(.*\\)){0,1}\\s*)*)\\s*\\}/g\r\n\r\n// 插值变量字符串替换正则\r\n\r\n//let varReplaceRegexp =String.raw`\\{\\s*(?{name}\\.?\\w*)\\s*\\}`\r\n\r\n\r\nlet varReplaceRegexp =String.raw`\\{\\s*{varname}\\s*\\}`\r\n\r\n/**\r\n * 考虑到通过正则表达式进行插件的替换可能较慢,因此提供一个简单方法来过滤掉那些\r\n * 不需要进行插值处理的字符串\r\n * 原理很简单,就是判断一下是否同时具有{和}字符,如果有则认为可能有插值变量,如果没有则一定没有插件变量,则就不需要进行正则匹配\r\n * 从而可以减少不要的正则匹配\r\n * 注意:该方法只能快速判断一个字符串不包括插值变量\r\n * @param {*} str \r\n * @returns {boolean} true=可能包含插值变量,\r\n */\r\nfunction hasInterpolation(str){\r\n return str.includes(\"{\") && str.includes(\"}\")\r\n} \r\nconst DataTypes = [\"String\",\"Number\",\"Boolean\",\"Object\",\"Array\",\"Function\",\"Error\",\"Symbol\",\"RegExp\",\"Date\",\"Null\",\"Undefined\",\"Set\",\"Map\",\"WeakSet\",\"WeakMap\"]\r\n \r\n\r\n/**\r\n 通过正则表达式对原始文本内容进行解析匹配后得到的\r\n formatters=\"| aaa(1,1) | bbb \"\r\n\r\n 需要统一解析为\r\n\r\n [\r\n [aaa,[1,1]], // [formatter'name,[args,...]]\r\n [bbb,[]],\r\n ]\r\n\r\n formatters=\"| aaa(1,1,\"dddd\") | bbb \"\r\n\r\n 目前对参数采用简单的split(\",\")来解析,因为无法正确解析aaa(1,1,\"dd,,dd\")形式的参数\r\n 在此场景下基本够用了,如果需要支持更复杂的参数解析,可以后续考虑使用正则表达式来解析\r\n \r\n @returns [[,[,,...]]]\r\n */\r\nfunction parseFormatters(formatters){\r\n if(!formatters) return []\r\n // 1. 先解析为 [\"aaa()\",\"bbb\"]形式\r\n let result = formatters.trim().substr(1).trim().split(\"|\").map(r=>r.trim()) \r\n\r\n // 2. 解析格式化器参数\r\n return result.map(formatter=>{\r\n let firstIndex = formatter.indexOf(\"(\")\r\n let lastIndex = formatter.lastIndexOf(\")\")\r\n if(firstIndex!==-1 && lastIndex!==-1){ // 带参数的格式化器\r\n const argsContent = formatter.substr(firstIndex+1,lastIndex-firstIndex-1).trim()\r\n let args = argsContent==\"\" ? [] : argsContent.split(\",\").map(arg=>{\r\n arg = arg.trim()\r\n if(!isNaN(parseInt(arg))){\r\n return parseInt(arg) // 数字\r\n }else if((arg.startsWith('\\\"') && arg.endsWith('\\\"')) || (arg.startsWith('\\'') && arg.endsWith('\\'')) ){\r\n return arg.substr(1,arg.length-2) // 字符串\r\n }else if(arg.toLowerCase()===\"true\" || arg.toLowerCase()===\"false\"){\r\n return arg.toLowerCase()===\"true\" // 布尔值\r\n }else if((arg.startsWith('{') && arg.endsWith('}')) || (arg.startsWith('[') && arg.endsWith(']'))){ \r\n try{\r\n return JSON.parse(arg)\r\n }catch(e){\r\n return String(arg)\r\n }\r\n }else{\r\n return String(arg)\r\n }\r\n })\r\n return [formatter.substr(0,firstIndex),args]\r\n }else{// 不带参数的格式化器\r\n return [formatter,[]]\r\n } \r\n }) \r\n}\r\n\r\n/** \r\n * 提取字符串中的插值变量\r\n * // [\r\n // { \r\n name:<变量名称>,formatters:[{name:<格式化器名称>,args:[<参数>,<参数>,....]]}],<匹配字符串>],\r\n // ....\r\n // \r\n * @param {*} str \r\n * @param {*} isFull =true 保留所有插值变量 =false 进行去重\r\n * @returns {Array} \r\n * [\r\n * {\r\n * name:\"<变量名称>\",\r\n * formatters:[\r\n * {name:\"<格式化器名称>\",args:[<参数>,<参数>,....]},\r\n * {name:\"<格式化器名称>\",args:[<参数>,<参数>,....]},\r\n * ],\r\n * match:\"<匹配字符串>\"\r\n * },\r\n * ...\r\n * ]\r\n */\r\nfunction getInterpolatedVars(str){\r\n let vars = []\r\n forEachInterpolatedVars(str,(varName,formatters,match)=>{\r\n let varItem = {\r\n name:varName,\r\n formatters:formatters.map(([formatter,args])=>{\r\n return {\r\n name:formatter,\r\n args:args\r\n }\r\n }),\r\n match:match\r\n }\r\n if(vars.findIndex(varDef=>((varDef.name===varItem.name) && (varItem.formatters.toString() == varDef.formatters.toString())))===-1){\r\n vars.push(varItem) \r\n }\r\n return \"\"\r\n }) \r\n return vars\r\n}\r\n/**\r\n * 遍历str中的所有插值变量传递给callback,将callback返回的结果替换到str中对应的位置\r\n * @param {*} str \r\n * @param {Function(<变量名称>,[formatters],match[0])} callback \r\n * @returns 返回替换后的字符串\r\n */\r\nfunction forEachInterpolatedVars(str,callback,options={}){\r\n let result=str, match \r\n let opts = Object.assign({\r\n replaceAll:true, // 是否替换所有插值变量,当使用命名插值时应置为true,当使用位置插值时应置为false\r\n },options)\r\n varWithPipeRegexp.lastIndex=0\r\n while ((match = varWithPipeRegexp.exec(result)) !== null) {\r\n const varname = match.groups.varname || \"\"\r\n // 解析格式化器和参数 = [,[,[,,...]]]\r\n const formatters = parseFormatters(match.groups.formatters)\r\n if(typeof(callback)===\"function\"){\r\n try{\r\n if(opts.replaceAll){\r\n result=result.replaceAll(match[0],callback(varname,formatters,match[0]))\r\n }else{\r\n result=result.replace(match[0],callback(varname,formatters,match[0]))\r\n } \r\n }catch{// callback函数可能会抛出异常,如果抛出异常,则中断匹配过程\r\n break \r\n } \r\n }\r\n varWithPipeRegexp.lastIndex=0\r\n }\r\n return result\r\n}\r\n/**\r\n * 将要翻译内容提供了一个非文本内容时进行默认的转换\r\n * - 对函数则执行并取返回结果()\r\n * - 对Array和Object使用JSON.stringify\r\n * - 其他类型使用toString\r\n * \r\n * @param {*} value \r\n * @returns \r\n */\r\nfunction transformToString(value){\r\n let result = value\r\n if(typeof(result)===\"function\") result = value()\r\n if(!(typeof(result)===\"string\")){\r\n if(Array.isArray(result) || isPlainObject(result)){\r\n result = JSON.stringify(result)\r\n }else{\r\n result = result.toString()\r\n }\r\n }\r\n return result\r\n}\r\n\r\nfunction resetScopeCache(scope,activeLanguage=null){\r\n scope.$cache = {activeLanguage,typedFormatters:{},formatters:{}}\r\n}\r\n/**\r\n * 取得指定数据类型的默认格式化器 \r\n * \r\n * 可以为每一个数据类型指定一个默认的格式化器,当传入插值变量时,\r\n * 会自动调用该格式化器来对值进行格式化转换\r\n \r\n const formatters = { \r\n \"*\":{\r\n $types:{...} // 在所有语言下只作用于特定数据类型的格式化器\r\n }, // 在所有语言下生效的格式化器 \r\n zh:{ \r\n $types:{ \r\n [数据类型]:(value)=>{...},\r\n }, \r\n [格式化器名称]:(value)=>{...},\r\n [格式化器名称]:(value)=>{...},\r\n [格式化器名称]:(value)=>{...},\r\n },\r\n }\r\n * @param {*} scope \r\n * @param {*} activeLanguage \r\n * @param {*} dataType 数字类型\r\n * @returns {Function} 格式化函数 \r\n */\r\nfunction getDataTypeDefaultFormatter(scope,activeLanguage,dataType){\r\n if(!scope.$cache) resetScopeCache(scope)\r\n if(scope.$cache.activeLanguage === activeLanguage) {\r\n if(dataType in scope.$cache.typedFormatters) return scope.$cache.typedFormatters[dataType]\r\n }else{// 当语言切换时清空缓存\r\n resetScopeCache(scope,activeLanguage)\r\n }\r\n\r\n // 先在当前作用域中查找,再在全局查找\r\n const targets = [scope.formatters,scope.global.formatters] \r\n for(const target of targets){\r\n if(!target) continue\r\n // 优先在当前语言的$types中查找\r\n if((activeLanguage in target) && isPlainObject(target[activeLanguage].$types)){ \r\n let formatters = target[activeLanguage].$types \r\n if(dataType in formatters && typeof(formatters[dataType])===\"function\"){ \r\n return scope.$cache.typedFormatters[dataType] = formatters[dataType]\r\n } \r\n }\r\n // 在所有语言的$types中查找\r\n if((\"*\" in target) && isPlainObject(target[\"*\"].$types)){\r\n let formatters = target[\"*\"].$types \r\n if(dataType in formatters && typeof(formatters[dataType])===\"function\"){ \r\n return scope.$cache.typedFormatters[dataType] = formatters[dataType]\r\n } \r\n } \r\n } \r\n}\r\n\r\n/**\r\n * 获取指定名称的格式化器函数\r\n * @param {*} scope \r\n * @param {*} activeLanguage \r\n * @param {*} name 格式化器名称\r\n * @returns {Function} 格式化函数 \r\n */ \r\nfunction getFormatter(scope,activeLanguage,name){\r\n // 缓存格式化器引用,避免重复检索\r\n if(!scope.$cache) resetScopeCache(scope)\r\n if(scope.$cache.activeLanguage === activeLanguage) {\r\n if(name in scope.$cache.formatters) return scope.$cache.formatters[name]\r\n }else{// 当语言切换时清空缓存\r\n resetScopeCache(scope,activeLanguage)\r\n }\r\n // 先在当前作用域中查找,再在全局查找\r\n const targets = [scope.formatters,scope.global.formatters] \r\n for(const target of targets){\r\n // 优先在当前语言查找\r\n if(activeLanguage in target){ \r\n let formatters = target[activeLanguage] || {} \r\n if((name in formatters) && typeof(formatters[name])===\"function\") return scope.$cache.formatters[name] = formatters[name]\r\n }\r\n // 在所有语言的$types中查找\r\n let formatters = target[\"*\"] || {} \r\n if((name in formatters) && typeof(formatters[name])===\"function\") return scope.$cache.formatters[name] = formatters[name]\r\n } \r\n}\r\n\r\n/**\r\n * 执行格式化器并返回结果\r\n * @param {*} value \r\n * @param {*} formatters 多个格式化器顺序执行,前一个输出作为下一个格式化器的输入\r\n */\r\nfunction executeFormatter(value,formatters){\r\n if(formatters.length===0) return value\r\n let result = value\r\n try{\r\n for(let formatter of formatters){\r\n if(typeof(formatter) === \"function\") {\r\n result = formatter(result)\r\n }else{// 如果碰到无效的格式化器,则跳过过续的格式化器\r\n return result \r\n }\r\n }\r\n }catch(e){\r\n console.error(`Error while execute i18n formatter for ${value}: ${e.message} ` )\r\n } \r\n return result\r\n}\r\n/**\r\n * 将 [[格式化器名称,[参数,参数,...]],[格式化器名称,[参数,参数,...]]]格式化器转化为\r\n * \r\n * \r\n * \r\n * @param {*} scope \r\n * @param {*} activeLanguage \r\n * @param {*} formatters \r\n */\r\nfunction buildFormatters(scope,activeLanguage,formatters){\r\n let results = [] \r\n for(let formatter of formatters){\r\n if(formatter[0]){\r\n const func = getFormatter(scope,activeLanguage,formatter[0])\r\n if(typeof(func)===\"function\"){\r\n results.push((v)=>{\r\n return func(v,...formatter[1])\r\n })\r\n }else{\r\n // 格式化器无效或者没有定义时,查看当前值是否具有同名的原型方法,如果有则执行调用\r\n // 比如padStart格式化器是String的原型方法,不需要配置就可以直接作为格式化器调用\r\n results.push((v)=>{\r\n if(typeof(v[formatter[0]])===\"function\"){\r\n return v[formatter[0]].call(v,...formatter[1])\r\n }else{\r\n return v\r\n } \r\n }) \r\n } \r\n }\r\n }\r\n return results\r\n} \r\n\r\n/**\r\n * 将value经过格式化器处理后返回\r\n * @param {*} scope \r\n * @param {*} activeLanguage \r\n * @param {*} formatters \r\n * @param {*} value \r\n * @returns \r\n */\r\nfunction getFormattedValue(scope,activeLanguage,formatters,value){\r\n // 1. 取得格式化器函数列表\r\n const formatterFuncs = buildFormatters(scope,activeLanguage,formatters) \r\n // 2. 查找每种数据类型默认格式化器,并添加到formatters最前面,默认数据类型格式化器优先级最高\r\n const defaultFormatter = getDataTypeDefaultFormatter(scope,activeLanguage,getDataTypeName(value)) \r\n if(defaultFormatter){\r\n formatterFuncs.splice(0,0,defaultFormatter)\r\n } \r\n // 3. 执行格式化器\r\n value = executeFormatter(value,formatterFuncs) \r\n return value\r\n}\r\n\r\n/**\r\n * 字符串可以进行变量插值替换,\r\n * replaceInterpolatedVars(\"<模板字符串>\",{变量名称:变量值,变量名称:变量值,...})\r\n * replaceInterpolatedVars(\"<模板字符串>\",[变量值,变量值,...])\r\n * replaceInterpolatedVars(\"<模板字符串>\",变量值,变量值,...])\r\n * \r\n- 当只有两个参数并且第2个参数是{}时,将第2个参数视为命名变量的字典\r\n replaceInterpolatedVars(\"this is {a}+{b},{a:1,b:2}) --> this is 1+2\r\n- 当只有两个参数并且第2个参数是[]时,将第2个参数视为位置参数\r\n replaceInterpolatedVars\"this is {}+{}\",[1,2]) --> this is 1+2\r\n- 普通位置参数替换\r\n replaceInterpolatedVars(\"this is {a}+{b}\",1,2) --> this is 1+2\r\n- \r\nthis == scope == { formatters: {}, ... }\r\n* @param {*} template \r\n* @returns \r\n*/\r\nfunction replaceInterpolatedVars(template,...args) {\r\n const scope = this\r\n // 当前激活语言\r\n const activeLanguage = scope.global.activeLanguage \r\n let result=template\r\n\r\n // 没有变量插值则的返回原字符串 \r\n if(args.length===0 || !hasInterpolation(template)) return template \r\n\r\n // ****************************变量插值****************************\r\n if(args.length===1 && isPlainObject(args[0])){ \r\n // 读取模板字符串中的插值变量列表\r\n // [[var1,[formatter,formatter,...],match],[var2,[formatter,formatter,...],match],...}\r\n let varValues = args[0]\r\n return forEachInterpolatedVars(template,(varname,formatters)=>{\r\n let value = (varname in varValues) ? varValues[varname] : ''\r\n return getFormattedValue(scope,activeLanguage,formatters,value) \r\n }) \r\n }else{ \r\n // ****************************位置插值****************************\r\n // 如果只有一个Array参数,则认为是位置变量列表,进行展开\r\n const params=(args.length===1 && Array.isArray(args[0])) ? [...args[0]] : args \r\n if(params.length===0) return template // 没有变量则不需要进行插值处理,返回原字符串 \r\n let i = 0\r\n return forEachInterpolatedVars(template,(varname,formatters)=>{\r\n if(params.length>i){ \r\n return getFormattedValue(scope,activeLanguage,formatters,params[i++]) \r\n }else{\r\n throw new Error() // 抛出异常,停止插值处理\r\n }\r\n },{replaceAll:false})\r\n \r\n }\r\n return result\r\n} \r\n\r\n// 默认语言配置\r\nconst defaultLanguageSettings = { \r\n defaultLanguage: \"zh\",\r\n activeLanguage: \"zh\",\r\n languages:[\r\n {name:\"zh\",title:\"中文\",default:true},\r\n {name:\"en\",title:\"英文\"}\r\n ],\r\n formatters:inlineFormatters \r\n}\r\n\r\nfunction isMessageId(content){\r\n return parseInt(content)>0\r\n}\r\n/**\r\n * 根据值的单数和复数形式,从messages中取得相应的消息\r\n * \r\n * @param {*} messages 复数形式的文本内容 = [<=0时的内容>,<=1时的内容>,<=2时的内容>,...]\r\n * @param {*} value \r\n */\r\nfunction getPluraMessage(messages,value){\r\n try{\r\n if(Array.isArray(messages)){\r\n return messages.length > value ? messages[value] : messages[messages.length-1]\r\n }else{\r\n return messages\r\n }\r\n }catch{\r\n return Array.isArray(messages) ? messages[0] : messages\r\n }\r\n}\r\nfunction escape(str){\r\n return str.replaceAll(/\\\\(?![trnbvf'\"]{1})/g,\"\\\\\\\\\")\r\n .replaceAll(\"\\t\",\"\\\\t\")\r\n .replaceAll(\"\\n\",\"\\\\n\")\r\n .replaceAll(\"\\b\",\"\\\\b\")\r\n .replaceAll(\"\\r\",\"\\\\r\")\r\n .replaceAll(\"\\f\",\"\\\\f\")\r\n .replaceAll(\"\\'\",\"\\\\'\")\r\n .replaceAll('\\\"','\\\\\"')\r\n .replaceAll('\\v','\\\\v') \r\n}\r\nfunction unescape(str){\r\n return str\r\n .replaceAll(\"\\\\t\",\"\\t\")\r\n .replaceAll(\"\\\\n\",\"\\n\")\r\n .replaceAll(\"\\\\b\",\"\\b\")\r\n .replaceAll(\"\\\\r\",\"\\r\")\r\n .replaceAll(\"\\\\f\",\"\\f\")\r\n .replaceAll(\"\\\\'\",\"\\'\")\r\n .replaceAll('\\\\\"','\\\"')\r\n .replaceAll('\\\\v','\\v') \r\n .replaceAll(/\\\\\\\\(?![trnbvf'\"]{1})/g,\"\\\\\")\r\n}\r\n/**\r\n * 翻译函数\r\n * \r\n* translate(\"要翻译的文本内容\") 如果默认语言是中文,则不会进行翻译直接返回\r\n* translate(\"I am {} {}\",\"man\") == I am man 位置插值\r\n* translate(\"I am {p}\",{p:\"man\"}) 字典插值\r\n* translate(\"total {$count} items\", {$count:1}) //复数形式 \r\n* translate(\"total {} {} {} items\",a,b,c) // 位置变量插值\r\n * \r\n * this===scope 当前绑定的scope\r\n * \r\n */\r\nfunction translate(message) { \r\n const scope = this\r\n const activeLanguage = scope.global.activeLanguage \r\n let content = message\r\n let vars=[] // 插值变量列表\r\n let pluralVars= [] // 复数变量\r\n let pluraValue = null // 复数值\r\n if(!typeof(message)===\"string\") return message\r\n try{\r\n // 1. 预处理变量: 复数变量保存至pluralVars中 , 变量如果是Function则调用 \r\n if(arguments.length === 2 && isPlainObject(arguments[1])){\r\n Object.entries(arguments[1]).forEach(([name,value])=>{\r\n if(typeof(value)===\"function\"){\r\n try{\r\n vars[name] = value()\r\n }catch(e){\r\n vars[name] = value\r\n }\r\n } \r\n // 以$开头的视为复数变量\r\n if(name.startsWith(\"$\") && typeof(vars[name])===\"number\") pluralVars.push(name)\r\n })\r\n vars = [arguments[1]]\r\n }else if(arguments.length >= 2){\r\n vars = [...arguments].splice(1).map((arg,index)=>{\r\n try{\r\n arg = typeof(arg)===\"function\" ? arg() : arg \r\n // 位置参数中以第一个数值变量为复数变量\r\n if(isNumber(arg)) pluraValue = parseInt(arg) \r\n }catch(e){ }\r\n return arg \r\n })\r\n \r\n }\r\n \r\n \r\n \r\n\r\n // 3. 取得翻译文本模板字符串\r\n if(activeLanguage === scope.defaultLanguage){\r\n // 2.1 从默认语言中取得翻译文本模板字符串\r\n // 如果当前语言就是默认语言,不需要查询加载,只需要做插值变换即可\r\n // 当源文件运用了babel插件后会将原始文本内容转换为msgId\r\n // 如果是msgId则从scope.default中读取,scope.default=默认语言包={:}\r\n if(isMessageId(content)){\r\n content = scope.default[content] || message\r\n }\r\n }else{ \r\n // 2.2 从当前语言包中取得翻译文本模板字符串\r\n // 如果没有启用babel插件将源文本转换为msgId,需要先将文本内容转换为msgId\r\n // JSON.stringify在进行转换时会将\\t\\n\\r转换为\\\\t\\\\n\\\\r,这样在进行匹配时就出错 \r\n let msgId = isMessageId(content) ? content : scope.idMap[escape(content)] \r\n content = scope.messages[msgId] || content\r\n content = Array.isArray(content) ? content.map(v=>unescape(v)) : unescape(content)\r\n }\r\n // 2. 处理复数\r\n // 经过上面的处理,content可能是字符串或者数组\r\n // content = \"原始文本内容\" || 复数形式[\"原始文本内容\",\"原始文本内容\"....]\r\n // 如果是数组说明要启用复数机制,需要根据插值变量中的某个变量来判断复数形式\r\n if(Array.isArray(content) && content.length>0){\r\n // 如果存在复数命名变量,只取第一个复数变量\r\n if(pluraValue!==null){ // 启用的是位置插值,pluraIndex=第一个数字变量的位置\r\n content = getPluraMessage(content,pluraValue)\r\n }else if(pluralVar.length>0){\r\n content = getPluraMessage(content,parseInt(vars(pluralVar[0])))\r\n }else{ // 如果找不到复数变量,则使用第一个内容\r\n content = content[0]\r\n }\r\n } \r\n \r\n // 进行插值处理\r\n if(vars.length==0){\r\n return content\r\n }else{\r\n return replaceInterpolatedVars.call(scope,content,...vars)\r\n } \r\n }catch(e){\r\n return content // 出错则返回原始文本\r\n } \r\n}\r\n \r\n/** \r\n * 多语言管理类\r\n * \r\n * 当导入编译后的多语言文件时(import(\"./languages\")),会自动生成全局实例VoerkaI18n\r\n * \r\n * VoerkaI18n.languages // 返回支持的语言列表\r\n * VoerkaI18n.defaultLanguage // 默认语言\r\n * VoerkaI18n.language // 当前语言\r\n * VoerkaI18n.change(language) // 切换到新的语言 \r\n * \r\n * \r\n * VoerkaI18n.on(\"change\",(language)=>{}) // 注册语言切换事件\r\n * VoerkaI18n.off(\"change\",(language)=>{}) \r\n * \r\n * */ \r\n class I18nManager extends EventEmitter{\r\n constructor(settings={}){\r\n super()\r\n if(I18nManager.instance!=null){\r\n return I18nManager.instance;\r\n }\r\n I18nManager.instance = this;\r\n this._settings = deepMerge(defaultLanguageSettings,settings)\r\n this._scopes=[] \r\n this._defaultMessageLoader = null // 默认文本加载器\r\n return I18nManager.instance;\r\n }\r\n get settings(){ return this._settings }\r\n get scopes(){ return this._scopes }\r\n // 当前激活语言\r\n get activeLanguage(){ return this._settings.activeLanguage}\r\n // 默认语言\r\n get defaultLanguage(){ return this._settings.defaultLanguage}\r\n // 支持的语言列表\r\n get languages(){ return this._settings.languages}\r\n // 内置格式化器\r\n get formatters(){ return inlineFormatters }\r\n get defaultMessageLoader(){ return this._defaultMessageLoader}\r\n // 通过默认加载器加载文件\r\n async loadMessagesFromDefaultLoader(newLanguage,scope){\r\n if(typeof(this._defaultMessageLoader) != \"function\") return //throw new Error(\"No default message loader specified\")\r\n return await this._defaultMessageLoader.call(scope,newLanguage,scope) \r\n }\r\n /**\r\n * 切换语言\r\n */\r\n async change(value){\r\n value=value.trim()\r\n if(this.languages.findIndex(lang=>lang.name === value)!==-1 || typeof(this._defaultMessageLoader)===\"function\"){\r\n // 通知所有作用域刷新到对应的语言包\r\n await this._refreshScopes(value)\r\n this._settings.activeLanguage = value \r\n await this.emit(value) /// 触发语言切换事件\r\n }else{\r\n throw new Error(\"Not supported language:\"+value)\r\n }\r\n }\r\n /**\r\n * 当切换语言时调用此方法来加载更新语言包\r\n * @param {*} newLanguage \r\n */\r\n async _refreshScopes(newLanguage){ \r\n // 并发执行所有作用域语言包的加载\r\n try{\r\n const scopeRefreshers = this._scopes.map(scope=>{\r\n return scope.refresh(newLanguage)\r\n })\r\n if(Promise.allSettled){\r\n await Promise.allSettled(scopeRefreshers)\r\n }else{\r\n await Promise.all(scopeRefreshers)\r\n } \r\n }catch(e){\r\n console.warn(\"Error while refreshing i18n scopes:\",e.message)\r\n } \r\n }\r\n /**\r\n * \r\n * 注册一个新的作用域\r\n * \r\n * 每一个库均对应一个作用域,每个作用域可以有多个语言包,且对应一个翻译函数\r\n * 除了默认语言外,其他语言采用动态加载的方式\r\n * \r\n * @param {*} scope \r\n */\r\n async register(scope){\r\n if(!(scope instanceof i18nScope)){\r\n throw new TypeError(\"Scope must be an instance of I18nScope\")\r\n }\r\n this._scopes.push(scope) \r\n await scope.refresh(this.activeLanguage) \r\n }\r\n /**\r\n * 注册全局格式化器\r\n * 格式化器是一个简单的同步函数value=>{...},用来对输入进行格式化后返回结果\r\n * \r\n * registerFormatters(name,value=>{...}) // 适用于所有语言\r\n * registerFormatters(name,value=>{...},{langauge:\"zh\"}) // 适用于cn语言\r\n * registerFormatters(name,value=>{...},{langauge:\"en\"}) // 适用于en语言 \r\n \r\n * @param {*} formatters \r\n */\r\n registerFormatter(name,formatter,{language=\"*\"}={}){\r\n if(!typeof(formatter)===\"function\" || typeof(name)!==\"string\"){\r\n throw new TypeError(\"Formatter must be a function\")\r\n } \r\n if(DataTypes.includes(name)){\r\n this.formatters[language].$types[name] = formatter\r\n }else{\r\n this.formatters[language][name] = formatter\r\n }\r\n }\r\n /**\r\n * 注册默认文本信息加载器\r\n */\r\n registerDefaultLoader(fn){\r\n if(typeof(fn) !== 'function') throw new Error(\"The default loader must be a async function or promise returned\")\r\n this._defaultMessageLoader = fn\r\n this.refresh()\r\n } \r\n async refresh(){\r\n try{\r\n let requests = this._scopes.map(scope=>scope.refresh())\r\n if(Promise.allSettled){\r\n await Promise.allSettled(requests)\r\n }else{\r\n await Promise.all(requests)\r\n }\r\n }catch{}\r\n }\r\n\r\n}\r\n\r\nmodule.exports ={\r\n getInterpolatedVars,\r\n replaceInterpolatedVars,\r\n I18nManager,\r\n translate,\r\n i18nScope,\r\n defaultLanguageSettings,\r\n getDataTypeName,\r\n isNumber,\r\n isPlainObject \r\n}","/**\r\n * 内置的格式化器\r\n * \r\n */\r\n\r\n\r\n/**\r\n * 字典格式化器\r\n * 根据输入data的值,返回后续参数匹配的结果\r\n * dict(data,,,,,,,...)\r\n * \r\n * \r\n * dict(1,1,\"one\",2,\"two\",3,\"three\",4,\"four\") == \"one\"\r\n * dict(2,1,\"one\",2,\"two\",3,\"three\",4,\"four\") == \"two\"\r\n * dict(3,1,\"one\",2,\"two\",3,\"three\",4,\"four\") == \"three\"\r\n * dict(4,1,\"one\",2,\"two\",3,\"three\",4,\"four\") == \"four\"\r\n * // 无匹配时返回原始值\r\n * dict(5,1,\"one\",2,\"two\",3,\"three\",4,\"four\") == 5 \r\n * // 无匹配时并且后续参数个数是奇数,则返回最后一个参数\r\n * dict(5,1,\"one\",2,\"two\",3,\"three\",4,\"four\",\"more\") == \"more\" \r\n * \r\n * 在翻译中使用\r\n * I have { value | dict(1,\"one\",2,\"two\",3,\"three\",4,\"four\")} apples\r\n * \r\n * @param {*} value \r\n * @param {...any} args \r\n * @returns \r\n */\r\n function dict(value,...args){\r\n for(let i=0;i0 && (args.length % 2!==0)) return args[args.length-1]\r\n return value\r\n}\r\n\r\nfunction formatCurrency(value,symbol,retainDots){\r\n\r\n}\r\n\r\nmodule.exports = { \r\n \"*\":{\r\n $types:{\r\n Date:(value)=>value.toLocaleString()\r\n },\r\n time:(value)=> value.toLocaleTimeString(), \r\n shorttime:(value)=> value.toLocaleTimeString(), \r\n date: (value)=> value.toLocaleDateString(), \r\n dict, //字典格式化器\r\n }, \r\n zh:{ \r\n $types:{\r\n Date:(value)=> `${value.getFullYear()}年${value.getMonth()+1}月${value.getDate()}日 ${value.getHours()}点${value.getMinutes()}分${value.getSeconds()}秒`\r\n },\r\n shortime:(value)=> value.toLocaleTimeString(), \r\n time:(value)=>`${value.getHours()}点${value.getMinutes()}分${value.getSeconds()}秒`, \r\n date: (value)=> `${value.getFullYear()}年${value.getMonth()+1}月${value.getDate()}日`,\r\n shortdate: (value)=> `${value.getFullYear()}-${value.getMonth()+1}-${value.getDate()}`,\r\n currency:(value)=>`${value}元`,\r\n },\r\n en:{\r\n currency:(value)=>{\r\n return `$${value}`\r\n }\r\n }\r\n}"],"names":["utils","obj","_typeof","proto","_Object$getPrototypeOf","baseProto","value","isNaN","_parseInt","deepMerge","toObj","formObj","_context","options","results","_Object$assign","_forEachInstanceProperty","_ref","_ref2","_slicedToArray","key","_Array$isArray","array","_context2","_concatInstanceProperty","call","_toConsumableArray","_context3","_Set","v","undefined","constructor","name","eventemitter","EventEmitter","_classCallCheck","this","_callbacks","_emit","_createClass","callback","_includesInstanceProperty","push","i","length","_spliceInstanceProperty","_asyncToGenerator","_regeneratorRuntime","mark","_callee","_len","args","_key","_context4","_args","arguments","wrap","_context5","prev","next","Array","_Promise","allSettled","_mapInstanceProperty","cb","apply","all","stop","isPlainObject","require$$0","DataTypes","scope","i18nScope","_id","id","Date","getTime","toString","Math","random","_languages","languages","_defaultLanguage","defaultLanguage","_activeLanguage","activeLanguage","_default","_messages","messages","_idMap","idMap","_formatters","formatters","_loaders","loaders","_global","_patchMessages","$cache","typedFormatters","_globalThis","VoerkaI18n","I18nManager","require$$1","global","_mergePatchedMessages","_patch","newLanguage","_loading","register","_patch2","_refresh","get","set","then","formatter","_ref$language","language","TypeError","$types","fn","registerDefaultLoader","loader","resolve","abrupt","sent","defaultMessageLoader","loadMessagesFromDefaultLoader","_fallback","t0","console","warn","message","_x","_callee2","pachedMessages","_savePatchedMessages","_x2","_x3","patchedMessages","_getPatchedMessages","localStorage","setItem","concat","_JSON$stringify","e","error","_context6","JSON","parse","getItem","_context7","_bindInstanceProperty","on","_context8","off","_context9","offAll","_context10","change","getDataTypeName","isNumber","require$$2","inlineFormatters","toLocaleString","time","toLocaleTimeString","shorttime","date","toLocaleDateString","dict","zh","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","shortime","shortdate","_context11","currency","en","varWithPipeRegexp","varname","hasInterpolation","str","_String$raw","_templateObject","_taggedTemplateLiteral","parseFormatters","result","_trimInstanceProperty","substr","split","r","firstIndex","_indexOfInstanceProperty","lastIndex","_lastIndexOfInstanceProperty","argsContent","arg","_startsWithInstanceProperty","_endsWithInstanceProperty","toLowerCase","String","forEachInterpolatedVars","match","opts","replaceAll","exec","groups","_replaceAllInstanceProperty","replace","_unused","resetScopeCache","buildFormatters","_step2","_iterator2","_createForOfIteratorHelper","_loop","func","_i2","_targets2","target","getFormatter","_v$formatter$","s","n","done","err","f","getFormattedValue","formatterFuncs","defaultFormatter","dataType","_i","_targets","getDataTypeDefaultFormatter","_step","_iterator","executeFormatter","replaceInterpolatedVars","template","varValues","params","Error","defaultLanguageSettings","title","default","isMessageId","content","getPluraMessage","_unused2","escape","_context12","_context13","_context14","_context15","unescape","_context16","_context17","_context18","_context19","_context20","_context21","_context22","_context23","_register","_refreshScopes2","_change","_this2","settings","_super2","instance","_assertThisInitialized","_settings","_scopes","_defaultMessageLoader","_context28","_context29","_context30","_findIndexInstanceProperty","lang","_refreshScopes","emit","_callee3","_context31","scopeRefreshers","_context32","refresh","_callee4","_context33","_ref5","_ref5$language","_callee5","_context34","requests","_context35","runtime","getInterpolatedVars","vars","varName","varItem","varDef","translate","pluralVars","pluraValue","_context24","_context27","_Object$entries","_ref3","_ref4","_context25","_context26","index","msgId","pluralVar"],"mappings":"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"} \ No newline at end of file diff --git a/packages/runtime/dist/index.esm.js b/packages/runtime/dist/index.esm.js deleted file mode 100644 index bec61c8..0000000 --- a/packages/runtime/dist/index.esm.js +++ /dev/null @@ -1,2 +0,0 @@ -import e from"@babel/runtime-corejs3/core-js-stable/weak-map";import t from"@babel/runtime-corejs3/core-js-stable/instance/reduce";import r from"@babel/runtime-corejs3/core-js-stable/object/keys";import a from"@babel/runtime-corejs3/core-js-stable/object/create";import n from"@babel/runtime-corejs3/core-js-stable/symbol/replace";import s from"@babel/runtime-corejs3/core-js-stable/array/from";import o from"@babel/runtime-corejs3/core-js-stable/symbol";import i from"@babel/runtime-corejs3/core-js/get-iterator-method";import l from"@babel/runtime-corejs3/core-js-stable/reflect/construct";import"core-js/modules/es.regexp.constructor.js";import"core-js/modules/es.regexp.dot-all.js";import"core-js/modules/es.regexp.sticky.js";import"core-js/modules/es.regexp.test.js";import"core-js/modules/es.reflect.to-string-tag.js";import c from"@babel/runtime-corejs3/helpers/asyncToGenerator";import u from"@babel/runtime-corejs3/helpers/classCallCheck";import f from"@babel/runtime-corejs3/helpers/createClass";import g from"@babel/runtime-corejs3/helpers/assertThisInitialized";import m from"@babel/runtime-corejs3/helpers/possibleConstructorReturn";import h from"@babel/runtime-corejs3/helpers/getPrototypeOf";import p from"@babel/runtime-corejs3/helpers/typeof";import b from"@babel/runtime-corejs3/helpers/toConsumableArray";import v from"@babel/runtime-corejs3/helpers/slicedToArray";import d from"@babel/runtime-corejs3/helpers/taggedTemplateLiteral";import y from"@babel/runtime-corejs3/helpers/inherits";import j from"@babel/runtime-corejs3/helpers/setPrototypeOf";import k from"@babel/runtime-corejs3/regenerator";import"core-js/modules/es.regexp.exec.js";import"core-js/modules/es.string.split.js";import"core-js/modules/es.string.substr.js";import"core-js/modules/es.function.name.js";import"core-js/modules/es.error.to-string.js";import"core-js/modules/es.date.to-string.js";import"core-js/modules/es.object.to-string.js";import"core-js/modules/es.regexp.to-string.js";import"core-js/modules/esnext.array.last-index.js";import"core-js/modules/es.string.replace.js";import"core-js/modules/es.error.cause.js";import"core-js/modules/es.array.iterator.js";import"core-js/modules/es.promise.js";import"core-js/modules/es.promise.all-settled.js";import"core-js/modules/es.string.iterator.js";import"core-js/modules/web.dom-collections.iterator.js";import _ from"@babel/runtime-corejs3/core-js-stable/string/raw";import x from"@babel/runtime-corejs3/core-js-stable/instance/includes";import L from"@babel/runtime-corejs3/core-js-stable/instance/map";import w from"@babel/runtime-corejs3/core-js-stable/instance/trim";import S from"@babel/runtime-corejs3/core-js-stable/instance/index-of";import M from"@babel/runtime-corejs3/core-js-stable/instance/last-index-of";import $ from"@babel/runtime-corejs3/core-js-stable/parse-int";import F from"@babel/runtime-corejs3/core-js-stable/instance/starts-with";import E from"@babel/runtime-corejs3/core-js-stable/instance/ends-with";import D from"@babel/runtime-corejs3/core-js-stable/instance/find-index";import A from"@babel/runtime-corejs3/core-js-stable/object/assign";import I from"@babel/runtime-corejs3/core-js/instance/replace-all";import N from"@babel/runtime-corejs3/core-js-stable/array/is-array";import T from"@babel/runtime-corejs3/core-js-stable/json/stringify";import O from"@babel/runtime-corejs3/core-js-stable/instance/concat";import P from"@babel/runtime-corejs3/core-js-stable/instance/splice";import C from"@babel/runtime-corejs3/core-js-stable/instance/for-each";import R from"@babel/runtime-corejs3/core-js-stable/object/entries";import V from"@babel/runtime-corejs3/core-js-stable/instance/slice";import z from"@babel/runtime-corejs3/core-js-stable/promise";import B from"@babel/runtime-corejs3/core-js-stable/object/get-prototype-of";import U from"@babel/runtime-corejs3/core-js-stable/set";import Y from"@babel/runtime-corejs3/core-js/global-this";import H from"@babel/runtime-corejs3/core-js-stable/instance/bind";var J,W=function(e){if("object"!==p(e)||null===e)return!1;var t=B(e);if(null===t)return!0;for(var r=t;null!==B(r);)r=B(r);return t===r},G=function(e){return!isNaN($(e))},q=function e(t,r){var a,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},s=A({},t);return C(a=R(r)).call(a,(function(t){var r=v(t,2),a=r[0],o=r[1];if(a in s)if("object"===p(o)&&null!==o)if(N(o)){if(0===n.array)s[a]=o;else if(1===n.array){var i;s[a]=O(i=[]).call(i,b(s[a]),b(o))}else if(2===n.array){var l;s[a]=b(new U(O(l=[]).call(l,b(s[a]),b(o))))}}else s[a]=e(s[a],o,n);else s[a]=o;else s[a]=o})),s},K=function(e){return null===e?"Null":void 0===e?"Undefined":"function"==typeof e?"Function":e.constructor&&e.constructor.name},Q=function(){function e(){u(this,e),this._callbacks=[]}var t;return f(e,[{key:"on",value:function(e){var t;x(t=this._callbacks).call(t,e)||this._callbacks.push(e)}},{key:"off",value:function(e){for(var t=0;t0&&void 0!==arguments[0]?arguments[0]:{},r=arguments.length>1?arguments[1]:void 0;if(u(this,e),this._id=t.id||(new Date).getTime().toString()+$(1e3*Math.random()),this._languages=t.languages,this._defaultLanguage=t.defaultLanguage||"zh",this._activeLanguage=t.activeLanguage,this._default=t.default,this._messages=t.messages,this._idMap=t.idMap,this._formatters=t.formatters,this._loaders=t.loaders,this._global=null,this._patchMessages={},this.$cache={activeLanguage:null,typedFormatters:{},formatters:{}},!Y.VoerkaI18n){var a=Me.I18nManager;Y.VoerkaI18n=new a({defaultLanguage:this.defaultLanguage,activeLanguage:this.activeLanguage,languages:t.languages})}this.global=Y.VoerkaI18n,this._mergePatchedMessages(),this._patch(this._messages,newLanguage),this._loading=!1,this.register(r)}var t,r;return f(e,[{key:"id",get:function(){return this._id}},{key:"defaultLanguage",get:function(){return this._defaultLanguage}},{key:"activeLanguage",get:function(){return this._activeLanguage}},{key:"default",get:function(){return this._default}},{key:"messages",get:function(){return this._messages}},{key:"idMap",get:function(){return this._idMap}},{key:"formatters",get:function(){return this._formatters}},{key:"languages",get:function(){return this._languages}},{key:"loaders",get:function(){return this._loaders}},{key:"global",get:function(){return this._global},set:function(e){this._global=e}},{key:"register",value:function(e){"function"===!p(e)&&(e=function(){}),this.global.register(this).then(e).catch(e)}},{key:"registerFormatter",value:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},a=r.language,n=void 0===a?"*":a;if("function"===!p(t)||"string"!=typeof e)throw new TypeError("Formatter must be a function");x(Z).call(Z,e)?this.formatters[n].$types[e]=t:this.formatters[n][e]=t}},{key:"registerDefaultLoader",value:function(e){this.global.registerDefaultLoader(e)}},{key:"_fallback",value:function(){this._messages=this._default,this._activeLanguage=this.defaultLanguage}},{key:"refresh",value:(r=c(k.mark((function e(t){var r,a,n;return k.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this._loading=z.resolve(),t||(t=this.activeLanguage),t!==this.defaultLanguage){e.next=7;break}return this._messages=this._default,e.next=6,this._patch(this._messages,t);case 6:return e.abrupt("return");case 7:if(r=this.loaders[t],e.prev=8,"function"!=typeof r){e.next=18;break}return e.next=12,r();case 12:return this._messages=e.sent.default,this._activeLanguage=t,e.next=16,this._patch(this._messages,t);case 16:e.next=26;break;case 18:if("function"!=typeof this.global.defaultMessageLoader){e.next=25;break}return e.next=21,this.global.loadMessagesFromDefaultLoader(t,this);case 21:this._messages=e.sent,this._activeLanguage=t,e.next=26;break;case 25:this._fallback();case 26:e.next=32;break;case 28:e.prev=28,e.t0=e.catch(8),console.warn(O(a=O(n="Error while loading language <".concat(t,"> on i18nScope(")).call(n,this.id,"): ")).call(a,e.t0.message)),this._fallback();case 32:case"end":return e.stop()}}),e,this,[[8,28]])}))),function(e){return r.apply(this,arguments)})},{key:"_patch",value:(t=c(k.mark((function e(t,r){var a;return k.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if("function"==typeof this.global.loadMessagesFromDefaultLoader){e.next=2;break}return e.abrupt("return");case 2:return e.prev=2,e.next=5,this.global.loadMessagesFromDefaultLoader(r,this);case 5:a=e.sent,X(a)&&(A(t,a),this._savePatchedMessages(a,r)),e.next=11;break;case 9:e.prev=9,e.t0=e.catch(2);case 11:case"end":return e.stop()}}),e,this,[[2,9]])}))),function(e,r){return t.apply(this,arguments)})},{key:"_mergePatchedMessages",value:function(){var e=this._getPatchedMessages(this.activeLanguage);X(e)&&A(this._messages,e)}},{key:"_savePatchedMessages",value:function(e,t){try{var r;if(Y.localStorage)Y.localStorage.setItem(O(r="voerkai18n_".concat(this.id,"_")).call(r,t,"_patched_messages"),T(e))}catch(e){console.error("Error while save voerkai18n patched messages:",e.message)}}},{key:"_getPatchedMessages",value:function(e){try{var t;return JSON.parse(localStorage.getItem(O(t="voerkai18n_".concat(this.id,"_")).call(t,e,"_patched_messages")))}catch(e){return{}}}},{key:"on",get:function(){var e;return H(e=this.global.on).call(e,this.global)}},{key:"off",get:function(){var e;return H(e=this.global.off).call(e,this.global)}},{key:"offAll",get:function(){var e;return H(e=this.global.offAll).call(e,this.global)}},{key:"change",get:function(){var e;return H(e=this.global.change).call(e,this.global)}}]),e}();function te(e){var t=function(){if("undefined"==typeof Reflect||!l)return!1;if(l.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(l(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var r,a=h(e);if(t){var n=h(this).constructor;r=l(a,arguments,n)}else r=a.apply(this,arguments);return m(this,r)}}function re(e,t){var r=void 0!==o&&i(e)||e["@@iterator"];if(!r){if(N(e)||(r=function(e,t){var r;if(!e)return;if("string"==typeof e)return ae(e,t);var a=V(r=Object.prototype.toString.call(e)).call(r,8,-1);"Object"===a&&e.constructor&&(a=e.constructor.name);if("Map"===a||"Set"===a)return s(e);if("Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a))return ae(e,t)}(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var a=0,n=function(){};return{s:n,n:function(){return a>=e.length?{done:!0}:{done:!1,value:e[a++]}},e:function(e){throw e},f:n}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var l,c=!0,u=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return c=e.done,e},e:function(e){u=!0,l=e},f:function(){try{c||null==r.return||r.return()}finally{if(u)throw l}}}}function ae(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,a=new Array(t);r]+)>/g,(function(e,t){return"$"+r[t]})))}if("function"==typeof t){var a=this;return s[n].call(this,e,(function(){var e=arguments;return"object"!=p(e[e.length-1])&&(e=V([]).call(e)).push(l(e,a)),t.apply(this,e)}))}return s[n].call(this,e,t)},ne.apply(this,arguments)}var se=K,oe=G,ie=W,le=q,ce=Q,ue=ee,fe={"*":{$types:{Date:function(e){return e.toLocaleString()}},time:function(e){return e.toLocaleTimeString()},shorttime:function(e){return e.toLocaleTimeString()},date:function(e){return e.toLocaleDateString()},dict:function(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),a=1;a0&&r.length%2!=0?r[r.length-1]:e}},zh:{$types:{Date:function(e){var t,r,a,n,s;return O(t=O(r=O(a=O(n=O(s="".concat(e.getFullYear(),"年")).call(s,e.getMonth()+1,"月")).call(n,e.getDate(),"日 ")).call(a,e.getHours(),"点")).call(r,e.getMinutes(),"分")).call(t,e.getSeconds(),"秒")}},shortime:function(e){return e.toLocaleTimeString()},time:function(e){var t,r;return O(t=O(r="".concat(e.getHours(),"点")).call(r,e.getMinutes(),"分")).call(t,e.getSeconds(),"秒")},date:function(e){var t,r;return O(t=O(r="".concat(e.getFullYear(),"年")).call(r,e.getMonth()+1,"月")).call(t,e.getDate(),"日")},shortdate:function(e){var t,r;return O(t=O(r="".concat(e.getFullYear(),"-")).call(r,e.getMonth()+1,"-")).call(t,e.getDate())},currency:function(e){return"".concat(e,"元")}},en:{currency:function(e){return"$".concat(e)}}},ge=ne(/\{\s*(\w+)?((\s*\|\s*\w*(\(.*\))?\s*)*)\s*\}/g,{varname:1,formatters:2});function me(e){return x(e).call(e,"{")&&x(e).call(e,"}")}_(J||(J=d(["{s*{varname}s*}"],["\\{\\s*{varname}\\s*\\}"])));var he=["String","Number","Boolean","Object","Array","Function","Error","Symbol","RegExp","Date","Null","Undefined","Set","Map","WeakSet","WeakMap"];function pe(e){var t,r;if(!e)return[];var a=L(t=w(r=w(e).call(e).substr(1)).call(r).split("|")).call(t,(function(e){return w(e).call(e)}));return L(a).call(a,(function(e){var t=S(e).call(e,"("),r=M(e).call(e,")");if(-1!==t&&-1!==r){var a,n,s=w(a=e.substr(t+1,r-t-1)).call(a),o=""==s?[]:L(n=s.split(",")).call(n,(function(e){if(e=w(e).call(e),!isNaN($(e)))return $(e);if(F(e).call(e,'"')&&E(e).call(e,'"')||F(e).call(e,"'")&&E(e).call(e,"'"))return e.substr(1,e.length-2);if("true"===e.toLowerCase()||"false"===e.toLowerCase())return"true"===e.toLowerCase();if(!(F(e).call(e,"{")&&E(e).call(e,"}")||F(e).call(e,"[")&&E(e).call(e,"]")))return String(e);try{return JSON.parse(e)}catch(t){return String(e)}}));return[e.substr(0,t),o]}return[e,[]]}))}function be(e,t){var r,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=e,s=A({replaceAll:!0},a);for(ge.lastIndex=0;null!==(r=ge.exec(n));){var o=r.groups.varname||"",i=pe(r.groups.formatters);if("function"==typeof t)try{n=I(s)?I(n).call(n,r[0],t(o,i,r[0])):n.replace(r[0],t(o,i,r[0]))}catch(e){break}ge.lastIndex=0}return n}function ve(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;e.$cache={activeLanguage:t,typedFormatters:{},formatters:{}}}function de(e,t,r){var a,n=[],s=re(r);try{var o=function(){var r=a.value;if(r[0]){var s=function(e,t,r){if(e.$cache||ve(e),e.$cache.activeLanguage===t){if(r in e.$cache.formatters)return e.$cache.formatters[r]}else ve(e,t);for(var a=0,n=[e.formatters,e.global.formatters];a1?a-1:0),s=1;sl)return ye(t,r,a,i[l++]);throw new Error}),{replaceAll:!1})}var ke={defaultLanguage:"zh",activeLanguage:"zh",languages:[{name:"zh",title:"中文",default:!0},{name:"en",title:"英文"}],formatters:fe};function _e(e){return $(e)>0}function xe(e,t){try{return N(e)?e.length>t?e[t]:e[e.length-1]:e}catch(t){return N(e)?e[0]:e}}function Le(e){var t,r,a,n,s,o,i,l;return I(t=I(r=I(a=I(n=I(s=I(o=I(i=I(l=I(e).call(e,/\\(?![trnbvf'"]{1})/g,"\\\\")).call(l,"\t","\\t")).call(i,"\n","\\n")).call(o,"\b","\\b")).call(s,"\r","\\r")).call(n,"\f","\\f")).call(a,"'","\\'")).call(r,'"','\\"')).call(t,"\v","\\v")}function we(e){var t,r,a,n,s,o,i,l;return I(t=I(r=I(a=I(n=I(s=I(o=I(i=I(l=I(e).call(e,"\\t","\t")).call(l,"\\n","\n")).call(i,"\\b","\b")).call(o,"\\r","\r")).call(s,"\\f","\f")).call(n,"\\'","'")).call(a,'\\"','"')).call(r,"\\v","\v")).call(t,/\\\\(?![trnbvf'"]{1})/g,"\\")}var Se=function(e){y(i,ce);var t,r,a,n,s,o=te(i);function i(){var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return u(this,i),e=o.call(this),null!=i.instance||(i.instance=g(e),e._settings=le(ke,t),e._scopes=[],e._defaultMessageLoader=null),m(e,i.instance)}return f(i,[{key:"settings",get:function(){return this._settings}},{key:"scopes",get:function(){return this._scopes}},{key:"activeLanguage",get:function(){return this._settings.activeLanguage}},{key:"defaultLanguage",get:function(){return this._settings.defaultLanguage}},{key:"languages",get:function(){return this._settings.languages}},{key:"formatters",get:function(){return fe}},{key:"defaultMessageLoader",get:function(){return this._defaultMessageLoader}},{key:"loadMessagesFromDefaultLoader",value:(s=c(k.mark((function e(t,r){return k.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if("function"==typeof this._defaultMessageLoader){e.next=2;break}return e.abrupt("return");case 2:return e.next=4,this._defaultMessageLoader.call(r,t,r);case 4:return e.abrupt("return",e.sent);case 5:case"end":return e.stop()}}),e,this)}))),function(e,t){return s.apply(this,arguments)})},{key:"change",value:(n=c(k.mark((function e(t){var r;return k.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=w(t).call(t),-1===D(r=this.languages).call(r,(function(e){return e.name===t}))&&"function"!=typeof this._defaultMessageLoader){e.next=9;break}return e.next=4,this._refreshScopes(t);case 4:return this._settings.activeLanguage=t,e.next=7,this.emit(t);case 7:e.next=10;break;case 9:throw new Error("Not supported language:"+t);case 10:case"end":return e.stop()}}),e,this)}))),function(e){return n.apply(this,arguments)})},{key:"_refreshScopes",value:(a=c(k.mark((function e(t){var r,a;return k.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,a=L(r=this._scopes).call(r,(function(e){return e.refresh(t)})),!z.allSettled){e.next=7;break}return e.next=5,z.allSettled(a);case 5:e.next=9;break;case 7:return e.next=9,z.all(a);case 9:e.next=14;break;case 11:e.prev=11,e.t0=e.catch(0),console.warn("Error while refreshing i18n scopes:",e.t0.message);case 14:case"end":return e.stop()}}),e,this,[[0,11]])}))),function(e){return a.apply(this,arguments)})},{key:"register",value:(r=c(k.mark((function e(t){return k.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t instanceof ue){e.next=2;break}throw new TypeError("Scope must be an instance of I18nScope");case 2:return this._scopes.push(t),e.next=5,t.refresh(this.activeLanguage);case 5:case"end":return e.stop()}}),e,this)}))),function(e){return r.apply(this,arguments)})},{key:"registerFormatter",value:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},a=r.language,n=void 0===a?"*":a;if("function"===!p(t)||"string"!=typeof e)throw new TypeError("Formatter must be a function");x(he).call(he,e)?this.formatters[n].$types[e]=t:this.formatters[n][e]=t}},{key:"registerDefaultLoader",value:function(e){if("function"!=typeof e)throw new Error("The default loader must be a async function or promise returned");this._defaultMessageLoader=e,this.refresh()}},{key:"refresh",value:(t=c(k.mark((function e(){var t,r;return k.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,r=L(t=this._scopes).call(t,(function(e){return e.refresh()})),!z.allSettled){e.next=7;break}return e.next=5,z.allSettled(r);case 5:e.next=9;break;case 7:return e.next=9,z.all(r);case 9:e.next=13;break;case 11:e.prev=11,e.t0=e.catch(0);case 13:case"end":return e.stop()}}),e,this,[[0,11]])}))),function(){return t.apply(this,arguments)})}]),i}(),Me={getInterpolatedVars:function(e){var t=[];return be(e,(function(e,r,a){var n={name:e,formatters:L(r).call(r,(function(e){var t=v(e,2);return{name:t[0],args:t[1]}})),match:a};return-1===D(t).call(t,(function(e){return e.name===n.name&&n.formatters.toString()==e.formatters.toString()}))&&t.push(n),""})),t},replaceInterpolatedVars:je,I18nManager:Se,translate:function(e){var t=this,r=t.global.activeLanguage,a=e,n=[],s=[],o=null;if("string"===!p(e))return e;try{var i,l;if(2===arguments.length&&ie(arguments[1]))C(i=R(arguments[1])).call(i,(function(e){var t=v(e,2),r=t[0],a=t[1];if("function"==typeof a)try{n[r]=a()}catch(e){n[r]=a}F(r).call(r,"$")&&"number"==typeof n[r]&&s.push(r)})),n=[arguments[1]];else if(arguments.length>=2){var c,u;n=L(c=P(u=V(Array.prototype).call(arguments)).call(u,1)).call(c,(function(e,t){try{e="function"==typeof e?e():e,oe(e)&&(o=$(e))}catch(e){}return e}))}if(r===t.defaultLanguage)_e(a)&&(a=t.default[a]||e);else{var f=_e(a)?a:t.idMap[Le(a)];a=t.messages[f]||a,a=N(a)?L(a).call(a,(function(e){return we(e)})):we(a)}return N(a)&&a.length>0&&(a=null!==o?xe(a,o):pluralVar.length>0?xe(a,$(n(pluralVar[0]))):a[0]),0==n.length?a:je.call.apply(je,O(l=[t,a]).call(l,b(n)))}catch(e){return a}},i18nScope:ue,defaultLanguageSettings:ke,getDataTypeName:se,isNumber:oe,isPlainObject:ie};export{Me as default}; -//# sourceMappingURL=index.esm.js.map diff --git a/packages/runtime/dist/index.esm.js.map b/packages/runtime/dist/index.esm.js.map deleted file mode 100644 index 3af1149..0000000 --- a/packages/runtime/dist/index.esm.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.esm.js","sources":["../utils.js","../eventemitter.js","../scope.js","../index.js","../formatters.js"],"sourcesContent":["\r\n/**\r\n * 判断是否是JSON对象\r\n * @param {*} obj \r\n * @returns \r\n */\r\n function isPlainObject(obj){\r\n if (typeof obj !== 'object' || obj === null) return false;\r\n var proto = Object.getPrototypeOf(obj);\r\n if (proto === null) return true;\r\n var baseProto = proto;\r\n\r\n while (Object.getPrototypeOf(baseProto) !== null) {\r\n baseProto = Object.getPrototypeOf(baseProto);\r\n }\r\n return proto === baseProto; \r\n}\r\n\r\nfunction isNumber(value){\r\n return !isNaN(parseInt(value))\r\n}\r\n \r\n/**\r\n * 简单进行对象合并\r\n * \r\n * options={\r\n * array:0 , // 数组合并策略,0-替换,1-合并,2-去重合并\r\n * }\r\n * \r\n * @param {*} toObj \r\n * @param {*} formObj \r\n * @returns 合并后的对象\r\n */\r\nfunction deepMerge(toObj,formObj,options={}){\r\n let results = Object.assign({},toObj)\r\n Object.entries(formObj).forEach(([key,value])=>{\r\n if(key in results){\r\n if(typeof value === \"object\" && value !== null){\r\n if(Array.isArray(value)){\r\n if(options.array === 0){\r\n results[key] = value\r\n }else if(options.array === 1){\r\n results[key] = [...results[key],...value]\r\n }else if(options.array === 2){\r\n results[key] = [...new Set([...results[key],...value])]\r\n }\r\n }else{\r\n results[key] = deepMerge(results[key],value,options)\r\n }\r\n }else{\r\n results[key] = value\r\n }\r\n }else{\r\n results[key] = value\r\n }\r\n })\r\n return results\r\n}\r\n\r\n\r\n/**\r\n * 获取指定变量类型名称\r\n * getDataTypeName(1) == Number\r\n * getDataTypeName(\"\") == String\r\n * getDataTypeName(null) == Null\r\n * getDataTypeName(undefined) == Undefined\r\n * getDataTypeName(new Date()) == Date\r\n * getDataTypeName(new Error()) == Error\r\n * \r\n * @param {*} v \r\n * @returns \r\n */\r\n function getDataTypeName(v){\r\n\tif (v === null) return 'Null' \r\n\tif (v === undefined) return 'Undefined' \r\n if(typeof(v)===\"function\") return \"Function\"\r\n\treturn v.constructor && v.constructor.name;\r\n};\r\n\r\n\r\n\r\n\r\n\r\nmodule.exports ={\r\n isPlainObject,\r\n isNumber,\r\n deepMerge,\r\n getDataTypeName\r\n}","/**\r\n* \r\n* 简单的事件触发器\r\n* \r\n*/\r\nmodule.exports = class EventEmitter{\r\n constructor(){\r\n this._callbacks = []\r\n }\r\n on(callback){\r\n if(this._callbacks.includes(callback)) return\r\n this._callbacks.push(callback)\r\n }\r\n off(callback){\r\n for(let i=0;icb(...args)))\r\n }else{\r\n await Promise.all(this._callbacks.map(cb=>cb(...args)))\r\n }\r\n } \r\n}","const { isPlainObject } = require(\"./utils\")\r\n\r\nconst DataTypes = [\"String\",\"Number\",\"Boolean\",\"Object\",\"Array\",\"Function\",\"Null\",\"Undefined\",\"Symbol\",\"Date\",\"RegExp\",\"Error\"];\r\n\r\nmodule.exports = class i18nScope {\r\n constructor(options={},callback){\r\n // 每个作用域都有一个唯一的id\r\n this._id = options.id || (new Date().getTime().toString()+parseInt(Math.random()*1000))\r\n this._languages = options.languages // 当前作用域的语言列表\r\n this._defaultLanguage = options.defaultLanguage || \"zh\" // 默认语言名称\r\n this._activeLanguage = options.activeLanguage // 当前语言名称\r\n this._default = options.default // 默认语言包\r\n this._messages = options.messages // 当前语言包\r\n this._idMap = options.idMap // 消息id映射列表\r\n this._formatters = options.formatters // 当前作用域的格式化函数列表\r\n this._loaders = options.loaders // 异步加载语言文件的函数列表\r\n this._global = null // 引用全局VoerkaI18n配置,注册后自动引用 \r\n this._patchMessages = {} // 语言包补丁信息 {:{....},:{....}}\r\n // 主要用来缓存格式化器的引用,当使用格式化器时可以直接引用,避免检索\r\n this.$cache={\r\n activeLanguage : null,\r\n typedFormatters: {},\r\n formatters : {},\r\n }\r\n // 如果不存在全局VoerkaI18n实例,说明当前Scope是唯一或第一个加载的作用域,\r\n // 则使用当前作用域来初始化全局VoerkaI18n实例\r\n if(!globalThis.VoerkaI18n){\r\n const { I18nManager } = require(\"./\")\r\n globalThis.VoerkaI18n = new I18nManager({\r\n defaultLanguage: this.defaultLanguage,\r\n activeLanguage : this.activeLanguage,\r\n languages: options.languages,\r\n })\r\n } \r\n this.global = globalThis.VoerkaI18n \r\n this._mergePatchedMessages()\r\n this._patch(this._messages,newLanguage) \r\n // 正在加载语言包标识\r\n this._loading=false\r\n // 在全局注册作用域\r\n this.register(callback)\r\n }\r\n // 作用域\r\n get id(){return this._id}\r\n // 默认语言名称\r\n get defaultLanguage(){return this._defaultLanguage}\r\n // 默认语言名称\r\n get activeLanguage(){return this._activeLanguage}\r\n // 默认语言包\r\n get default(){return this._default}\r\n // 当前语言包\r\n get messages(){return this._messages}\r\n // 消息id映射列表\r\n get idMap(){return this._idMap}\r\n // 当前作用域的格式化函数列表\r\n get formatters(){return this._formatters}\r\n // 当前作用域支持的语言\r\n get languages(){return this._languages}\r\n // 异步加载语言文件的函数列表\r\n get loaders(){return this._loaders}\r\n // 引用全局VoerkaI18n配置,注册后自动引用\r\n get global(){return this._global}\r\n set global(value){this._global = value}\r\n /**\r\n * 在全局注册作用域\r\n * @param {*} callback 当注册\r\n */\r\n register(callback){\r\n if(!typeof(callback)===\"function\") callback = ()=>{} \r\n this.global.register(this).then(callback).catch(callback) \r\n }\r\n registerFormatter(name,formatter,{language=\"*\"}={}){\r\n if(!typeof(formatter)===\"function\" || typeof(name)!==\"string\"){\r\n throw new TypeError(\"Formatter must be a function\")\r\n } \r\n if(DataTypes.includes(name)){\r\n this.formatters[language].$types[name] = formatter\r\n }else{\r\n this.formatters[language][name] = formatter\r\n }\r\n }\r\n /**\r\n * 注册默认文本信息加载器\r\n * @param {Function} 必须是异步函数或者是返回Promise\r\n */\r\n registerDefaultLoader(fn){\r\n this.global.registerDefaultLoader(fn)\r\n }\r\n /**\r\n * 回退到默认语言\r\n */\r\n _fallback(){\r\n this._messages = this._default \r\n this._activeLanguage = this.defaultLanguage\r\n }\r\n /**\r\n * 刷新当前语言包\r\n * @param {*} newLanguage \r\n */\r\n async refresh(newLanguage){\r\n this._loading = Promise.resolve()\r\n if(!newLanguage) newLanguage = this.activeLanguage\r\n // 默认语言,默认语言采用静态加载方式,只需要简单的替换即可\r\n if(newLanguage === this.defaultLanguage){\r\n this._messages = this._default\r\n await this._patch(this._messages,newLanguage) // 异步补丁\r\n return \r\n }\r\n // 非默认语言需要异步加载语言包文件,加载器是一个异步函数\r\n // 如果没有加载器,则无法加载语言包,因此回退到默认语言\r\n let loader = this.loaders[newLanguage]\r\n try{\r\n if(typeof(loader) === \"function\"){\r\n this._messages = (await loader()).default\r\n this._activeLanguage = newLanguage \r\n await this._patch(this._messages,newLanguage) \r\n }else if(typeof(this.global.defaultMessageLoader) === \"function\"){// 如果该语言没有指定加载器,则使用全局配置的默认加载器\r\n this._messages = await this.global.loadMessagesFromDefaultLoader(newLanguage,this)\r\n this._activeLanguage = newLanguage\r\n }else{\r\n this._fallback()\r\n }\r\n }catch(e){\r\n console.warn(`Error while loading language <${newLanguage}> on i18nScope(${this.id}): ${e.message}`)\r\n this._fallback()\r\n } \r\n }\r\n /**\r\n * 当指定了默认语言包加载器后,会从服务加载语言补丁包来更新本地的语言包\r\n * \r\n * 补丁包会自动存储到本地的LocalStorage中 \r\n * \r\n * @param {*} messages \r\n * @param {*} newLanguage \r\n * @returns \r\n */\r\n async _patch(messages,newLanguage){\r\n if(typeof(this.global.loadMessagesFromDefaultLoader) !== 'function') return\r\n try{\r\n let pachedMessages = await this.global.loadMessagesFromDefaultLoader(newLanguage,this)\r\n if(isPlainObject(pachedMessages)){\r\n Object.assign(messages,pachedMessages)\r\n this._savePatchedMessages(pachedMessages,newLanguage)\r\n }\r\n }catch{}\r\n }\r\n /**\r\n * 从本地存储中读取语言包补丁合并到当前语言包中\r\n */\r\n _mergePatchedMessages(){ \r\n let patchedMessages= this._getPatchedMessages(this.activeLanguage)\r\n if(isPlainObject(patchedMessages)){\r\n Object.assign(this._messages,patchedMessages)\r\n }\r\n }\r\n /**\r\n * 将读取的补丁包保存到本地的LocalStorage中\r\n * \r\n * 为什么要保存到本地的LocalStorage中?\r\n * \r\n * 因为默认语言是静态嵌入到源码中的,而加载语言包补丁是延后异步的,\r\n * 当应用启动第一次就会渲染出来的是没有打过补丁的内容。\r\n * \r\n * - 如果还需要等待从服务器加载语言补丁合并后再渲染会影响速度\r\n * - 如果不等待从服务器加载语言补丁就渲染,则会先显示未打补丁的内容,然后在打完补丁后再对应用进行重新渲染生效\r\n * 这明显不是个好的方式\r\n * \r\n * 因此,采用的方式是:\r\n * - 加载语言包补丁后,将之保存到到本地的LocalStorage中\r\n * - 当应用加载时会查询是否存在补丁,如果存在就会合并渲染\r\n * - \r\n * \r\n * @param {*} messages \r\n */\r\n _savePatchedMessages(messages,language){\r\n try{\r\n if(globalThis.localStorage){\r\n globalThis.localStorage.setItem(`voerkai18n_${this.id}_${language}_patched_messages`, JSON.stringify(messages));\r\n }\r\n }catch(e){\r\n console.error(\"Error while save voerkai18n patched messages:\",e.message)\r\n }\r\n }\r\n _getPatchedMessages(language){\r\n try{\r\n return JSON.parse(localStorage.getItem(`voerkai18n_${this.id}_${language}_patched_messages`))\r\n }catch(e){\r\n return {}\r\n }\r\n }\r\n // 以下方法引用全局VoerkaI18n实例的方法\r\n get on(){return this.global.on.bind(this.global)}\r\n get off(){return this.global.off.bind(this.global)}\r\n get offAll(){return this.global.offAll.bind(this.global)}\r\n get change(){\r\n return this.global.change.bind(this.global)\r\n }\r\n}","const { getDataTypeName,isNumber,isPlainObject,deepMerge } = require(\"./utils\")\r\nconst EventEmitter = require(\"./eventemitter\")\r\nconst i18nScope = require(\"./scope.js\")\r\nlet inlineFormatters = require(\"./formatters\") // 内置格式化器\r\n\r\n\r\n\r\n// 用来提取字符里面的插值变量参数 , 支持管道符 { var | formatter | formatter }\r\n// 不支持参数: let varWithPipeRegexp = /\\{\\s*(?\\w+)?(?(\\s*\\|\\s*\\w*\\s*)*)\\s*\\}/g\r\n\r\n// 支持参数: { var | formatter(x,x,..) | formatter }\r\nlet varWithPipeRegexp = /\\{\\s*(?\\w+)?(?(\\s*\\|\\s*\\w*(\\(.*\\)){0,1}\\s*)*)\\s*\\}/g\r\n\r\n// 插值变量字符串替换正则\r\n\r\n//let varReplaceRegexp =String.raw`\\{\\s*(?{name}\\.?\\w*)\\s*\\}`\r\n\r\n\r\nlet varReplaceRegexp =String.raw`\\{\\s*{varname}\\s*\\}`\r\n\r\n/**\r\n * 考虑到通过正则表达式进行插件的替换可能较慢,因此提供一个简单方法来过滤掉那些\r\n * 不需要进行插值处理的字符串\r\n * 原理很简单,就是判断一下是否同时具有{和}字符,如果有则认为可能有插值变量,如果没有则一定没有插件变量,则就不需要进行正则匹配\r\n * 从而可以减少不要的正则匹配\r\n * 注意:该方法只能快速判断一个字符串不包括插值变量\r\n * @param {*} str \r\n * @returns {boolean} true=可能包含插值变量,\r\n */\r\nfunction hasInterpolation(str){\r\n return str.includes(\"{\") && str.includes(\"}\")\r\n} \r\nconst DataTypes = [\"String\",\"Number\",\"Boolean\",\"Object\",\"Array\",\"Function\",\"Error\",\"Symbol\",\"RegExp\",\"Date\",\"Null\",\"Undefined\",\"Set\",\"Map\",\"WeakSet\",\"WeakMap\"]\r\n \r\n\r\n/**\r\n 通过正则表达式对原始文本内容进行解析匹配后得到的\r\n formatters=\"| aaa(1,1) | bbb \"\r\n\r\n 需要统一解析为\r\n\r\n [\r\n [aaa,[1,1]], // [formatter'name,[args,...]]\r\n [bbb,[]],\r\n ]\r\n\r\n formatters=\"| aaa(1,1,\"dddd\") | bbb \"\r\n\r\n 目前对参数采用简单的split(\",\")来解析,因为无法正确解析aaa(1,1,\"dd,,dd\")形式的参数\r\n 在此场景下基本够用了,如果需要支持更复杂的参数解析,可以后续考虑使用正则表达式来解析\r\n \r\n @returns [[,[,,...]]]\r\n */\r\nfunction parseFormatters(formatters){\r\n if(!formatters) return []\r\n // 1. 先解析为 [\"aaa()\",\"bbb\"]形式\r\n let result = formatters.trim().substr(1).trim().split(\"|\").map(r=>r.trim()) \r\n\r\n // 2. 解析格式化器参数\r\n return result.map(formatter=>{\r\n let firstIndex = formatter.indexOf(\"(\")\r\n let lastIndex = formatter.lastIndexOf(\")\")\r\n if(firstIndex!==-1 && lastIndex!==-1){ // 带参数的格式化器\r\n const argsContent = formatter.substr(firstIndex+1,lastIndex-firstIndex-1).trim()\r\n let args = argsContent==\"\" ? [] : argsContent.split(\",\").map(arg=>{\r\n arg = arg.trim()\r\n if(!isNaN(parseInt(arg))){\r\n return parseInt(arg) // 数字\r\n }else if((arg.startsWith('\\\"') && arg.endsWith('\\\"')) || (arg.startsWith('\\'') && arg.endsWith('\\'')) ){\r\n return arg.substr(1,arg.length-2) // 字符串\r\n }else if(arg.toLowerCase()===\"true\" || arg.toLowerCase()===\"false\"){\r\n return arg.toLowerCase()===\"true\" // 布尔值\r\n }else if((arg.startsWith('{') && arg.endsWith('}')) || (arg.startsWith('[') && arg.endsWith(']'))){ \r\n try{\r\n return JSON.parse(arg)\r\n }catch(e){\r\n return String(arg)\r\n }\r\n }else{\r\n return String(arg)\r\n }\r\n })\r\n return [formatter.substr(0,firstIndex),args]\r\n }else{// 不带参数的格式化器\r\n return [formatter,[]]\r\n } \r\n }) \r\n}\r\n\r\n/** \r\n * 提取字符串中的插值变量\r\n * // [\r\n // { \r\n name:<变量名称>,formatters:[{name:<格式化器名称>,args:[<参数>,<参数>,....]]}],<匹配字符串>],\r\n // ....\r\n // \r\n * @param {*} str \r\n * @param {*} isFull =true 保留所有插值变量 =false 进行去重\r\n * @returns {Array} \r\n * [\r\n * {\r\n * name:\"<变量名称>\",\r\n * formatters:[\r\n * {name:\"<格式化器名称>\",args:[<参数>,<参数>,....]},\r\n * {name:\"<格式化器名称>\",args:[<参数>,<参数>,....]},\r\n * ],\r\n * match:\"<匹配字符串>\"\r\n * },\r\n * ...\r\n * ]\r\n */\r\nfunction getInterpolatedVars(str){\r\n let vars = []\r\n forEachInterpolatedVars(str,(varName,formatters,match)=>{\r\n let varItem = {\r\n name:varName,\r\n formatters:formatters.map(([formatter,args])=>{\r\n return {\r\n name:formatter,\r\n args:args\r\n }\r\n }),\r\n match:match\r\n }\r\n if(vars.findIndex(varDef=>((varDef.name===varItem.name) && (varItem.formatters.toString() == varDef.formatters.toString())))===-1){\r\n vars.push(varItem) \r\n }\r\n return \"\"\r\n }) \r\n return vars\r\n}\r\n/**\r\n * 遍历str中的所有插值变量传递给callback,将callback返回的结果替换到str中对应的位置\r\n * @param {*} str \r\n * @param {Function(<变量名称>,[formatters],match[0])} callback \r\n * @returns 返回替换后的字符串\r\n */\r\nfunction forEachInterpolatedVars(str,callback,options={}){\r\n let result=str, match \r\n let opts = Object.assign({\r\n replaceAll:true, // 是否替换所有插值变量,当使用命名插值时应置为true,当使用位置插值时应置为false\r\n },options)\r\n varWithPipeRegexp.lastIndex=0\r\n while ((match = varWithPipeRegexp.exec(result)) !== null) {\r\n const varname = match.groups.varname || \"\"\r\n // 解析格式化器和参数 = [,[,[,,...]]]\r\n const formatters = parseFormatters(match.groups.formatters)\r\n if(typeof(callback)===\"function\"){\r\n try{\r\n if(opts.replaceAll){\r\n result=result.replaceAll(match[0],callback(varname,formatters,match[0]))\r\n }else{\r\n result=result.replace(match[0],callback(varname,formatters,match[0]))\r\n } \r\n }catch{// callback函数可能会抛出异常,如果抛出异常,则中断匹配过程\r\n break \r\n } \r\n }\r\n varWithPipeRegexp.lastIndex=0\r\n }\r\n return result\r\n}\r\n/**\r\n * 将要翻译内容提供了一个非文本内容时进行默认的转换\r\n * - 对函数则执行并取返回结果()\r\n * - 对Array和Object使用JSON.stringify\r\n * - 其他类型使用toString\r\n * \r\n * @param {*} value \r\n * @returns \r\n */\r\nfunction transformToString(value){\r\n let result = value\r\n if(typeof(result)===\"function\") result = value()\r\n if(!(typeof(result)===\"string\")){\r\n if(Array.isArray(result) || isPlainObject(result)){\r\n result = JSON.stringify(result)\r\n }else{\r\n result = result.toString()\r\n }\r\n }\r\n return result\r\n}\r\n\r\nfunction resetScopeCache(scope,activeLanguage=null){\r\n scope.$cache = {activeLanguage,typedFormatters:{},formatters:{}}\r\n}\r\n/**\r\n * 取得指定数据类型的默认格式化器 \r\n * \r\n * 可以为每一个数据类型指定一个默认的格式化器,当传入插值变量时,\r\n * 会自动调用该格式化器来对值进行格式化转换\r\n \r\n const formatters = { \r\n \"*\":{\r\n $types:{...} // 在所有语言下只作用于特定数据类型的格式化器\r\n }, // 在所有语言下生效的格式化器 \r\n zh:{ \r\n $types:{ \r\n [数据类型]:(value)=>{...},\r\n }, \r\n [格式化器名称]:(value)=>{...},\r\n [格式化器名称]:(value)=>{...},\r\n [格式化器名称]:(value)=>{...},\r\n },\r\n }\r\n * @param {*} scope \r\n * @param {*} activeLanguage \r\n * @param {*} dataType 数字类型\r\n * @returns {Function} 格式化函数 \r\n */\r\nfunction getDataTypeDefaultFormatter(scope,activeLanguage,dataType){\r\n if(!scope.$cache) resetScopeCache(scope)\r\n if(scope.$cache.activeLanguage === activeLanguage) {\r\n if(dataType in scope.$cache.typedFormatters) return scope.$cache.typedFormatters[dataType]\r\n }else{// 当语言切换时清空缓存\r\n resetScopeCache(scope,activeLanguage)\r\n }\r\n\r\n // 先在当前作用域中查找,再在全局查找\r\n const targets = [scope.formatters,scope.global.formatters] \r\n for(const target of targets){\r\n if(!target) continue\r\n // 优先在当前语言的$types中查找\r\n if((activeLanguage in target) && isPlainObject(target[activeLanguage].$types)){ \r\n let formatters = target[activeLanguage].$types \r\n if(dataType in formatters && typeof(formatters[dataType])===\"function\"){ \r\n return scope.$cache.typedFormatters[dataType] = formatters[dataType]\r\n } \r\n }\r\n // 在所有语言的$types中查找\r\n if((\"*\" in target) && isPlainObject(target[\"*\"].$types)){\r\n let formatters = target[\"*\"].$types \r\n if(dataType in formatters && typeof(formatters[dataType])===\"function\"){ \r\n return scope.$cache.typedFormatters[dataType] = formatters[dataType]\r\n } \r\n } \r\n } \r\n}\r\n\r\n/**\r\n * 获取指定名称的格式化器函数\r\n * @param {*} scope \r\n * @param {*} activeLanguage \r\n * @param {*} name 格式化器名称\r\n * @returns {Function} 格式化函数 \r\n */ \r\nfunction getFormatter(scope,activeLanguage,name){\r\n // 缓存格式化器引用,避免重复检索\r\n if(!scope.$cache) resetScopeCache(scope)\r\n if(scope.$cache.activeLanguage === activeLanguage) {\r\n if(name in scope.$cache.formatters) return scope.$cache.formatters[name]\r\n }else{// 当语言切换时清空缓存\r\n resetScopeCache(scope,activeLanguage)\r\n }\r\n // 先在当前作用域中查找,再在全局查找\r\n const targets = [scope.formatters,scope.global.formatters] \r\n for(const target of targets){\r\n // 优先在当前语言查找\r\n if(activeLanguage in target){ \r\n let formatters = target[activeLanguage] || {} \r\n if((name in formatters) && typeof(formatters[name])===\"function\") return scope.$cache.formatters[name] = formatters[name]\r\n }\r\n // 在所有语言的$types中查找\r\n let formatters = target[\"*\"] || {} \r\n if((name in formatters) && typeof(formatters[name])===\"function\") return scope.$cache.formatters[name] = formatters[name]\r\n } \r\n}\r\n\r\n/**\r\n * 执行格式化器并返回结果\r\n * @param {*} value \r\n * @param {*} formatters 多个格式化器顺序执行,前一个输出作为下一个格式化器的输入\r\n */\r\nfunction executeFormatter(value,formatters){\r\n if(formatters.length===0) return value\r\n let result = value\r\n try{\r\n for(let formatter of formatters){\r\n if(typeof(formatter) === \"function\") {\r\n result = formatter(result)\r\n }else{// 如果碰到无效的格式化器,则跳过过续的格式化器\r\n return result \r\n }\r\n }\r\n }catch(e){\r\n console.error(`Error while execute i18n formatter for ${value}: ${e.message} ` )\r\n } \r\n return result\r\n}\r\n/**\r\n * 将 [[格式化器名称,[参数,参数,...]],[格式化器名称,[参数,参数,...]]]格式化器转化为\r\n * \r\n * \r\n * \r\n * @param {*} scope \r\n * @param {*} activeLanguage \r\n * @param {*} formatters \r\n */\r\nfunction buildFormatters(scope,activeLanguage,formatters){\r\n let results = [] \r\n for(let formatter of formatters){\r\n if(formatter[0]){\r\n const func = getFormatter(scope,activeLanguage,formatter[0])\r\n if(typeof(func)===\"function\"){\r\n results.push((v)=>{\r\n return func(v,...formatter[1])\r\n })\r\n }else{\r\n // 格式化器无效或者没有定义时,查看当前值是否具有同名的原型方法,如果有则执行调用\r\n // 比如padStart格式化器是String的原型方法,不需要配置就可以直接作为格式化器调用\r\n results.push((v)=>{\r\n if(typeof(v[formatter[0]])===\"function\"){\r\n return v[formatter[0]].call(v,...formatter[1])\r\n }else{\r\n return v\r\n } \r\n }) \r\n } \r\n }\r\n }\r\n return results\r\n} \r\n\r\n/**\r\n * 将value经过格式化器处理后返回\r\n * @param {*} scope \r\n * @param {*} activeLanguage \r\n * @param {*} formatters \r\n * @param {*} value \r\n * @returns \r\n */\r\nfunction getFormattedValue(scope,activeLanguage,formatters,value){\r\n // 1. 取得格式化器函数列表\r\n const formatterFuncs = buildFormatters(scope,activeLanguage,formatters) \r\n // 2. 查找每种数据类型默认格式化器,并添加到formatters最前面,默认数据类型格式化器优先级最高\r\n const defaultFormatter = getDataTypeDefaultFormatter(scope,activeLanguage,getDataTypeName(value)) \r\n if(defaultFormatter){\r\n formatterFuncs.splice(0,0,defaultFormatter)\r\n } \r\n // 3. 执行格式化器\r\n value = executeFormatter(value,formatterFuncs) \r\n return value\r\n}\r\n\r\n/**\r\n * 字符串可以进行变量插值替换,\r\n * replaceInterpolatedVars(\"<模板字符串>\",{变量名称:变量值,变量名称:变量值,...})\r\n * replaceInterpolatedVars(\"<模板字符串>\",[变量值,变量值,...])\r\n * replaceInterpolatedVars(\"<模板字符串>\",变量值,变量值,...])\r\n * \r\n- 当只有两个参数并且第2个参数是{}时,将第2个参数视为命名变量的字典\r\n replaceInterpolatedVars(\"this is {a}+{b},{a:1,b:2}) --> this is 1+2\r\n- 当只有两个参数并且第2个参数是[]时,将第2个参数视为位置参数\r\n replaceInterpolatedVars\"this is {}+{}\",[1,2]) --> this is 1+2\r\n- 普通位置参数替换\r\n replaceInterpolatedVars(\"this is {a}+{b}\",1,2) --> this is 1+2\r\n- \r\nthis == scope == { formatters: {}, ... }\r\n* @param {*} template \r\n* @returns \r\n*/\r\nfunction replaceInterpolatedVars(template,...args) {\r\n const scope = this\r\n // 当前激活语言\r\n const activeLanguage = scope.global.activeLanguage \r\n let result=template\r\n\r\n // 没有变量插值则的返回原字符串 \r\n if(args.length===0 || !hasInterpolation(template)) return template \r\n\r\n // ****************************变量插值****************************\r\n if(args.length===1 && isPlainObject(args[0])){ \r\n // 读取模板字符串中的插值变量列表\r\n // [[var1,[formatter,formatter,...],match],[var2,[formatter,formatter,...],match],...}\r\n let varValues = args[0]\r\n return forEachInterpolatedVars(template,(varname,formatters)=>{\r\n let value = (varname in varValues) ? varValues[varname] : ''\r\n return getFormattedValue(scope,activeLanguage,formatters,value) \r\n }) \r\n }else{ \r\n // ****************************位置插值****************************\r\n // 如果只有一个Array参数,则认为是位置变量列表,进行展开\r\n const params=(args.length===1 && Array.isArray(args[0])) ? [...args[0]] : args \r\n if(params.length===0) return template // 没有变量则不需要进行插值处理,返回原字符串 \r\n let i = 0\r\n return forEachInterpolatedVars(template,(varname,formatters)=>{\r\n if(params.length>i){ \r\n return getFormattedValue(scope,activeLanguage,formatters,params[i++]) \r\n }else{\r\n throw new Error() // 抛出异常,停止插值处理\r\n }\r\n },{replaceAll:false})\r\n \r\n }\r\n return result\r\n} \r\n\r\n// 默认语言配置\r\nconst defaultLanguageSettings = { \r\n defaultLanguage: \"zh\",\r\n activeLanguage: \"zh\",\r\n languages:[\r\n {name:\"zh\",title:\"中文\",default:true},\r\n {name:\"en\",title:\"英文\"}\r\n ],\r\n formatters:inlineFormatters \r\n}\r\n\r\nfunction isMessageId(content){\r\n return parseInt(content)>0\r\n}\r\n/**\r\n * 根据值的单数和复数形式,从messages中取得相应的消息\r\n * \r\n * @param {*} messages 复数形式的文本内容 = [<=0时的内容>,<=1时的内容>,<=2时的内容>,...]\r\n * @param {*} value \r\n */\r\nfunction getPluraMessage(messages,value){\r\n try{\r\n if(Array.isArray(messages)){\r\n return messages.length > value ? messages[value] : messages[messages.length-1]\r\n }else{\r\n return messages\r\n }\r\n }catch{\r\n return Array.isArray(messages) ? messages[0] : messages\r\n }\r\n}\r\nfunction escape(str){\r\n return str.replaceAll(/\\\\(?![trnbvf'\"]{1})/g,\"\\\\\\\\\")\r\n .replaceAll(\"\\t\",\"\\\\t\")\r\n .replaceAll(\"\\n\",\"\\\\n\")\r\n .replaceAll(\"\\b\",\"\\\\b\")\r\n .replaceAll(\"\\r\",\"\\\\r\")\r\n .replaceAll(\"\\f\",\"\\\\f\")\r\n .replaceAll(\"\\'\",\"\\\\'\")\r\n .replaceAll('\\\"','\\\\\"')\r\n .replaceAll('\\v','\\\\v') \r\n}\r\nfunction unescape(str){\r\n return str\r\n .replaceAll(\"\\\\t\",\"\\t\")\r\n .replaceAll(\"\\\\n\",\"\\n\")\r\n .replaceAll(\"\\\\b\",\"\\b\")\r\n .replaceAll(\"\\\\r\",\"\\r\")\r\n .replaceAll(\"\\\\f\",\"\\f\")\r\n .replaceAll(\"\\\\'\",\"\\'\")\r\n .replaceAll('\\\\\"','\\\"')\r\n .replaceAll('\\\\v','\\v') \r\n .replaceAll(/\\\\\\\\(?![trnbvf'\"]{1})/g,\"\\\\\")\r\n}\r\n/**\r\n * 翻译函数\r\n * \r\n* translate(\"要翻译的文本内容\") 如果默认语言是中文,则不会进行翻译直接返回\r\n* translate(\"I am {} {}\",\"man\") == I am man 位置插值\r\n* translate(\"I am {p}\",{p:\"man\"}) 字典插值\r\n* translate(\"total {$count} items\", {$count:1}) //复数形式 \r\n* translate(\"total {} {} {} items\",a,b,c) // 位置变量插值\r\n * \r\n * this===scope 当前绑定的scope\r\n * \r\n */\r\nfunction translate(message) { \r\n const scope = this\r\n const activeLanguage = scope.global.activeLanguage \r\n let content = message\r\n let vars=[] // 插值变量列表\r\n let pluralVars= [] // 复数变量\r\n let pluraValue = null // 复数值\r\n if(!typeof(message)===\"string\") return message\r\n try{\r\n // 1. 预处理变量: 复数变量保存至pluralVars中 , 变量如果是Function则调用 \r\n if(arguments.length === 2 && isPlainObject(arguments[1])){\r\n Object.entries(arguments[1]).forEach(([name,value])=>{\r\n if(typeof(value)===\"function\"){\r\n try{\r\n vars[name] = value()\r\n }catch(e){\r\n vars[name] = value\r\n }\r\n } \r\n // 以$开头的视为复数变量\r\n if(name.startsWith(\"$\") && typeof(vars[name])===\"number\") pluralVars.push(name)\r\n })\r\n vars = [arguments[1]]\r\n }else if(arguments.length >= 2){\r\n vars = [...arguments].splice(1).map((arg,index)=>{\r\n try{\r\n arg = typeof(arg)===\"function\" ? arg() : arg \r\n // 位置参数中以第一个数值变量为复数变量\r\n if(isNumber(arg)) pluraValue = parseInt(arg) \r\n }catch(e){ }\r\n return arg \r\n })\r\n \r\n }\r\n \r\n \r\n \r\n\r\n // 3. 取得翻译文本模板字符串\r\n if(activeLanguage === scope.defaultLanguage){\r\n // 2.1 从默认语言中取得翻译文本模板字符串\r\n // 如果当前语言就是默认语言,不需要查询加载,只需要做插值变换即可\r\n // 当源文件运用了babel插件后会将原始文本内容转换为msgId\r\n // 如果是msgId则从scope.default中读取,scope.default=默认语言包={:}\r\n if(isMessageId(content)){\r\n content = scope.default[content] || message\r\n }\r\n }else{ \r\n // 2.2 从当前语言包中取得翻译文本模板字符串\r\n // 如果没有启用babel插件将源文本转换为msgId,需要先将文本内容转换为msgId\r\n // JSON.stringify在进行转换时会将\\t\\n\\r转换为\\\\t\\\\n\\\\r,这样在进行匹配时就出错 \r\n let msgId = isMessageId(content) ? content : scope.idMap[escape(content)] \r\n content = scope.messages[msgId] || content\r\n content = Array.isArray(content) ? content.map(v=>unescape(v)) : unescape(content)\r\n }\r\n // 2. 处理复数\r\n // 经过上面的处理,content可能是字符串或者数组\r\n // content = \"原始文本内容\" || 复数形式[\"原始文本内容\",\"原始文本内容\"....]\r\n // 如果是数组说明要启用复数机制,需要根据插值变量中的某个变量来判断复数形式\r\n if(Array.isArray(content) && content.length>0){\r\n // 如果存在复数命名变量,只取第一个复数变量\r\n if(pluraValue!==null){ // 启用的是位置插值,pluraIndex=第一个数字变量的位置\r\n content = getPluraMessage(content,pluraValue)\r\n }else if(pluralVar.length>0){\r\n content = getPluraMessage(content,parseInt(vars(pluralVar[0])))\r\n }else{ // 如果找不到复数变量,则使用第一个内容\r\n content = content[0]\r\n }\r\n } \r\n \r\n // 进行插值处理\r\n if(vars.length==0){\r\n return content\r\n }else{\r\n return replaceInterpolatedVars.call(scope,content,...vars)\r\n } \r\n }catch(e){\r\n return content // 出错则返回原始文本\r\n } \r\n}\r\n \r\n/** \r\n * 多语言管理类\r\n * \r\n * 当导入编译后的多语言文件时(import(\"./languages\")),会自动生成全局实例VoerkaI18n\r\n * \r\n * VoerkaI18n.languages // 返回支持的语言列表\r\n * VoerkaI18n.defaultLanguage // 默认语言\r\n * VoerkaI18n.language // 当前语言\r\n * VoerkaI18n.change(language) // 切换到新的语言 \r\n * \r\n * \r\n * VoerkaI18n.on(\"change\",(language)=>{}) // 注册语言切换事件\r\n * VoerkaI18n.off(\"change\",(language)=>{}) \r\n * \r\n * */ \r\n class I18nManager extends EventEmitter{\r\n constructor(settings={}){\r\n super()\r\n if(I18nManager.instance!=null){\r\n return I18nManager.instance;\r\n }\r\n I18nManager.instance = this;\r\n this._settings = deepMerge(defaultLanguageSettings,settings)\r\n this._scopes=[] \r\n this._defaultMessageLoader = null // 默认文本加载器\r\n return I18nManager.instance;\r\n }\r\n get settings(){ return this._settings }\r\n get scopes(){ return this._scopes }\r\n // 当前激活语言\r\n get activeLanguage(){ return this._settings.activeLanguage}\r\n // 默认语言\r\n get defaultLanguage(){ return this._settings.defaultLanguage}\r\n // 支持的语言列表\r\n get languages(){ return this._settings.languages}\r\n // 内置格式化器\r\n get formatters(){ return inlineFormatters }\r\n get defaultMessageLoader(){ return this._defaultMessageLoader}\r\n // 通过默认加载器加载文件\r\n async loadMessagesFromDefaultLoader(newLanguage,scope){\r\n if(typeof(this._defaultMessageLoader) != \"function\") return //throw new Error(\"No default message loader specified\")\r\n return await this._defaultMessageLoader.call(scope,newLanguage,scope) \r\n }\r\n /**\r\n * 切换语言\r\n */\r\n async change(value){\r\n value=value.trim()\r\n if(this.languages.findIndex(lang=>lang.name === value)!==-1 || typeof(this._defaultMessageLoader)===\"function\"){\r\n // 通知所有作用域刷新到对应的语言包\r\n await this._refreshScopes(value)\r\n this._settings.activeLanguage = value \r\n await this.emit(value) /// 触发语言切换事件\r\n }else{\r\n throw new Error(\"Not supported language:\"+value)\r\n }\r\n }\r\n /**\r\n * 当切换语言时调用此方法来加载更新语言包\r\n * @param {*} newLanguage \r\n */\r\n async _refreshScopes(newLanguage){ \r\n // 并发执行所有作用域语言包的加载\r\n try{\r\n const scopeRefreshers = this._scopes.map(scope=>{\r\n return scope.refresh(newLanguage)\r\n })\r\n if(Promise.allSettled){\r\n await Promise.allSettled(scopeRefreshers)\r\n }else{\r\n await Promise.all(scopeRefreshers)\r\n } \r\n }catch(e){\r\n console.warn(\"Error while refreshing i18n scopes:\",e.message)\r\n } \r\n }\r\n /**\r\n * \r\n * 注册一个新的作用域\r\n * \r\n * 每一个库均对应一个作用域,每个作用域可以有多个语言包,且对应一个翻译函数\r\n * 除了默认语言外,其他语言采用动态加载的方式\r\n * \r\n * @param {*} scope \r\n */\r\n async register(scope){\r\n if(!(scope instanceof i18nScope)){\r\n throw new TypeError(\"Scope must be an instance of I18nScope\")\r\n }\r\n this._scopes.push(scope) \r\n await scope.refresh(this.activeLanguage) \r\n }\r\n /**\r\n * 注册全局格式化器\r\n * 格式化器是一个简单的同步函数value=>{...},用来对输入进行格式化后返回结果\r\n * \r\n * registerFormatters(name,value=>{...}) // 适用于所有语言\r\n * registerFormatters(name,value=>{...},{langauge:\"zh\"}) // 适用于cn语言\r\n * registerFormatters(name,value=>{...},{langauge:\"en\"}) // 适用于en语言 \r\n \r\n * @param {*} formatters \r\n */\r\n registerFormatter(name,formatter,{language=\"*\"}={}){\r\n if(!typeof(formatter)===\"function\" || typeof(name)!==\"string\"){\r\n throw new TypeError(\"Formatter must be a function\")\r\n } \r\n if(DataTypes.includes(name)){\r\n this.formatters[language].$types[name] = formatter\r\n }else{\r\n this.formatters[language][name] = formatter\r\n }\r\n }\r\n /**\r\n * 注册默认文本信息加载器\r\n */\r\n registerDefaultLoader(fn){\r\n if(typeof(fn) !== 'function') throw new Error(\"The default loader must be a async function or promise returned\")\r\n this._defaultMessageLoader = fn\r\n this.refresh()\r\n } \r\n async refresh(){\r\n try{\r\n let requests = this._scopes.map(scope=>scope.refresh())\r\n if(Promise.allSettled){\r\n await Promise.allSettled(requests)\r\n }else{\r\n await Promise.all(requests)\r\n }\r\n }catch{}\r\n }\r\n\r\n}\r\n\r\nmodule.exports ={\r\n getInterpolatedVars,\r\n replaceInterpolatedVars,\r\n I18nManager,\r\n translate,\r\n i18nScope,\r\n defaultLanguageSettings,\r\n getDataTypeName,\r\n isNumber,\r\n isPlainObject \r\n}","/**\r\n * 内置的格式化器\r\n * \r\n */\r\n\r\n\r\n/**\r\n * 字典格式化器\r\n * 根据输入data的值,返回后续参数匹配的结果\r\n * dict(data,,,,,,,...)\r\n * \r\n * \r\n * dict(1,1,\"one\",2,\"two\",3,\"three\",4,\"four\") == \"one\"\r\n * dict(2,1,\"one\",2,\"two\",3,\"three\",4,\"four\") == \"two\"\r\n * dict(3,1,\"one\",2,\"two\",3,\"three\",4,\"four\") == \"three\"\r\n * dict(4,1,\"one\",2,\"two\",3,\"three\",4,\"four\") == \"four\"\r\n * // 无匹配时返回原始值\r\n * dict(5,1,\"one\",2,\"two\",3,\"three\",4,\"four\") == 5 \r\n * // 无匹配时并且后续参数个数是奇数,则返回最后一个参数\r\n * dict(5,1,\"one\",2,\"two\",3,\"three\",4,\"four\",\"more\") == \"more\" \r\n * \r\n * 在翻译中使用\r\n * I have { value | dict(1,\"one\",2,\"two\",3,\"three\",4,\"four\")} apples\r\n * \r\n * @param {*} value \r\n * @param {...any} args \r\n * @returns \r\n */\r\n function dict(value,...args){\r\n for(let i=0;i0 && (args.length % 2!==0)) return args[args.length-1]\r\n return value\r\n}\r\n\r\nfunction formatCurrency(value,symbol,retainDots){\r\n\r\n}\r\n\r\nmodule.exports = { \r\n \"*\":{\r\n $types:{\r\n Date:(value)=>value.toLocaleString()\r\n },\r\n time:(value)=> value.toLocaleTimeString(), \r\n shorttime:(value)=> value.toLocaleTimeString(), \r\n date: (value)=> value.toLocaleDateString(), \r\n dict, //字典格式化器\r\n }, \r\n zh:{ \r\n $types:{\r\n Date:(value)=> `${value.getFullYear()}年${value.getMonth()+1}月${value.getDate()}日 ${value.getHours()}点${value.getMinutes()}分${value.getSeconds()}秒`\r\n },\r\n shortime:(value)=> value.toLocaleTimeString(), \r\n time:(value)=>`${value.getHours()}点${value.getMinutes()}分${value.getSeconds()}秒`, \r\n date: (value)=> `${value.getFullYear()}年${value.getMonth()+1}月${value.getDate()}日`,\r\n shortdate: (value)=> `${value.getFullYear()}-${value.getMonth()+1}-${value.getDate()}`,\r\n currency:(value)=>`${value}元`,\r\n },\r\n en:{\r\n currency:(value)=>{\r\n return `$${value}`\r\n }\r\n }\r\n}"],"names":["utils","obj","_typeof","proto","_Object$getPrototypeOf","baseProto","value","isNaN","_parseInt","deepMerge","toObj","formObj","_context","options","results","_Object$assign","_forEachInstanceProperty","_ref","_ref2","_slicedToArray","key","_Array$isArray","array","_context2","_concatInstanceProperty","call","_toConsumableArray","_context3","_Set","v","undefined","constructor","name","eventemitter","EventEmitter","_classCallCheck","this","_callbacks","_emit","_createClass","callback","_includesInstanceProperty","push","i","length","_spliceInstanceProperty","_asyncToGenerator","_regeneratorRuntime","mark","_callee","_len","args","_key","_context4","_args","arguments","wrap","_context5","prev","next","Array","_Promise","allSettled","_mapInstanceProperty","cb","apply","all","stop","isPlainObject","require$$0","DataTypes","scope","i18nScope","_id","id","Date","getTime","toString","Math","random","_languages","languages","_defaultLanguage","defaultLanguage","_activeLanguage","activeLanguage","_default","_messages","messages","_idMap","idMap","_formatters","formatters","_loaders","loaders","_global","_patchMessages","$cache","typedFormatters","_globalThis","VoerkaI18n","I18nManager","require$$1","global","_mergePatchedMessages","_patch","newLanguage","_loading","register","_patch2","_refresh","get","set","then","formatter","_ref$language","language","TypeError","$types","fn","registerDefaultLoader","loader","resolve","abrupt","sent","defaultMessageLoader","loadMessagesFromDefaultLoader","_fallback","t0","console","warn","message","_x","_callee2","pachedMessages","_savePatchedMessages","_x2","_x3","patchedMessages","_getPatchedMessages","localStorage","setItem","concat","_JSON$stringify","e","error","_context6","JSON","parse","getItem","_context7","_bindInstanceProperty","on","_context8","off","_context9","offAll","_context10","change","getDataTypeName","isNumber","require$$2","inlineFormatters","toLocaleString","time","toLocaleTimeString","shorttime","date","toLocaleDateString","dict","zh","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","shortime","shortdate","_context11","currency","en","varWithPipeRegexp","varname","hasInterpolation","str","_String$raw","_templateObject","_taggedTemplateLiteral","parseFormatters","result","_trimInstanceProperty","substr","split","r","firstIndex","_indexOfInstanceProperty","lastIndex","_lastIndexOfInstanceProperty","argsContent","arg","_startsWithInstanceProperty","_endsWithInstanceProperty","toLowerCase","String","forEachInterpolatedVars","match","opts","replaceAll","exec","groups","_replaceAllInstanceProperty","replace","_unused","resetScopeCache","buildFormatters","_step2","_iterator2","_createForOfIteratorHelper","_loop","func","_i2","_targets2","target","getFormatter","_v$formatter$","s","n","done","err","f","getFormattedValue","formatterFuncs","defaultFormatter","dataType","_i","_targets","getDataTypeDefaultFormatter","_step","_iterator","executeFormatter","replaceInterpolatedVars","template","varValues","params","Error","defaultLanguageSettings","title","default","isMessageId","content","getPluraMessage","_unused2","escape","_context12","_context13","_context14","_context15","unescape","_context16","_context17","_context18","_context19","_context20","_context21","_context22","_context23","_register","_refreshScopes2","_change","_this2","settings","_super2","instance","_assertThisInitialized","_settings","_scopes","_defaultMessageLoader","_context28","_context29","_context30","_findIndexInstanceProperty","lang","_refreshScopes","emit","_callee3","_context31","scopeRefreshers","_context32","refresh","_callee4","_context33","_ref5","_ref5$language","_callee5","_context34","requests","_context35","runtime","getInterpolatedVars","vars","varName","varItem","varDef","translate","pluralVars","pluraValue","_context24","_context27","_Object$entries","_ref3","_ref4","_context25","_context26","index","msgId","pluralVar"],"mappings":"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"} \ No newline at end of file diff --git a/packages/runtime/dist/runtime.cjs b/packages/runtime/dist/runtime.cjs deleted file mode 100644 index b71f83d..0000000 --- a/packages/runtime/dist/runtime.cjs +++ /dev/null @@ -1,1047 +0,0 @@ -'use strict'; - -/** - * 判断是否是JSON对象 - * @param {*} obj - * @returns - */ - function isPlainObject$2(obj){ - if (typeof obj !== 'object' || obj === null) return false; - var proto = Object.getPrototypeOf(obj); - if (proto === null) return true; - var baseProto = proto; - - while (Object.getPrototypeOf(baseProto) !== null) { - baseProto = Object.getPrototypeOf(baseProto); - } - return proto === baseProto; -} - -function isNumber$1(value){ - return !isNaN(parseInt(value)) -} - -/** - * 简单进行对象合并 - * - * options={ - * array:0 , // 数组合并策略,0-替换,1-合并,2-去重合并 - * } - * - * @param {*} toObj - * @param {*} formObj - * @returns 合并后的对象 - */ -function deepMerge$1(toObj,formObj,options={}){ - let results = Object.assign({},toObj); - Object.entries(formObj).forEach(([key,value])=>{ - if(key in results){ - if(typeof value === "object" && value !== null){ - if(Array.isArray(value)){ - if(options.array === 0){ - results[key] = value; - }else if(options.array === 1){ - results[key] = [...results[key],...value]; - }else if(options.array === 2){ - results[key] = [...new Set([...results[key],...value])]; - } - }else { - results[key] = deepMerge$1(results[key],value,options); - } - }else { - results[key] = value; - } - }else { - results[key] = value; - } - }); - return results -} - - -/** - * 获取指定变量类型名称 - * getDataTypeName(1) == Number - * getDataTypeName("") == String - * getDataTypeName(null) == Null - * getDataTypeName(undefined) == Undefined - * getDataTypeName(new Date()) == Date - * getDataTypeName(new Error()) == Error - * - * @param {*} v - * @returns - */ - function getDataTypeName$1(v){ - if (v === null) return 'Null' - if (v === undefined) return 'Undefined' - if(typeof(v)==="function") return "Function" - return v.constructor && v.constructor.name; -} - - - - -var utils ={ - isPlainObject: isPlainObject$2, - isNumber: isNumber$1, - deepMerge: deepMerge$1, - getDataTypeName: getDataTypeName$1 -}; - -/** -* -* 简单的事件触发器 -* -*/ - -var eventemitter = class EventEmitter{ - constructor(){ - this._callbacks = []; - } - on(callback){ - if(this._callbacks.includes(callback)) return - this._callbacks.push(callback); - } - off(callback){ - for(let i=0;icb(...args))); - }else { - await Promise.all(this._callbacks.map(cb=>cb(...args))); - } - } -}; - -const { isPlainObject: isPlainObject$1 } = utils; - -const DataTypes$1 = ["String","Number","Boolean","Object","Array","Function","Null","Undefined","Symbol","Date","RegExp","Error"]; - -var scope = class i18nScope { - constructor(options={},callback){ - // 每个作用域都有一个唯一的id - this._id = options.id || (new Date().getTime().toString()+parseInt(Math.random()*1000)); - this._languages = options.languages; // 当前作用域的语言列表 - this._defaultLanguage = options.defaultLanguage || "zh"; // 默认语言名称 - this._activeLanguage = options.activeLanguage; // 当前语言名称 - this._default = options.default; // 默认语言包 - this._messages = options.messages; // 当前语言包 - this._idMap = options.idMap; // 消息id映射列表 - this._formatters = options.formatters; // 当前作用域的格式化函数列表 - this._loaders = options.loaders; // 异步加载语言文件的函数列表 - this._global = null; // 引用全局VoerkaI18n配置,注册后自动引用 - this._patchMessages = {}; // 语言包补丁信息 {:{....},:{....}} - // 主要用来缓存格式化器的引用,当使用格式化器时可以直接引用,避免检索 - this.$cache={ - activeLanguage : null, - typedFormatters: {}, - formatters : {}, - }; - // 如果不存在全局VoerkaI18n实例,说明当前Scope是唯一或第一个加载的作用域, - // 则使用当前作用域来初始化全局VoerkaI18n实例 - if(!globalThis.VoerkaI18n){ - const { I18nManager } = runtime; - globalThis.VoerkaI18n = new I18nManager({ - defaultLanguage: this.defaultLanguage, - activeLanguage : this.activeLanguage, - languages: options.languages, - }); - } - this.global = globalThis.VoerkaI18n; - this._mergePatchedMessages(); - this._patch(this._messages,newLanguage); - // 正在加载语言包标识 - this._loading=false; - // 在全局注册作用域 - this.register(callback); - } - // 作用域 - get id(){return this._id} - // 默认语言名称 - get defaultLanguage(){return this._defaultLanguage} - // 默认语言名称 - get activeLanguage(){return this._activeLanguage} - // 默认语言包 - get default(){return this._default} - // 当前语言包 - get messages(){return this._messages} - // 消息id映射列表 - get idMap(){return this._idMap} - // 当前作用域的格式化函数列表 - get formatters(){return this._formatters} - // 当前作用域支持的语言 - get languages(){return this._languages} - // 异步加载语言文件的函数列表 - get loaders(){return this._loaders} - // 引用全局VoerkaI18n配置,注册后自动引用 - get global(){return this._global} - set global(value){this._global = value;} - /** - * 在全局注册作用域 - * @param {*} callback 当注册 - */ - register(callback){ - if(!typeof(callback)==="function") callback = ()=>{}; - this.global.register(this).then(callback).catch(callback); - } - registerFormatter(name,formatter,{language="*"}={}){ - if(!typeof(formatter)==="function" || typeof(name)!=="string"){ - throw new TypeError("Formatter must be a function") - } - if(DataTypes$1.includes(name)){ - this.formatters[language].$types[name] = formatter; - }else { - this.formatters[language][name] = formatter; - } - } - /** - * 注册默认文本信息加载器 - * @param {Function} 必须是异步函数或者是返回Promise - */ - registerDefaultLoader(fn){ - this.global.registerDefaultLoader(fn); - } - /** - * 回退到默认语言 - */ - _fallback(){ - this._messages = this._default; - this._activeLanguage = this.defaultLanguage; - } - /** - * 刷新当前语言包 - * @param {*} newLanguage - */ - async refresh(newLanguage){ - this._loading = Promise.resolve(); - if(!newLanguage) newLanguage = this.activeLanguage; - // 默认语言,默认语言采用静态加载方式,只需要简单的替换即可 - if(newLanguage === this.defaultLanguage){ - this._messages = this._default; - await this._patch(this._messages,newLanguage); // 异步补丁 - return - } - // 非默认语言需要异步加载语言包文件,加载器是一个异步函数 - // 如果没有加载器,则无法加载语言包,因此回退到默认语言 - let loader = this.loaders[newLanguage]; - try{ - if(typeof(loader) === "function"){ - this._messages = (await loader()).default; - this._activeLanguage = newLanguage; - await this._patch(this._messages,newLanguage); - }else if(typeof(this.global.defaultMessageLoader) === "function"){// 如果该语言没有指定加载器,则使用全局配置的默认加载器 - this._messages = await this.global.loadMessagesFromDefaultLoader(newLanguage,this); - this._activeLanguage = newLanguage; - }else { - this._fallback(); - } - }catch(e){ - console.warn(`Error while loading language <${newLanguage}> on i18nScope(${this.id}): ${e.message}`); - this._fallback(); - } - } - /** - * 当指定了默认语言包加载器后,会从服务加载语言补丁包来更新本地的语言包 - * - * 补丁包会自动存储到本地的LocalStorage中 - * - * @param {*} messages - * @param {*} newLanguage - * @returns - */ - async _patch(messages,newLanguage){ - if(typeof(this.global.loadMessagesFromDefaultLoader) !== 'function') return - try{ - let pachedMessages = await this.global.loadMessagesFromDefaultLoader(newLanguage,this); - if(isPlainObject$1(pachedMessages)){ - Object.assign(messages,pachedMessages); - this._savePatchedMessages(pachedMessages,newLanguage); - } - }catch{} - } - /** - * 从本地存储中读取语言包补丁合并到当前语言包中 - */ - _mergePatchedMessages(){ - let patchedMessages= this._getPatchedMessages(this.activeLanguage); - if(isPlainObject$1(patchedMessages)){ - Object.assign(this._messages,patchedMessages); - } - } - /** - * 将读取的补丁包保存到本地的LocalStorage中 - * - * 为什么要保存到本地的LocalStorage中? - * - * 因为默认语言是静态嵌入到源码中的,而加载语言包补丁是延后异步的, - * 当应用启动第一次就会渲染出来的是没有打过补丁的内容。 - * - * - 如果还需要等待从服务器加载语言补丁合并后再渲染会影响速度 - * - 如果不等待从服务器加载语言补丁就渲染,则会先显示未打补丁的内容,然后在打完补丁后再对应用进行重新渲染生效 - * 这明显不是个好的方式 - * - * 因此,采用的方式是: - * - 加载语言包补丁后,将之保存到到本地的LocalStorage中 - * - 当应用加载时会查询是否存在补丁,如果存在就会合并渲染 - * - - * - * @param {*} messages - */ - _savePatchedMessages(messages,language){ - try{ - if(globalThis.localStorage){ - globalThis.localStorage.setItem(`voerkai18n_${this.id}_${language}_patched_messages`, JSON.stringify(messages)); - } - }catch(e){ - console.error("Error while save voerkai18n patched messages:",e.message); - } - } - _getPatchedMessages(language){ - try{ - return JSON.parse(localStorage.getItem(`voerkai18n_${this.id}_${language}_patched_messages`)) - }catch(e){ - return {} - } - } - // 以下方法引用全局VoerkaI18n实例的方法 - get on(){return this.global.on.bind(this.global)} - get off(){return this.global.off.bind(this.global)} - get offAll(){return this.global.offAll.bind(this.global)} - get change(){ - return this.global.change.bind(this.global) - } -}; - -/** - * 内置的格式化器 - * - */ - -/** - * 字典格式化器 - * 根据输入data的值,返回后续参数匹配的结果 - * dict(data,,,,,,,...) - * - * - * dict(1,1,"one",2,"two",3,"three",4,"four") == "one" - * dict(2,1,"one",2,"two",3,"three",4,"four") == "two" - * dict(3,1,"one",2,"two",3,"three",4,"four") == "three" - * dict(4,1,"one",2,"two",3,"three",4,"four") == "four" - * // 无匹配时返回原始值 - * dict(5,1,"one",2,"two",3,"three",4,"four") == 5 - * // 无匹配时并且后续参数个数是奇数,则返回最后一个参数 - * dict(5,1,"one",2,"two",3,"three",4,"four","more") == "more" - * - * 在翻译中使用 - * I have { value | dict(1,"one",2,"two",3,"three",4,"four")} apples - * - * @param {*} value - * @param {...any} args - * @returns - */ - function dict(value,...args){ - for(let i=0;i0 && (args.length % 2!==0)) return args[args.length-1] - return value -} - -var formatters = { - "*":{ - $types:{ - Date:(value)=>value.toLocaleString() - }, - time:(value)=> value.toLocaleTimeString(), - shorttime:(value)=> value.toLocaleTimeString(), - date: (value)=> value.toLocaleDateString(), - dict, //字典格式化器 - }, - zh:{ - $types:{ - Date:(value)=> `${value.getFullYear()}年${value.getMonth()+1}月${value.getDate()}日 ${value.getHours()}点${value.getMinutes()}分${value.getSeconds()}秒` - }, - shortime:(value)=> value.toLocaleTimeString(), - time:(value)=>`${value.getHours()}点${value.getMinutes()}分${value.getSeconds()}秒`, - date: (value)=> `${value.getFullYear()}年${value.getMonth()+1}月${value.getDate()}日`, - shortdate: (value)=> `${value.getFullYear()}-${value.getMonth()+1}-${value.getDate()}`, - currency:(value)=>`${value}元`, - }, - en:{ - currency:(value)=>{ - return `$${value}` - } - } -}; - -const { getDataTypeName,isNumber,isPlainObject,deepMerge } = utils; -const EventEmitter = eventemitter; -const i18nScope = scope; -let inlineFormatters = formatters; // 内置格式化器 - - - -// 用来提取字符里面的插值变量参数 , 支持管道符 { var | formatter | formatter } -// 不支持参数: let varWithPipeRegexp = /\{\s*(?\w+)?(?(\s*\|\s*\w*\s*)*)\s*\}/g - -// 支持参数: { var | formatter(x,x,..) | formatter } -let varWithPipeRegexp = /\{\s*(?\w+)?(?(\s*\|\s*\w*(\(.*\)){0,1}\s*)*)\s*\}/g; - -/** - * 考虑到通过正则表达式进行插件的替换可能较慢,因此提供一个简单方法来过滤掉那些 - * 不需要进行插值处理的字符串 - * 原理很简单,就是判断一下是否同时具有{和}字符,如果有则认为可能有插值变量,如果没有则一定没有插件变量,则就不需要进行正则匹配 - * 从而可以减少不要的正则匹配 - * 注意:该方法只能快速判断一个字符串不包括插值变量 - * @param {*} str - * @returns {boolean} true=可能包含插值变量, - */ -function hasInterpolation(str){ - return str.includes("{") && str.includes("}") -} -const DataTypes = ["String","Number","Boolean","Object","Array","Function","Error","Symbol","RegExp","Date","Null","Undefined","Set","Map","WeakSet","WeakMap"]; - - -/** - 通过正则表达式对原始文本内容进行解析匹配后得到的 - formatters="| aaa(1,1) | bbb " - - 需要统一解析为 - - [ - [aaa,[1,1]], // [formatter'name,[args,...]] - [bbb,[]], - ] - - formatters="| aaa(1,1,"dddd") | bbb " - - 目前对参数采用简单的split(",")来解析,因为无法正确解析aaa(1,1,"dd,,dd")形式的参数 - 在此场景下基本够用了,如果需要支持更复杂的参数解析,可以后续考虑使用正则表达式来解析 - - @returns [[,[,,...]]] - */ -function parseFormatters(formatters){ - if(!formatters) return [] - // 1. 先解析为 ["aaa()","bbb"]形式 - let result = formatters.trim().substr(1).trim().split("|").map(r=>r.trim()); - - // 2. 解析格式化器参数 - return result.map(formatter=>{ - let firstIndex = formatter.indexOf("("); - let lastIndex = formatter.lastIndexOf(")"); - if(firstIndex!==-1 && lastIndex!==-1){ // 带参数的格式化器 - const argsContent = formatter.substr(firstIndex+1,lastIndex-firstIndex-1).trim(); - let args = argsContent=="" ? [] : argsContent.split(",").map(arg=>{ - arg = arg.trim(); - if(!isNaN(parseInt(arg))){ - return parseInt(arg) // 数字 - }else if((arg.startsWith('\"') && arg.endsWith('\"')) || (arg.startsWith('\'') && arg.endsWith('\'')) ){ - return arg.substr(1,arg.length-2) // 字符串 - }else if(arg.toLowerCase()==="true" || arg.toLowerCase()==="false"){ - return arg.toLowerCase()==="true" // 布尔值 - }else if((arg.startsWith('{') && arg.endsWith('}')) || (arg.startsWith('[') && arg.endsWith(']'))){ - try{ - return JSON.parse(arg) - }catch(e){ - return String(arg) - } - }else { - return String(arg) - } - }); - return [formatter.substr(0,firstIndex),args] - }else {// 不带参数的格式化器 - return [formatter,[]] - } - }) -} - -/** - * 提取字符串中的插值变量 - * // [ - // { - name:<变量名称>,formatters:[{name:<格式化器名称>,args:[<参数>,<参数>,....]]}],<匹配字符串>], - // .... - // - * @param {*} str - * @param {*} isFull =true 保留所有插值变量 =false 进行去重 - * @returns {Array} - * [ - * { - * name:"<变量名称>", - * formatters:[ - * {name:"<格式化器名称>",args:[<参数>,<参数>,....]}, - * {name:"<格式化器名称>",args:[<参数>,<参数>,....]}, - * ], - * match:"<匹配字符串>" - * }, - * ... - * ] - */ -function getInterpolatedVars(str){ - let vars = []; - forEachInterpolatedVars(str,(varName,formatters,match)=>{ - let varItem = { - name:varName, - formatters:formatters.map(([formatter,args])=>{ - return { - name:formatter, - args:args - } - }), - match:match - }; - if(vars.findIndex(varDef=>((varDef.name===varItem.name) && (varItem.formatters.toString() == varDef.formatters.toString())))===-1){ - vars.push(varItem); - } - return "" - }); - return vars -} -/** - * 遍历str中的所有插值变量传递给callback,将callback返回的结果替换到str中对应的位置 - * @param {*} str - * @param {Function(<变量名称>,[formatters],match[0])} callback - * @returns 返回替换后的字符串 - */ -function forEachInterpolatedVars(str,callback,options={}){ - let result=str, match; - let opts = Object.assign({ - replaceAll:true, // 是否替换所有插值变量,当使用命名插值时应置为true,当使用位置插值时应置为false - },options); - varWithPipeRegexp.lastIndex=0; - while ((match = varWithPipeRegexp.exec(result)) !== null) { - const varname = match.groups.varname || ""; - // 解析格式化器和参数 = [,[,[,,...]]] - const formatters = parseFormatters(match.groups.formatters); - if(typeof(callback)==="function"){ - try{ - if(opts.replaceAll){ - result=result.replaceAll(match[0],callback(varname,formatters,match[0])); - }else { - result=result.replace(match[0],callback(varname,formatters,match[0])); - } - }catch{// callback函数可能会抛出异常,如果抛出异常,则中断匹配过程 - break - } - } - varWithPipeRegexp.lastIndex=0; - } - return result -} - -function resetScopeCache(scope,activeLanguage=null){ - scope.$cache = {activeLanguage,typedFormatters:{},formatters:{}}; -} -/** - * 取得指定数据类型的默认格式化器 - * - * 可以为每一个数据类型指定一个默认的格式化器,当传入插值变量时, - * 会自动调用该格式化器来对值进行格式化转换 - - const formatters = { - "*":{ - $types:{...} // 在所有语言下只作用于特定数据类型的格式化器 - }, // 在所有语言下生效的格式化器 - zh:{ - $types:{ - [数据类型]:(value)=>{...}, - }, - [格式化器名称]:(value)=>{...}, - [格式化器名称]:(value)=>{...}, - [格式化器名称]:(value)=>{...}, - }, - } - * @param {*} scope - * @param {*} activeLanguage - * @param {*} dataType 数字类型 - * @returns {Function} 格式化函数 - */ -function getDataTypeDefaultFormatter(scope,activeLanguage,dataType){ - if(!scope.$cache) resetScopeCache(scope); - if(scope.$cache.activeLanguage === activeLanguage) { - if(dataType in scope.$cache.typedFormatters) return scope.$cache.typedFormatters[dataType] - }else {// 当语言切换时清空缓存 - resetScopeCache(scope,activeLanguage); - } - - // 先在当前作用域中查找,再在全局查找 - const targets = [scope.formatters,scope.global.formatters]; - for(const target of targets){ - if(!target) continue - // 优先在当前语言的$types中查找 - if((activeLanguage in target) && isPlainObject(target[activeLanguage].$types)){ - let formatters = target[activeLanguage].$types; - if(dataType in formatters && typeof(formatters[dataType])==="function"){ - return scope.$cache.typedFormatters[dataType] = formatters[dataType] - } - } - // 在所有语言的$types中查找 - if(("*" in target) && isPlainObject(target["*"].$types)){ - let formatters = target["*"].$types; - if(dataType in formatters && typeof(formatters[dataType])==="function"){ - return scope.$cache.typedFormatters[dataType] = formatters[dataType] - } - } - } -} - -/** - * 获取指定名称的格式化器函数 - * @param {*} scope - * @param {*} activeLanguage - * @param {*} name 格式化器名称 - * @returns {Function} 格式化函数 - */ -function getFormatter(scope,activeLanguage,name){ - // 缓存格式化器引用,避免重复检索 - if(!scope.$cache) resetScopeCache(scope); - if(scope.$cache.activeLanguage === activeLanguage) { - if(name in scope.$cache.formatters) return scope.$cache.formatters[name] - }else {// 当语言切换时清空缓存 - resetScopeCache(scope,activeLanguage); - } - // 先在当前作用域中查找,再在全局查找 - const targets = [scope.formatters,scope.global.formatters]; - for(const target of targets){ - // 优先在当前语言查找 - if(activeLanguage in target){ - let formatters = target[activeLanguage] || {}; - if((name in formatters) && typeof(formatters[name])==="function") return scope.$cache.formatters[name] = formatters[name] - } - // 在所有语言的$types中查找 - let formatters = target["*"] || {}; - if((name in formatters) && typeof(formatters[name])==="function") return scope.$cache.formatters[name] = formatters[name] - } -} - -/** - * 执行格式化器并返回结果 - * @param {*} value - * @param {*} formatters 多个格式化器顺序执行,前一个输出作为下一个格式化器的输入 - */ -function executeFormatter(value,formatters){ - if(formatters.length===0) return value - let result = value; - try{ - for(let formatter of formatters){ - if(typeof(formatter) === "function") { - result = formatter(result); - }else {// 如果碰到无效的格式化器,则跳过过续的格式化器 - return result - } - } - }catch(e){ - console.error(`Error while execute i18n formatter for ${value}: ${e.message} ` ); - } - return result -} -/** - * 将 [[格式化器名称,[参数,参数,...]],[格式化器名称,[参数,参数,...]]]格式化器转化为 - * - * - * - * @param {*} scope - * @param {*} activeLanguage - * @param {*} formatters - */ -function buildFormatters(scope,activeLanguage,formatters){ - let results = []; - for(let formatter of formatters){ - if(formatter[0]){ - const func = getFormatter(scope,activeLanguage,formatter[0]); - if(typeof(func)==="function"){ - results.push((v)=>{ - return func(v,...formatter[1]) - }); - }else { - // 格式化器无效或者没有定义时,查看当前值是否具有同名的原型方法,如果有则执行调用 - // 比如padStart格式化器是String的原型方法,不需要配置就可以直接作为格式化器调用 - results.push((v)=>{ - if(typeof(v[formatter[0]])==="function"){ - return v[formatter[0]].call(v,...formatter[1]) - }else { - return v - } - }); - } - } - } - return results -} - -/** - * 将value经过格式化器处理后返回 - * @param {*} scope - * @param {*} activeLanguage - * @param {*} formatters - * @param {*} value - * @returns - */ -function getFormattedValue(scope,activeLanguage,formatters,value){ - // 1. 取得格式化器函数列表 - const formatterFuncs = buildFormatters(scope,activeLanguage,formatters); - // 2. 查找每种数据类型默认格式化器,并添加到formatters最前面,默认数据类型格式化器优先级最高 - const defaultFormatter = getDataTypeDefaultFormatter(scope,activeLanguage,getDataTypeName(value)); - if(defaultFormatter){ - formatterFuncs.splice(0,0,defaultFormatter); - } - // 3. 执行格式化器 - value = executeFormatter(value,formatterFuncs); - return value -} - -/** - * 字符串可以进行变量插值替换, - * replaceInterpolatedVars("<模板字符串>",{变量名称:变量值,变量名称:变量值,...}) - * replaceInterpolatedVars("<模板字符串>",[变量值,变量值,...]) - * replaceInterpolatedVars("<模板字符串>",变量值,变量值,...]) - * -- 当只有两个参数并且第2个参数是{}时,将第2个参数视为命名变量的字典 - replaceInterpolatedVars("this is {a}+{b},{a:1,b:2}) --> this is 1+2 -- 当只有两个参数并且第2个参数是[]时,将第2个参数视为位置参数 - replaceInterpolatedVars"this is {}+{}",[1,2]) --> this is 1+2 -- 普通位置参数替换 - replaceInterpolatedVars("this is {a}+{b}",1,2) --> this is 1+2 -- -this == scope == { formatters: {}, ... } -* @param {*} template -* @returns -*/ -function replaceInterpolatedVars(template,...args) { - const scope = this; - // 当前激活语言 - const activeLanguage = scope.global.activeLanguage; - - // 没有变量插值则的返回原字符串 - if(args.length===0 || !hasInterpolation(template)) return template - - // ****************************变量插值**************************** - if(args.length===1 && isPlainObject(args[0])){ - // 读取模板字符串中的插值变量列表 - // [[var1,[formatter,formatter,...],match],[var2,[formatter,formatter,...],match],...} - let varValues = args[0]; - return forEachInterpolatedVars(template,(varname,formatters)=>{ - let value = (varname in varValues) ? varValues[varname] : ''; - return getFormattedValue(scope,activeLanguage,formatters,value) - }) - }else { - // ****************************位置插值**************************** - // 如果只有一个Array参数,则认为是位置变量列表,进行展开 - const params=(args.length===1 && Array.isArray(args[0])) ? [...args[0]] : args; - if(params.length===0) return template // 没有变量则不需要进行插值处理,返回原字符串 - let i = 0; - return forEachInterpolatedVars(template,(varname,formatters)=>{ - if(params.length>i){ - return getFormattedValue(scope,activeLanguage,formatters,params[i++]) - }else { - throw new Error() // 抛出异常,停止插值处理 - } - },{replaceAll:false}) - - } -} - -// 默认语言配置 -const defaultLanguageSettings = { - defaultLanguage: "zh", - activeLanguage: "zh", - languages:[ - {name:"zh",title:"中文",default:true}, - {name:"en",title:"英文"} - ], - formatters:inlineFormatters -}; - -function isMessageId(content){ - return parseInt(content)>0 -} -/** - * 根据值的单数和复数形式,从messages中取得相应的消息 - * - * @param {*} messages 复数形式的文本内容 = [<=0时的内容>,<=1时的内容>,<=2时的内容>,...] - * @param {*} value - */ -function getPluraMessage(messages,value){ - try{ - if(Array.isArray(messages)){ - return messages.length > value ? messages[value] : messages[messages.length-1] - }else { - return messages - } - }catch{ - return Array.isArray(messages) ? messages[0] : messages - } -} -function escape(str){ - return str.replaceAll(/\\(?![trnbvf'"]{1})/g,"\\\\") - .replaceAll("\t","\\t") - .replaceAll("\n","\\n") - .replaceAll("\b","\\b") - .replaceAll("\r","\\r") - .replaceAll("\f","\\f") - .replaceAll("\'","\\'") - .replaceAll('\"','\\"') - .replaceAll('\v','\\v') -} -function unescape(str){ - return str - .replaceAll("\\t","\t") - .replaceAll("\\n","\n") - .replaceAll("\\b","\b") - .replaceAll("\\r","\r") - .replaceAll("\\f","\f") - .replaceAll("\\'","\'") - .replaceAll('\\"','\"') - .replaceAll('\\v','\v') - .replaceAll(/\\\\(?![trnbvf'"]{1})/g,"\\") -} -/** - * 翻译函数 - * -* translate("要翻译的文本内容") 如果默认语言是中文,则不会进行翻译直接返回 -* translate("I am {} {}","man") == I am man 位置插值 -* translate("I am {p}",{p:"man"}) 字典插值 -* translate("total {$count} items", {$count:1}) //复数形式 -* translate("total {} {} {} items",a,b,c) // 位置变量插值 - * - * this===scope 当前绑定的scope - * - */ -function translate(message) { - const scope = this; - const activeLanguage = scope.global.activeLanguage; - let content = message; - let vars=[]; // 插值变量列表 - let pluralVars= []; // 复数变量 - let pluraValue = null; // 复数值 - if(!typeof(message)==="string") return message - try{ - // 1. 预处理变量: 复数变量保存至pluralVars中 , 变量如果是Function则调用 - if(arguments.length === 2 && isPlainObject(arguments[1])){ - Object.entries(arguments[1]).forEach(([name,value])=>{ - if(typeof(value)==="function"){ - try{ - vars[name] = value(); - }catch(e){ - vars[name] = value; - } - } - // 以$开头的视为复数变量 - if(name.startsWith("$") && typeof(vars[name])==="number") pluralVars.push(name); - }); - vars = [arguments[1]]; - }else if(arguments.length >= 2){ - vars = [...arguments].splice(1).map((arg,index)=>{ - try{ - arg = typeof(arg)==="function" ? arg() : arg; - // 位置参数中以第一个数值变量为复数变量 - if(isNumber(arg)) pluraValue = parseInt(arg); - }catch(e){ } - return arg - }); - - } - - - - - // 3. 取得翻译文本模板字符串 - if(activeLanguage === scope.defaultLanguage){ - // 2.1 从默认语言中取得翻译文本模板字符串 - // 如果当前语言就是默认语言,不需要查询加载,只需要做插值变换即可 - // 当源文件运用了babel插件后会将原始文本内容转换为msgId - // 如果是msgId则从scope.default中读取,scope.default=默认语言包={:} - if(isMessageId(content)){ - content = scope.default[content] || message; - } - }else { - // 2.2 从当前语言包中取得翻译文本模板字符串 - // 如果没有启用babel插件将源文本转换为msgId,需要先将文本内容转换为msgId - // JSON.stringify在进行转换时会将\t\n\r转换为\\t\\n\\r,这样在进行匹配时就出错 - let msgId = isMessageId(content) ? content : scope.idMap[escape(content)]; - content = scope.messages[msgId] || content; - content = Array.isArray(content) ? content.map(v=>unescape(v)) : unescape(content); - } - // 2. 处理复数 - // 经过上面的处理,content可能是字符串或者数组 - // content = "原始文本内容" || 复数形式["原始文本内容","原始文本内容"....] - // 如果是数组说明要启用复数机制,需要根据插值变量中的某个变量来判断复数形式 - if(Array.isArray(content) && content.length>0){ - // 如果存在复数命名变量,只取第一个复数变量 - if(pluraValue!==null){ // 启用的是位置插值,pluraIndex=第一个数字变量的位置 - content = getPluraMessage(content,pluraValue); - }else if(pluralVar.length>0){ - content = getPluraMessage(content,parseInt(vars(pluralVar[0]))); - }else { // 如果找不到复数变量,则使用第一个内容 - content = content[0]; - } - } - - // 进行插值处理 - if(vars.length==0){ - return content - }else { - return replaceInterpolatedVars.call(scope,content,...vars) - } - }catch(e){ - return content // 出错则返回原始文本 - } -} - -/** - * 多语言管理类 - * - * 当导入编译后的多语言文件时(import("./languages")),会自动生成全局实例VoerkaI18n - * - * VoerkaI18n.languages // 返回支持的语言列表 - * VoerkaI18n.defaultLanguage // 默认语言 - * VoerkaI18n.language // 当前语言 - * VoerkaI18n.change(language) // 切换到新的语言 - * - * - * VoerkaI18n.on("change",(language)=>{}) // 注册语言切换事件 - * VoerkaI18n.off("change",(language)=>{}) - * - * */ - class I18nManager extends EventEmitter{ - constructor(settings={}){ - super(); - if(I18nManager.instance!=null){ - return I18nManager.instance; - } - I18nManager.instance = this; - this._settings = deepMerge(defaultLanguageSettings,settings); - this._scopes=[]; - this._defaultMessageLoader = null; // 默认文本加载器 - return I18nManager.instance; - } - get settings(){ return this._settings } - get scopes(){ return this._scopes } - // 当前激活语言 - get activeLanguage(){ return this._settings.activeLanguage} - // 默认语言 - get defaultLanguage(){ return this._settings.defaultLanguage} - // 支持的语言列表 - get languages(){ return this._settings.languages} - // 内置格式化器 - get formatters(){ return inlineFormatters } - get defaultMessageLoader(){ return this._defaultMessageLoader} - // 通过默认加载器加载文件 - async loadMessagesFromDefaultLoader(newLanguage,scope){ - if(typeof(this._defaultMessageLoader) != "function") return //throw new Error("No default message loader specified") - return await this._defaultMessageLoader.call(scope,newLanguage,scope) - } - /** - * 切换语言 - */ - async change(value){ - value=value.trim(); - if(this.languages.findIndex(lang=>lang.name === value)!==-1 || typeof(this._defaultMessageLoader)==="function"){ - // 通知所有作用域刷新到对应的语言包 - await this._refreshScopes(value); - this._settings.activeLanguage = value; - await this.emit(value); /// 触发语言切换事件 - }else { - throw new Error("Not supported language:"+value) - } - } - /** - * 当切换语言时调用此方法来加载更新语言包 - * @param {*} newLanguage - */ - async _refreshScopes(newLanguage){ - // 并发执行所有作用域语言包的加载 - try{ - const scopeRefreshers = this._scopes.map(scope=>{ - return scope.refresh(newLanguage) - }); - if(Promise.allSettled){ - await Promise.allSettled(scopeRefreshers); - }else { - await Promise.all(scopeRefreshers); - } - }catch(e){ - console.warn("Error while refreshing i18n scopes:",e.message); - } - } - /** - * - * 注册一个新的作用域 - * - * 每一个库均对应一个作用域,每个作用域可以有多个语言包,且对应一个翻译函数 - * 除了默认语言外,其他语言采用动态加载的方式 - * - * @param {*} scope - */ - async register(scope){ - if(!(scope instanceof i18nScope)){ - throw new TypeError("Scope must be an instance of I18nScope") - } - this._scopes.push(scope); - await scope.refresh(this.activeLanguage); - } - /** - * 注册全局格式化器 - * 格式化器是一个简单的同步函数value=>{...},用来对输入进行格式化后返回结果 - * - * registerFormatters(name,value=>{...}) // 适用于所有语言 - * registerFormatters(name,value=>{...},{langauge:"zh"}) // 适用于cn语言 - * registerFormatters(name,value=>{...},{langauge:"en"}) // 适用于en语言 - - * @param {*} formatters - */ - registerFormatter(name,formatter,{language="*"}={}){ - if(!typeof(formatter)==="function" || typeof(name)!=="string"){ - throw new TypeError("Formatter must be a function") - } - if(DataTypes.includes(name)){ - this.formatters[language].$types[name] = formatter; - }else { - this.formatters[language][name] = formatter; - } - } - /** - * 注册默认文本信息加载器 - */ - registerDefaultLoader(fn){ - if(typeof(fn) !== 'function') throw new Error("The default loader must be a async function or promise returned") - this._defaultMessageLoader = fn; - this.refresh(); - } - async refresh(){ - try{ - let requests = this._scopes.map(scope=>scope.refresh()); - if(Promise.allSettled){ - await Promise.allSettled(requests); - }else { - await Promise.all(requests); - } - }catch{} - } - -} - -var runtime ={ - getInterpolatedVars, - replaceInterpolatedVars, - I18nManager, - translate, - i18nScope, - defaultLanguageSettings, - getDataTypeName, - isNumber, - isPlainObject -}; - -module.exports = runtime; diff --git a/packages/runtime/dist/runtime.mjs b/packages/runtime/dist/runtime.mjs deleted file mode 100644 index 634f5cb..0000000 --- a/packages/runtime/dist/runtime.mjs +++ /dev/null @@ -1,1045 +0,0 @@ -/** - * 判断是否是JSON对象 - * @param {*} obj - * @returns - */ - function isPlainObject$2(obj){ - if (typeof obj !== 'object' || obj === null) return false; - var proto = Object.getPrototypeOf(obj); - if (proto === null) return true; - var baseProto = proto; - - while (Object.getPrototypeOf(baseProto) !== null) { - baseProto = Object.getPrototypeOf(baseProto); - } - return proto === baseProto; -} - -function isNumber$1(value){ - return !isNaN(parseInt(value)) -} - -/** - * 简单进行对象合并 - * - * options={ - * array:0 , // 数组合并策略,0-替换,1-合并,2-去重合并 - * } - * - * @param {*} toObj - * @param {*} formObj - * @returns 合并后的对象 - */ -function deepMerge$1(toObj,formObj,options={}){ - let results = Object.assign({},toObj); - Object.entries(formObj).forEach(([key,value])=>{ - if(key in results){ - if(typeof value === "object" && value !== null){ - if(Array.isArray(value)){ - if(options.array === 0){ - results[key] = value; - }else if(options.array === 1){ - results[key] = [...results[key],...value]; - }else if(options.array === 2){ - results[key] = [...new Set([...results[key],...value])]; - } - }else { - results[key] = deepMerge$1(results[key],value,options); - } - }else { - results[key] = value; - } - }else { - results[key] = value; - } - }); - return results -} - - -/** - * 获取指定变量类型名称 - * getDataTypeName(1) == Number - * getDataTypeName("") == String - * getDataTypeName(null) == Null - * getDataTypeName(undefined) == Undefined - * getDataTypeName(new Date()) == Date - * getDataTypeName(new Error()) == Error - * - * @param {*} v - * @returns - */ - function getDataTypeName$1(v){ - if (v === null) return 'Null' - if (v === undefined) return 'Undefined' - if(typeof(v)==="function") return "Function" - return v.constructor && v.constructor.name; -} - - - - -var utils ={ - isPlainObject: isPlainObject$2, - isNumber: isNumber$1, - deepMerge: deepMerge$1, - getDataTypeName: getDataTypeName$1 -}; - -/** -* -* 简单的事件触发器 -* -*/ - -var eventemitter = class EventEmitter{ - constructor(){ - this._callbacks = []; - } - on(callback){ - if(this._callbacks.includes(callback)) return - this._callbacks.push(callback); - } - off(callback){ - for(let i=0;icb(...args))); - }else { - await Promise.all(this._callbacks.map(cb=>cb(...args))); - } - } -}; - -const { isPlainObject: isPlainObject$1 } = utils; - -const DataTypes$1 = ["String","Number","Boolean","Object","Array","Function","Null","Undefined","Symbol","Date","RegExp","Error"]; - -var scope = class i18nScope { - constructor(options={},callback){ - // 每个作用域都有一个唯一的id - this._id = options.id || (new Date().getTime().toString()+parseInt(Math.random()*1000)); - this._languages = options.languages; // 当前作用域的语言列表 - this._defaultLanguage = options.defaultLanguage || "zh"; // 默认语言名称 - this._activeLanguage = options.activeLanguage; // 当前语言名称 - this._default = options.default; // 默认语言包 - this._messages = options.messages; // 当前语言包 - this._idMap = options.idMap; // 消息id映射列表 - this._formatters = options.formatters; // 当前作用域的格式化函数列表 - this._loaders = options.loaders; // 异步加载语言文件的函数列表 - this._global = null; // 引用全局VoerkaI18n配置,注册后自动引用 - this._patchMessages = {}; // 语言包补丁信息 {:{....},:{....}} - // 主要用来缓存格式化器的引用,当使用格式化器时可以直接引用,避免检索 - this.$cache={ - activeLanguage : null, - typedFormatters: {}, - formatters : {}, - }; - // 如果不存在全局VoerkaI18n实例,说明当前Scope是唯一或第一个加载的作用域, - // 则使用当前作用域来初始化全局VoerkaI18n实例 - if(!globalThis.VoerkaI18n){ - const { I18nManager } = runtime; - globalThis.VoerkaI18n = new I18nManager({ - defaultLanguage: this.defaultLanguage, - activeLanguage : this.activeLanguage, - languages: options.languages, - }); - } - this.global = globalThis.VoerkaI18n; - this._mergePatchedMessages(); - this._patch(this._messages,newLanguage); - // 正在加载语言包标识 - this._loading=false; - // 在全局注册作用域 - this.register(callback); - } - // 作用域 - get id(){return this._id} - // 默认语言名称 - get defaultLanguage(){return this._defaultLanguage} - // 默认语言名称 - get activeLanguage(){return this._activeLanguage} - // 默认语言包 - get default(){return this._default} - // 当前语言包 - get messages(){return this._messages} - // 消息id映射列表 - get idMap(){return this._idMap} - // 当前作用域的格式化函数列表 - get formatters(){return this._formatters} - // 当前作用域支持的语言 - get languages(){return this._languages} - // 异步加载语言文件的函数列表 - get loaders(){return this._loaders} - // 引用全局VoerkaI18n配置,注册后自动引用 - get global(){return this._global} - set global(value){this._global = value;} - /** - * 在全局注册作用域 - * @param {*} callback 当注册 - */ - register(callback){ - if(!typeof(callback)==="function") callback = ()=>{}; - this.global.register(this).then(callback).catch(callback); - } - registerFormatter(name,formatter,{language="*"}={}){ - if(!typeof(formatter)==="function" || typeof(name)!=="string"){ - throw new TypeError("Formatter must be a function") - } - if(DataTypes$1.includes(name)){ - this.formatters[language].$types[name] = formatter; - }else { - this.formatters[language][name] = formatter; - } - } - /** - * 注册默认文本信息加载器 - * @param {Function} 必须是异步函数或者是返回Promise - */ - registerDefaultLoader(fn){ - this.global.registerDefaultLoader(fn); - } - /** - * 回退到默认语言 - */ - _fallback(){ - this._messages = this._default; - this._activeLanguage = this.defaultLanguage; - } - /** - * 刷新当前语言包 - * @param {*} newLanguage - */ - async refresh(newLanguage){ - this._loading = Promise.resolve(); - if(!newLanguage) newLanguage = this.activeLanguage; - // 默认语言,默认语言采用静态加载方式,只需要简单的替换即可 - if(newLanguage === this.defaultLanguage){ - this._messages = this._default; - await this._patch(this._messages,newLanguage); // 异步补丁 - return - } - // 非默认语言需要异步加载语言包文件,加载器是一个异步函数 - // 如果没有加载器,则无法加载语言包,因此回退到默认语言 - let loader = this.loaders[newLanguage]; - try{ - if(typeof(loader) === "function"){ - this._messages = (await loader()).default; - this._activeLanguage = newLanguage; - await this._patch(this._messages,newLanguage); - }else if(typeof(this.global.defaultMessageLoader) === "function"){// 如果该语言没有指定加载器,则使用全局配置的默认加载器 - this._messages = await this.global.loadMessagesFromDefaultLoader(newLanguage,this); - this._activeLanguage = newLanguage; - }else { - this._fallback(); - } - }catch(e){ - console.warn(`Error while loading language <${newLanguage}> on i18nScope(${this.id}): ${e.message}`); - this._fallback(); - } - } - /** - * 当指定了默认语言包加载器后,会从服务加载语言补丁包来更新本地的语言包 - * - * 补丁包会自动存储到本地的LocalStorage中 - * - * @param {*} messages - * @param {*} newLanguage - * @returns - */ - async _patch(messages,newLanguage){ - if(typeof(this.global.loadMessagesFromDefaultLoader) !== 'function') return - try{ - let pachedMessages = await this.global.loadMessagesFromDefaultLoader(newLanguage,this); - if(isPlainObject$1(pachedMessages)){ - Object.assign(messages,pachedMessages); - this._savePatchedMessages(pachedMessages,newLanguage); - } - }catch{} - } - /** - * 从本地存储中读取语言包补丁合并到当前语言包中 - */ - _mergePatchedMessages(){ - let patchedMessages= this._getPatchedMessages(this.activeLanguage); - if(isPlainObject$1(patchedMessages)){ - Object.assign(this._messages,patchedMessages); - } - } - /** - * 将读取的补丁包保存到本地的LocalStorage中 - * - * 为什么要保存到本地的LocalStorage中? - * - * 因为默认语言是静态嵌入到源码中的,而加载语言包补丁是延后异步的, - * 当应用启动第一次就会渲染出来的是没有打过补丁的内容。 - * - * - 如果还需要等待从服务器加载语言补丁合并后再渲染会影响速度 - * - 如果不等待从服务器加载语言补丁就渲染,则会先显示未打补丁的内容,然后在打完补丁后再对应用进行重新渲染生效 - * 这明显不是个好的方式 - * - * 因此,采用的方式是: - * - 加载语言包补丁后,将之保存到到本地的LocalStorage中 - * - 当应用加载时会查询是否存在补丁,如果存在就会合并渲染 - * - - * - * @param {*} messages - */ - _savePatchedMessages(messages,language){ - try{ - if(globalThis.localStorage){ - globalThis.localStorage.setItem(`voerkai18n_${this.id}_${language}_patched_messages`, JSON.stringify(messages)); - } - }catch(e){ - console.error("Error while save voerkai18n patched messages:",e.message); - } - } - _getPatchedMessages(language){ - try{ - return JSON.parse(localStorage.getItem(`voerkai18n_${this.id}_${language}_patched_messages`)) - }catch(e){ - return {} - } - } - // 以下方法引用全局VoerkaI18n实例的方法 - get on(){return this.global.on.bind(this.global)} - get off(){return this.global.off.bind(this.global)} - get offAll(){return this.global.offAll.bind(this.global)} - get change(){ - return this.global.change.bind(this.global) - } -}; - -/** - * 内置的格式化器 - * - */ - -/** - * 字典格式化器 - * 根据输入data的值,返回后续参数匹配的结果 - * dict(data,,,,,,,...) - * - * - * dict(1,1,"one",2,"two",3,"three",4,"four") == "one" - * dict(2,1,"one",2,"two",3,"three",4,"four") == "two" - * dict(3,1,"one",2,"two",3,"three",4,"four") == "three" - * dict(4,1,"one",2,"two",3,"three",4,"four") == "four" - * // 无匹配时返回原始值 - * dict(5,1,"one",2,"two",3,"three",4,"four") == 5 - * // 无匹配时并且后续参数个数是奇数,则返回最后一个参数 - * dict(5,1,"one",2,"two",3,"three",4,"four","more") == "more" - * - * 在翻译中使用 - * I have { value | dict(1,"one",2,"two",3,"three",4,"four")} apples - * - * @param {*} value - * @param {...any} args - * @returns - */ - function dict(value,...args){ - for(let i=0;i0 && (args.length % 2!==0)) return args[args.length-1] - return value -} - -var formatters = { - "*":{ - $types:{ - Date:(value)=>value.toLocaleString() - }, - time:(value)=> value.toLocaleTimeString(), - shorttime:(value)=> value.toLocaleTimeString(), - date: (value)=> value.toLocaleDateString(), - dict, //字典格式化器 - }, - zh:{ - $types:{ - Date:(value)=> `${value.getFullYear()}年${value.getMonth()+1}月${value.getDate()}日 ${value.getHours()}点${value.getMinutes()}分${value.getSeconds()}秒` - }, - shortime:(value)=> value.toLocaleTimeString(), - time:(value)=>`${value.getHours()}点${value.getMinutes()}分${value.getSeconds()}秒`, - date: (value)=> `${value.getFullYear()}年${value.getMonth()+1}月${value.getDate()}日`, - shortdate: (value)=> `${value.getFullYear()}-${value.getMonth()+1}-${value.getDate()}`, - currency:(value)=>`${value}元`, - }, - en:{ - currency:(value)=>{ - return `$${value}` - } - } -}; - -const { getDataTypeName,isNumber,isPlainObject,deepMerge } = utils; -const EventEmitter = eventemitter; -const i18nScope = scope; -let inlineFormatters = formatters; // 内置格式化器 - - - -// 用来提取字符里面的插值变量参数 , 支持管道符 { var | formatter | formatter } -// 不支持参数: let varWithPipeRegexp = /\{\s*(?\w+)?(?(\s*\|\s*\w*\s*)*)\s*\}/g - -// 支持参数: { var | formatter(x,x,..) | formatter } -let varWithPipeRegexp = /\{\s*(?\w+)?(?(\s*\|\s*\w*(\(.*\)){0,1}\s*)*)\s*\}/g; - -/** - * 考虑到通过正则表达式进行插件的替换可能较慢,因此提供一个简单方法来过滤掉那些 - * 不需要进行插值处理的字符串 - * 原理很简单,就是判断一下是否同时具有{和}字符,如果有则认为可能有插值变量,如果没有则一定没有插件变量,则就不需要进行正则匹配 - * 从而可以减少不要的正则匹配 - * 注意:该方法只能快速判断一个字符串不包括插值变量 - * @param {*} str - * @returns {boolean} true=可能包含插值变量, - */ -function hasInterpolation(str){ - return str.includes("{") && str.includes("}") -} -const DataTypes = ["String","Number","Boolean","Object","Array","Function","Error","Symbol","RegExp","Date","Null","Undefined","Set","Map","WeakSet","WeakMap"]; - - -/** - 通过正则表达式对原始文本内容进行解析匹配后得到的 - formatters="| aaa(1,1) | bbb " - - 需要统一解析为 - - [ - [aaa,[1,1]], // [formatter'name,[args,...]] - [bbb,[]], - ] - - formatters="| aaa(1,1,"dddd") | bbb " - - 目前对参数采用简单的split(",")来解析,因为无法正确解析aaa(1,1,"dd,,dd")形式的参数 - 在此场景下基本够用了,如果需要支持更复杂的参数解析,可以后续考虑使用正则表达式来解析 - - @returns [[,[,,...]]] - */ -function parseFormatters(formatters){ - if(!formatters) return [] - // 1. 先解析为 ["aaa()","bbb"]形式 - let result = formatters.trim().substr(1).trim().split("|").map(r=>r.trim()); - - // 2. 解析格式化器参数 - return result.map(formatter=>{ - let firstIndex = formatter.indexOf("("); - let lastIndex = formatter.lastIndexOf(")"); - if(firstIndex!==-1 && lastIndex!==-1){ // 带参数的格式化器 - const argsContent = formatter.substr(firstIndex+1,lastIndex-firstIndex-1).trim(); - let args = argsContent=="" ? [] : argsContent.split(",").map(arg=>{ - arg = arg.trim(); - if(!isNaN(parseInt(arg))){ - return parseInt(arg) // 数字 - }else if((arg.startsWith('\"') && arg.endsWith('\"')) || (arg.startsWith('\'') && arg.endsWith('\'')) ){ - return arg.substr(1,arg.length-2) // 字符串 - }else if(arg.toLowerCase()==="true" || arg.toLowerCase()==="false"){ - return arg.toLowerCase()==="true" // 布尔值 - }else if((arg.startsWith('{') && arg.endsWith('}')) || (arg.startsWith('[') && arg.endsWith(']'))){ - try{ - return JSON.parse(arg) - }catch(e){ - return String(arg) - } - }else { - return String(arg) - } - }); - return [formatter.substr(0,firstIndex),args] - }else {// 不带参数的格式化器 - return [formatter,[]] - } - }) -} - -/** - * 提取字符串中的插值变量 - * // [ - // { - name:<变量名称>,formatters:[{name:<格式化器名称>,args:[<参数>,<参数>,....]]}],<匹配字符串>], - // .... - // - * @param {*} str - * @param {*} isFull =true 保留所有插值变量 =false 进行去重 - * @returns {Array} - * [ - * { - * name:"<变量名称>", - * formatters:[ - * {name:"<格式化器名称>",args:[<参数>,<参数>,....]}, - * {name:"<格式化器名称>",args:[<参数>,<参数>,....]}, - * ], - * match:"<匹配字符串>" - * }, - * ... - * ] - */ -function getInterpolatedVars(str){ - let vars = []; - forEachInterpolatedVars(str,(varName,formatters,match)=>{ - let varItem = { - name:varName, - formatters:formatters.map(([formatter,args])=>{ - return { - name:formatter, - args:args - } - }), - match:match - }; - if(vars.findIndex(varDef=>((varDef.name===varItem.name) && (varItem.formatters.toString() == varDef.formatters.toString())))===-1){ - vars.push(varItem); - } - return "" - }); - return vars -} -/** - * 遍历str中的所有插值变量传递给callback,将callback返回的结果替换到str中对应的位置 - * @param {*} str - * @param {Function(<变量名称>,[formatters],match[0])} callback - * @returns 返回替换后的字符串 - */ -function forEachInterpolatedVars(str,callback,options={}){ - let result=str, match; - let opts = Object.assign({ - replaceAll:true, // 是否替换所有插值变量,当使用命名插值时应置为true,当使用位置插值时应置为false - },options); - varWithPipeRegexp.lastIndex=0; - while ((match = varWithPipeRegexp.exec(result)) !== null) { - const varname = match.groups.varname || ""; - // 解析格式化器和参数 = [,[,[,,...]]] - const formatters = parseFormatters(match.groups.formatters); - if(typeof(callback)==="function"){ - try{ - if(opts.replaceAll){ - result=result.replaceAll(match[0],callback(varname,formatters,match[0])); - }else { - result=result.replace(match[0],callback(varname,formatters,match[0])); - } - }catch{// callback函数可能会抛出异常,如果抛出异常,则中断匹配过程 - break - } - } - varWithPipeRegexp.lastIndex=0; - } - return result -} - -function resetScopeCache(scope,activeLanguage=null){ - scope.$cache = {activeLanguage,typedFormatters:{},formatters:{}}; -} -/** - * 取得指定数据类型的默认格式化器 - * - * 可以为每一个数据类型指定一个默认的格式化器,当传入插值变量时, - * 会自动调用该格式化器来对值进行格式化转换 - - const formatters = { - "*":{ - $types:{...} // 在所有语言下只作用于特定数据类型的格式化器 - }, // 在所有语言下生效的格式化器 - zh:{ - $types:{ - [数据类型]:(value)=>{...}, - }, - [格式化器名称]:(value)=>{...}, - [格式化器名称]:(value)=>{...}, - [格式化器名称]:(value)=>{...}, - }, - } - * @param {*} scope - * @param {*} activeLanguage - * @param {*} dataType 数字类型 - * @returns {Function} 格式化函数 - */ -function getDataTypeDefaultFormatter(scope,activeLanguage,dataType){ - if(!scope.$cache) resetScopeCache(scope); - if(scope.$cache.activeLanguage === activeLanguage) { - if(dataType in scope.$cache.typedFormatters) return scope.$cache.typedFormatters[dataType] - }else {// 当语言切换时清空缓存 - resetScopeCache(scope,activeLanguage); - } - - // 先在当前作用域中查找,再在全局查找 - const targets = [scope.formatters,scope.global.formatters]; - for(const target of targets){ - if(!target) continue - // 优先在当前语言的$types中查找 - if((activeLanguage in target) && isPlainObject(target[activeLanguage].$types)){ - let formatters = target[activeLanguage].$types; - if(dataType in formatters && typeof(formatters[dataType])==="function"){ - return scope.$cache.typedFormatters[dataType] = formatters[dataType] - } - } - // 在所有语言的$types中查找 - if(("*" in target) && isPlainObject(target["*"].$types)){ - let formatters = target["*"].$types; - if(dataType in formatters && typeof(formatters[dataType])==="function"){ - return scope.$cache.typedFormatters[dataType] = formatters[dataType] - } - } - } -} - -/** - * 获取指定名称的格式化器函数 - * @param {*} scope - * @param {*} activeLanguage - * @param {*} name 格式化器名称 - * @returns {Function} 格式化函数 - */ -function getFormatter(scope,activeLanguage,name){ - // 缓存格式化器引用,避免重复检索 - if(!scope.$cache) resetScopeCache(scope); - if(scope.$cache.activeLanguage === activeLanguage) { - if(name in scope.$cache.formatters) return scope.$cache.formatters[name] - }else {// 当语言切换时清空缓存 - resetScopeCache(scope,activeLanguage); - } - // 先在当前作用域中查找,再在全局查找 - const targets = [scope.formatters,scope.global.formatters]; - for(const target of targets){ - // 优先在当前语言查找 - if(activeLanguage in target){ - let formatters = target[activeLanguage] || {}; - if((name in formatters) && typeof(formatters[name])==="function") return scope.$cache.formatters[name] = formatters[name] - } - // 在所有语言的$types中查找 - let formatters = target["*"] || {}; - if((name in formatters) && typeof(formatters[name])==="function") return scope.$cache.formatters[name] = formatters[name] - } -} - -/** - * 执行格式化器并返回结果 - * @param {*} value - * @param {*} formatters 多个格式化器顺序执行,前一个输出作为下一个格式化器的输入 - */ -function executeFormatter(value,formatters){ - if(formatters.length===0) return value - let result = value; - try{ - for(let formatter of formatters){ - if(typeof(formatter) === "function") { - result = formatter(result); - }else {// 如果碰到无效的格式化器,则跳过过续的格式化器 - return result - } - } - }catch(e){ - console.error(`Error while execute i18n formatter for ${value}: ${e.message} ` ); - } - return result -} -/** - * 将 [[格式化器名称,[参数,参数,...]],[格式化器名称,[参数,参数,...]]]格式化器转化为 - * - * - * - * @param {*} scope - * @param {*} activeLanguage - * @param {*} formatters - */ -function buildFormatters(scope,activeLanguage,formatters){ - let results = []; - for(let formatter of formatters){ - if(formatter[0]){ - const func = getFormatter(scope,activeLanguage,formatter[0]); - if(typeof(func)==="function"){ - results.push((v)=>{ - return func(v,...formatter[1]) - }); - }else { - // 格式化器无效或者没有定义时,查看当前值是否具有同名的原型方法,如果有则执行调用 - // 比如padStart格式化器是String的原型方法,不需要配置就可以直接作为格式化器调用 - results.push((v)=>{ - if(typeof(v[formatter[0]])==="function"){ - return v[formatter[0]].call(v,...formatter[1]) - }else { - return v - } - }); - } - } - } - return results -} - -/** - * 将value经过格式化器处理后返回 - * @param {*} scope - * @param {*} activeLanguage - * @param {*} formatters - * @param {*} value - * @returns - */ -function getFormattedValue(scope,activeLanguage,formatters,value){ - // 1. 取得格式化器函数列表 - const formatterFuncs = buildFormatters(scope,activeLanguage,formatters); - // 2. 查找每种数据类型默认格式化器,并添加到formatters最前面,默认数据类型格式化器优先级最高 - const defaultFormatter = getDataTypeDefaultFormatter(scope,activeLanguage,getDataTypeName(value)); - if(defaultFormatter){ - formatterFuncs.splice(0,0,defaultFormatter); - } - // 3. 执行格式化器 - value = executeFormatter(value,formatterFuncs); - return value -} - -/** - * 字符串可以进行变量插值替换, - * replaceInterpolatedVars("<模板字符串>",{变量名称:变量值,变量名称:变量值,...}) - * replaceInterpolatedVars("<模板字符串>",[变量值,变量值,...]) - * replaceInterpolatedVars("<模板字符串>",变量值,变量值,...]) - * -- 当只有两个参数并且第2个参数是{}时,将第2个参数视为命名变量的字典 - replaceInterpolatedVars("this is {a}+{b},{a:1,b:2}) --> this is 1+2 -- 当只有两个参数并且第2个参数是[]时,将第2个参数视为位置参数 - replaceInterpolatedVars"this is {}+{}",[1,2]) --> this is 1+2 -- 普通位置参数替换 - replaceInterpolatedVars("this is {a}+{b}",1,2) --> this is 1+2 -- -this == scope == { formatters: {}, ... } -* @param {*} template -* @returns -*/ -function replaceInterpolatedVars(template,...args) { - const scope = this; - // 当前激活语言 - const activeLanguage = scope.global.activeLanguage; - - // 没有变量插值则的返回原字符串 - if(args.length===0 || !hasInterpolation(template)) return template - - // ****************************变量插值**************************** - if(args.length===1 && isPlainObject(args[0])){ - // 读取模板字符串中的插值变量列表 - // [[var1,[formatter,formatter,...],match],[var2,[formatter,formatter,...],match],...} - let varValues = args[0]; - return forEachInterpolatedVars(template,(varname,formatters)=>{ - let value = (varname in varValues) ? varValues[varname] : ''; - return getFormattedValue(scope,activeLanguage,formatters,value) - }) - }else { - // ****************************位置插值**************************** - // 如果只有一个Array参数,则认为是位置变量列表,进行展开 - const params=(args.length===1 && Array.isArray(args[0])) ? [...args[0]] : args; - if(params.length===0) return template // 没有变量则不需要进行插值处理,返回原字符串 - let i = 0; - return forEachInterpolatedVars(template,(varname,formatters)=>{ - if(params.length>i){ - return getFormattedValue(scope,activeLanguage,formatters,params[i++]) - }else { - throw new Error() // 抛出异常,停止插值处理 - } - },{replaceAll:false}) - - } -} - -// 默认语言配置 -const defaultLanguageSettings = { - defaultLanguage: "zh", - activeLanguage: "zh", - languages:[ - {name:"zh",title:"中文",default:true}, - {name:"en",title:"英文"} - ], - formatters:inlineFormatters -}; - -function isMessageId(content){ - return parseInt(content)>0 -} -/** - * 根据值的单数和复数形式,从messages中取得相应的消息 - * - * @param {*} messages 复数形式的文本内容 = [<=0时的内容>,<=1时的内容>,<=2时的内容>,...] - * @param {*} value - */ -function getPluraMessage(messages,value){ - try{ - if(Array.isArray(messages)){ - return messages.length > value ? messages[value] : messages[messages.length-1] - }else { - return messages - } - }catch{ - return Array.isArray(messages) ? messages[0] : messages - } -} -function escape(str){ - return str.replaceAll(/\\(?![trnbvf'"]{1})/g,"\\\\") - .replaceAll("\t","\\t") - .replaceAll("\n","\\n") - .replaceAll("\b","\\b") - .replaceAll("\r","\\r") - .replaceAll("\f","\\f") - .replaceAll("\'","\\'") - .replaceAll('\"','\\"') - .replaceAll('\v','\\v') -} -function unescape(str){ - return str - .replaceAll("\\t","\t") - .replaceAll("\\n","\n") - .replaceAll("\\b","\b") - .replaceAll("\\r","\r") - .replaceAll("\\f","\f") - .replaceAll("\\'","\'") - .replaceAll('\\"','\"') - .replaceAll('\\v','\v') - .replaceAll(/\\\\(?![trnbvf'"]{1})/g,"\\") -} -/** - * 翻译函数 - * -* translate("要翻译的文本内容") 如果默认语言是中文,则不会进行翻译直接返回 -* translate("I am {} {}","man") == I am man 位置插值 -* translate("I am {p}",{p:"man"}) 字典插值 -* translate("total {$count} items", {$count:1}) //复数形式 -* translate("total {} {} {} items",a,b,c) // 位置变量插值 - * - * this===scope 当前绑定的scope - * - */ -function translate(message) { - const scope = this; - const activeLanguage = scope.global.activeLanguage; - let content = message; - let vars=[]; // 插值变量列表 - let pluralVars= []; // 复数变量 - let pluraValue = null; // 复数值 - if(!typeof(message)==="string") return message - try{ - // 1. 预处理变量: 复数变量保存至pluralVars中 , 变量如果是Function则调用 - if(arguments.length === 2 && isPlainObject(arguments[1])){ - Object.entries(arguments[1]).forEach(([name,value])=>{ - if(typeof(value)==="function"){ - try{ - vars[name] = value(); - }catch(e){ - vars[name] = value; - } - } - // 以$开头的视为复数变量 - if(name.startsWith("$") && typeof(vars[name])==="number") pluralVars.push(name); - }); - vars = [arguments[1]]; - }else if(arguments.length >= 2){ - vars = [...arguments].splice(1).map((arg,index)=>{ - try{ - arg = typeof(arg)==="function" ? arg() : arg; - // 位置参数中以第一个数值变量为复数变量 - if(isNumber(arg)) pluraValue = parseInt(arg); - }catch(e){ } - return arg - }); - - } - - - - - // 3. 取得翻译文本模板字符串 - if(activeLanguage === scope.defaultLanguage){ - // 2.1 从默认语言中取得翻译文本模板字符串 - // 如果当前语言就是默认语言,不需要查询加载,只需要做插值变换即可 - // 当源文件运用了babel插件后会将原始文本内容转换为msgId - // 如果是msgId则从scope.default中读取,scope.default=默认语言包={:} - if(isMessageId(content)){ - content = scope.default[content] || message; - } - }else { - // 2.2 从当前语言包中取得翻译文本模板字符串 - // 如果没有启用babel插件将源文本转换为msgId,需要先将文本内容转换为msgId - // JSON.stringify在进行转换时会将\t\n\r转换为\\t\\n\\r,这样在进行匹配时就出错 - let msgId = isMessageId(content) ? content : scope.idMap[escape(content)]; - content = scope.messages[msgId] || content; - content = Array.isArray(content) ? content.map(v=>unescape(v)) : unescape(content); - } - // 2. 处理复数 - // 经过上面的处理,content可能是字符串或者数组 - // content = "原始文本内容" || 复数形式["原始文本内容","原始文本内容"....] - // 如果是数组说明要启用复数机制,需要根据插值变量中的某个变量来判断复数形式 - if(Array.isArray(content) && content.length>0){ - // 如果存在复数命名变量,只取第一个复数变量 - if(pluraValue!==null){ // 启用的是位置插值,pluraIndex=第一个数字变量的位置 - content = getPluraMessage(content,pluraValue); - }else if(pluralVar.length>0){ - content = getPluraMessage(content,parseInt(vars(pluralVar[0]))); - }else { // 如果找不到复数变量,则使用第一个内容 - content = content[0]; - } - } - - // 进行插值处理 - if(vars.length==0){ - return content - }else { - return replaceInterpolatedVars.call(scope,content,...vars) - } - }catch(e){ - return content // 出错则返回原始文本 - } -} - -/** - * 多语言管理类 - * - * 当导入编译后的多语言文件时(import("./languages")),会自动生成全局实例VoerkaI18n - * - * VoerkaI18n.languages // 返回支持的语言列表 - * VoerkaI18n.defaultLanguage // 默认语言 - * VoerkaI18n.language // 当前语言 - * VoerkaI18n.change(language) // 切换到新的语言 - * - * - * VoerkaI18n.on("change",(language)=>{}) // 注册语言切换事件 - * VoerkaI18n.off("change",(language)=>{}) - * - * */ - class I18nManager extends EventEmitter{ - constructor(settings={}){ - super(); - if(I18nManager.instance!=null){ - return I18nManager.instance; - } - I18nManager.instance = this; - this._settings = deepMerge(defaultLanguageSettings,settings); - this._scopes=[]; - this._defaultMessageLoader = null; // 默认文本加载器 - return I18nManager.instance; - } - get settings(){ return this._settings } - get scopes(){ return this._scopes } - // 当前激活语言 - get activeLanguage(){ return this._settings.activeLanguage} - // 默认语言 - get defaultLanguage(){ return this._settings.defaultLanguage} - // 支持的语言列表 - get languages(){ return this._settings.languages} - // 内置格式化器 - get formatters(){ return inlineFormatters } - get defaultMessageLoader(){ return this._defaultMessageLoader} - // 通过默认加载器加载文件 - async loadMessagesFromDefaultLoader(newLanguage,scope){ - if(typeof(this._defaultMessageLoader) != "function") return //throw new Error("No default message loader specified") - return await this._defaultMessageLoader.call(scope,newLanguage,scope) - } - /** - * 切换语言 - */ - async change(value){ - value=value.trim(); - if(this.languages.findIndex(lang=>lang.name === value)!==-1 || typeof(this._defaultMessageLoader)==="function"){ - // 通知所有作用域刷新到对应的语言包 - await this._refreshScopes(value); - this._settings.activeLanguage = value; - await this.emit(value); /// 触发语言切换事件 - }else { - throw new Error("Not supported language:"+value) - } - } - /** - * 当切换语言时调用此方法来加载更新语言包 - * @param {*} newLanguage - */ - async _refreshScopes(newLanguage){ - // 并发执行所有作用域语言包的加载 - try{ - const scopeRefreshers = this._scopes.map(scope=>{ - return scope.refresh(newLanguage) - }); - if(Promise.allSettled){ - await Promise.allSettled(scopeRefreshers); - }else { - await Promise.all(scopeRefreshers); - } - }catch(e){ - console.warn("Error while refreshing i18n scopes:",e.message); - } - } - /** - * - * 注册一个新的作用域 - * - * 每一个库均对应一个作用域,每个作用域可以有多个语言包,且对应一个翻译函数 - * 除了默认语言外,其他语言采用动态加载的方式 - * - * @param {*} scope - */ - async register(scope){ - if(!(scope instanceof i18nScope)){ - throw new TypeError("Scope must be an instance of I18nScope") - } - this._scopes.push(scope); - await scope.refresh(this.activeLanguage); - } - /** - * 注册全局格式化器 - * 格式化器是一个简单的同步函数value=>{...},用来对输入进行格式化后返回结果 - * - * registerFormatters(name,value=>{...}) // 适用于所有语言 - * registerFormatters(name,value=>{...},{langauge:"zh"}) // 适用于cn语言 - * registerFormatters(name,value=>{...},{langauge:"en"}) // 适用于en语言 - - * @param {*} formatters - */ - registerFormatter(name,formatter,{language="*"}={}){ - if(!typeof(formatter)==="function" || typeof(name)!=="string"){ - throw new TypeError("Formatter must be a function") - } - if(DataTypes.includes(name)){ - this.formatters[language].$types[name] = formatter; - }else { - this.formatters[language][name] = formatter; - } - } - /** - * 注册默认文本信息加载器 - */ - registerDefaultLoader(fn){ - if(typeof(fn) !== 'function') throw new Error("The default loader must be a async function or promise returned") - this._defaultMessageLoader = fn; - this.refresh(); - } - async refresh(){ - try{ - let requests = this._scopes.map(scope=>scope.refresh()); - if(Promise.allSettled){ - await Promise.allSettled(requests); - }else { - await Promise.all(requests); - } - }catch{} - } - -} - -var runtime ={ - getInterpolatedVars, - replaceInterpolatedVars, - I18nManager, - translate, - i18nScope, - defaultLanguageSettings, - getDataTypeName, - isNumber, - isPlainObject -}; - -export { runtime as default };