diff --git a/packages/cli/baidu.translate.js b/packages/cli/baidu.translate.js index 1912e26..2b8c043 100644 --- a/packages/cli/baidu.translate.js +++ b/packages/cli/baidu.translate.js @@ -21,7 +21,7 @@ module.exports = function(options={}){ * @param {*} texts 多条文本 * @returns */ - translate:async (texts=[],from,to)=>{ + translate:async (texts=[],from="zh",to="en")=>{ if(Array.isArray(texts)){ texts = texts.join("\n"); diff --git a/packages/cli/extract.plugin.js b/packages/cli/extract.plugin.js index 4374739..3e53ab7 100644 --- a/packages/cli/extract.plugin.js +++ b/packages/cli/extract.plugin.js @@ -10,8 +10,7 @@ const deepmerge = require("deepmerge") const path = require('path') const fs = require('fs-extra') const createLogger = require("logsets") -const { t } = require("./i18nProxy") -const { findModuleType } = require("@voerkai18n/utils") +const { t } = require("./i18nProxy") const logger = createLogger() @@ -105,7 +104,7 @@ function extractTranslateTextUseRegexp(content,namespace,extractor,file,options) // 移除代码中的注释,以便正则表达式提取翻译文本时排除注释部分 const fileExtName = file.extname.substr(1).toLowerCase() // 文件扩展名 content = removeComments(content,fileExtName) - + let result let texts = {} while ((result = extractor.exec(content)) !== null) { // 这对于避免零宽度匹配的无限循环是必要的 @@ -156,7 +155,7 @@ function extractTranslateTextUseFunction(content,namespace,extractor,file,option * @param {*} extractor 提取器配置={default:[],js:[],html:[],"sass,css":[],json:[],"*":[]}"} */ function getFileTypeExtractors(filetype,extractor){ - if(!typeof(extractor)==="object") return null + if(!typeof(extractor)=="object") return null let matchers=[] for(let [key,value] of Object.entries(extractor)){ if(filetype.toLowerCase()===key.toLowerCase()){ @@ -395,7 +394,7 @@ module.exports = function(options={}){ logger.log(t("激活语言\t: {}"),options.activeLanguage) logger.log(t("名称空间\t: {}"),Object.keys(options.namespaces).join(",")) logger.log("") - logger + // 保存提交提取的文本 = {} let results = {} let fileCount=0 // 文件总数 diff --git a/packages/cli/index.js b/packages/cli/index.js index 7a8e302..d814e3f 100644 --- a/packages/cli/index.js +++ b/packages/cli/index.js @@ -6,8 +6,7 @@ const path = require("path") const fs = require("fs-extra") const logger = createLogger() const { i18nScope ,t } = require("./i18nProxy") -const { getProjectRootFolder, getProjectSourceFolder } = require("@voerkai18n/utils"); -const { translate } = require('../runtime/dist/index.cjs'); +const { getProjectSourceFolder } = require("@voerkai18n/utils"); logger.use(bannerPluin) @@ -106,7 +105,7 @@ program logger.error(t("语言包文件夹<{}>不存在",langFolder)) return } - compile = require("./compile.command") + let compile = require("./compile.command") compile(langFolder,options) }); diff --git a/packages/cli/languages/runtime.js b/packages/cli/languages/runtime.js index b5cb243..8e00732 100644 --- a/packages/cli/languages/runtime.js +++ b/packages/cli/languages/runtime.js @@ -121,6 +121,8 @@ var eventemitter = class EventEmitter{ } }; +const DataTypes$1 = ["String","Number","Boolean","Object","Array","Function","Null","Undefined","Symbol","Date","RegExp","Error"]; + var scope = class i18nScope { constructor(options={},callback){ // 每个作用域都有一个唯一的id @@ -187,7 +189,7 @@ var scope = class i18nScope { if(!typeof(formatter)==="function" || typeof(name)!=="string"){ throw new TypeError("Formatter must be a function") } - if(DataTypes.includes(name)){ + if(DataTypes$1.includes(name)){ this.formatters[language].$types[name] = formatter; }else { this.formatters[language][name] = formatter; @@ -325,7 +327,7 @@ let varWithPipeRegexp = /\{\s*(?\w+)?(?(\s*\|\s*\w*(\(.*\)) function hasInterpolation(str){ return str.includes("{") && str.includes("}") } -const DataTypes$1 = ["String","Number","Boolean","Object","Array","Function","Error","Symbol","RegExp","Date","Null","Undefined","Set","Map","WeakSet","WeakMap"]; +const DataTypes = ["String","Number","Boolean","Object","Array","Function","Error","Symbol","RegExp","Date","Null","Undefined","Set","Map","WeakSet","WeakMap"]; /** @@ -915,7 +917,7 @@ function translate(message) { if(!typeof(formatter)==="function" || typeof(name)!=="string"){ throw new TypeError("Formatter must be a function") } - if(DataTypes$1.includes(name)){ + if(DataTypes.includes(name)){ this.formatters[language].$types[name] = formatter; }else { this.formatters[language][name] = formatter; diff --git a/packages/cli/package.json b/packages/cli/package.json index fa02fd4..0661754 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@voerkai18n/cli", - "version": "1.0.28", + "version": "1.0.29", "description": "VoerkaI18n command line interactive tools", "main": "index.js", "homepage": "https://gitee.com/zhangfisher/voerka-i18n", @@ -50,5 +50,5 @@ "devDependencies": { "@voerkai18n/autopublish": "workspace:^1.0.2" }, - "lastPublish": "2022-04-15T17:44:50+08:00" + "lastPublish": "2022-04-16T09:12:24+08:00" } \ No newline at end of file diff --git a/packages/cli/translate.command.js b/packages/cli/translate.command.js index 832c0f1..a563fdc 100644 --- a/packages/cli/translate.command.js +++ b/packages/cli/translate.command.js @@ -63,7 +63,7 @@ function getTranslateProvider(options={}){ * @param {*} options * @returns */ -async function translateMessages(messages={},from,to,options={}){ +async function translateMessages(messages={},from="zh",to="en",options={}){ let { mode,qps=1 } = options if(messages.length===0) return; const provider = getTranslateProvider(options) @@ -82,6 +82,7 @@ async function translateMessages(messages={},from,to,options={}){ */ async function translateMultiLineMessage(messages=[],from,to,options={}){ if(messages.length===0) return; + const qps = options.qps || 1 const provider = getTranslateProvider(options) await delay(1000/qps) let result = await provider.translate(messages,from,to) @@ -125,7 +126,6 @@ async function translateLanguage(messages,from,to,options={}){ } // 对剩余的信息进行翻译 if(Object.keys(lngMessages).length > 0){ - requestCount++ await translateMessages(lngMessages,from,to,options) result = deepMerge(result,lngMessages) } diff --git a/packages/react/index.js b/packages/react/index.js index a776f21..316865f 100644 --- a/packages/react/index.js +++ b/packages/react/index.js @@ -1,4 +1,4 @@ -import React, { useState, useEffect,useCallback } from 'react'; +import React, { useState, useEffect } from 'react'; /** * MyComponent(){ @@ -9,7 +9,7 @@ import React, { useState, useEffect,useCallback } from 'react'; * * */ -export function useVoerkaI18n(i18nScope) { +export function useVoerkaI18n() { if(!globalThis.VoerkaI18n){ console.warn("useI18nContext is not provided, use default i18nContext") diff --git a/packages/react/package.json b/packages/react/package.json index f6086f5..1bee915 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@voerkai18n/react", - "version": "1.0.3", + "version": "1.0.4", "description": "", "main": "index.js", "scripts": { @@ -15,5 +15,5 @@ "devDependencies": { "@voerkai18n/autopublish": "workspace:^1.0.2" }, - "lastPublish": "2022-04-15T17:53:30+08:00" + "lastPublish": "2022-04-16T09:12:12+08:00" } \ No newline at end of file diff --git a/packages/runtime/dist/index.cjs b/packages/runtime/dist/index.cjs index 2efc900..2c02fff 100644 --- a/packages/runtime/dist/index.cjs +++ b/packages/runtime/dist/index.cjs @@ -1,2 +1,2 @@ -"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"),m=require("@babel/runtime-corejs3/helpers/slicedToArray"),v=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 q=require("@babel/runtime-corejs3/core-js-stable/string/raw"),_=require("@babel/runtime-corejs3/core-js-stable/instance/includes"),x=require("@babel/runtime-corejs3/core-js-stable/instance/map"),w=require("@babel/runtime-corejs3/core-js-stable/instance/trim"),L=require("@babel/runtime-corejs3/core-js-stable/instance/index-of"),S=require("@babel/runtime-corejs3/core-js-stable/instance/last-index-of"),$=require("@babel/runtime-corejs3/core-js-stable/parse-int"),M=require("@babel/runtime-corejs3/core-js-stable/instance/starts-with"),A=require("@babel/runtime-corejs3/core-js-stable/instance/ends-with"),F=require("@babel/runtime-corejs3/core-js-stable/instance/find-index"),T=require("@babel/runtime-corejs3/core-js-stable/object/assign"),E=require("@babel/runtime-corejs3/core-js/instance/replace-all"),I=require("@babel/runtime-corejs3/core-js-stable/array/is-array");require("@babel/runtime-corejs3/core-js-stable/json/stringify");var D=require("@babel/runtime-corejs3/core-js-stable/instance/concat"),N=require("@babel/runtime-corejs3/core-js-stable/instance/splice"),C=require("@babel/runtime-corejs3/core-js-stable/instance/for-each"),O=require("@babel/runtime-corejs3/core-js-stable/object/entries"),V=require("@babel/runtime-corejs3/core-js-stable/instance/slice"),z=require("@babel/runtime-corejs3/core-js-stable/promise"),R=require("@babel/runtime-corejs3/core-js-stable/object/get-prototype-of"),P=require("@babel/runtime-corejs3/core-js-stable/set"),B=require("@babel/runtime-corejs3/core-js/global-this"),U=require("@babel/runtime-corejs3/core-js-stable/instance/bind");function Y(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var H=Y(e),W=Y(t),G=Y(r),J=Y(a),K=Y(n),Q=Y(l),X=Y(u),Z=Y(s),ee=Y(i),te=Y(c),re=Y(o),ae=Y(f),ne=Y(d),le=Y(g),ue=Y(h),se=Y(b),ie=Y(p),ce=Y(m),oe=Y(v),fe=Y(y),de=Y(j),ge=Y(k),he=Y(q),be=Y(_),pe=Y(x),me=Y(w),ve=Y(L),ye=Y(S),je=Y($),ke=Y(M),qe=Y(A),_e=Y(F),xe=Y(T),we=Y(E),Le=Y(I),Se=Y(D),$e=Y(N),Me=Y(C),Ae=Y(O),Fe=Y(V),Te=Y(z),Ee=Y(R),Ie=Y(P),De=Y(B),Ne=Y(U);var Ce,Oe=function(e){if("object"!==se.default(e)||null===e)return!1;var t=Ee.default(e);if(null===t)return!0;for(var r=t;null!==Ee.default(r);)r=Ee.default(r);return t===r},Ve=function(e){return!isNaN(je.default(e))},ze=function e(t,r){var a,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},l=xe.default({},t);return Me.default(a=Ae.default(r)).call(a,(function(t){var r=ce.default(t,2),a=r[0],u=r[1];if(a in l)if("object"===se.default(u)&&null!==u)if(Le.default(u)){if(0===n.array)l[a]=u;else if(1===n.array){var s;l[a]=Se.default(s=[]).call(s,ie.default(l[a]),ie.default(u))}else if(2===n.array){var i;l[a]=ie.default(new Ie.default(Se.default(i=[]).call(i,ie.default(l[a]),ie.default(u))))}}else l[a]=e(l[a],u,n);else l[a]=u;else l[a]=u})),l},Re=function(e){return null===e?"Null":void 0===e?"Undefined":"function"==typeof e?"Function":e.constructor&&e.constructor.name},Pe=function(){function e(){re.default(this,e),this._callbacks=[]}var t;return ae.default(e,[{key:"on",value:function(e){var t;be.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(re.default(this,e),this._id=t.id||(new Date).getTime().toString()+je.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.$cache={activeLanguage:null,typedFormatters:{},formatters:{}},!De.default.VoerkaI18n){var a=pt.I18nManager;De.default.VoerkaI18n=new a({defaultLanguage:this.defaultLanguage,activeLanguage:this.activeLanguage,languages:t.languages})}this.global=De.default.VoerkaI18n,this._loading=!1,this.register(r)}var t;return ae.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:"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"===!se.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"===!se.default(t)||"string"!=typeof e)throw new TypeError("Formatter must be a function");be.default(DataTypes).call(DataTypes,e)?this.formatters[n].$types[e]=t:this.formatters[n][e]=t}},{key:"_fallback",value:function(){this._messages=this._default,this._activeLanguage=this.defaultLanguage}},{key:"refresh",value:(t=te.default(ge.default.mark((function e(t){var r,a,n;return ge.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this._loading=Te.default.resolve(),t||(t=this.activeLanguage),t!==this.defaultLanguage){e.next=5;break}return this._messages=this._default,e.abrupt("return");case 5:if("function"!=typeof(r=this.loaders[t])){e.next=20;break}return e.prev=7,e.next=10,r();case 10:this._messages=e.sent.default,this._activeLanguage=t,e.next=18;break;case 14:e.prev=14,e.t0=e.catch(7),console.warn(Se.default(a=Se.default(n="Error while loading language <".concat(t,"> on i18nScope(")).call(n,this.id,"): ")).call(a,e.t0.message)),this._fallback();case 18:e.next=21;break;case 20:this._fallback();case 21:case"end":return e.stop()}}),e,this,[[7,14]])}))),function(e){return t.apply(this,arguments)})},{key:"on",get:function(){var e;return Ne.default(e=this.global.on).call(e,this.global)}},{key:"off",get:function(){var e;return Ne.default(e=this.global.off).call(e,this.global)}},{key:"offAll",get:function(){var e;return Ne.default(e=this.global.offAll).call(e,this.global)}},{key:"change",get:function(){var e;return Ne.default(e=this.global.change).call(e,this.global)}}]),e}();function Ue(e){var t=function(){if("undefined"==typeof Reflect||!ee.default)return!1;if(ee.default.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(ee.default(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var r,a=ue.default(e);if(t){var n=ue.default(this).constructor;r=ee.default(a,arguments,n)}else r=a.apply(this,arguments);return le.default(this,r)}}function Ye(e,t){var r=void 0!==X.default&&Z.default(e)||e["@@iterator"];if(!r){if(Le.default(e)||(r=function(e,t){var r;if(!e)return;if("string"==typeof e)return He(e,t);var a=Fe.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 Q.default(e);if("Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a))return He(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 He(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[K.default].call(this,r,(function(){var e=arguments;return"object"!=se.default(e[e.length-1])&&(e=Fe.default([]).call(e)).push(a(e,u)),n.apply(this,e)}))}return e[K.default].call(this,r,n)},We.apply(this,arguments)}var Ge=Re,Je=Ve,Ke=Oe,Qe=ze,Xe=Pe,Ze=Be,et={"*":{$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 Se.default(t=Se.default(r=Se.default(a=Se.default(n=Se.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 Se.default(t=Se.default(r="".concat(e.getHours(),"点")).call(r,e.getMinutes(),"分")).call(t,e.getSeconds(),"秒")},date:function(e){var t,r;return Se.default(t=Se.default(r="".concat(e.getFullYear(),"年")).call(r,e.getMonth()+1,"月")).call(t,e.getDate(),"日")},shortdate:function(e){var t,r;return Se.default(t=Se.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)}}},tt=We(/\{\s*(\w+)?((\s*\|\s*\w*(\(.*\))?\s*)*)\s*\}/g,{varname:1,formatters:2});function rt(e){return be.default(e).call(e,"{")&&be.default(e).call(e,"}")}he.default(Ce||(Ce=oe.default(["{s*{varname}s*}"],["\\{\\s*{varname}\\s*\\}"])));var at=["String","Number","Boolean","Object","Array","Function","Error","Symbol","RegExp","Date","Null","Undefined","Set","Map","WeakSet","WeakMap"];function nt(e){var t,r;if(!e)return[];var a=pe.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 pe.default(a).call(a,(function(e){var t=ve.default(e).call(e,"("),r=ye.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?[]:pe.default(n=l.split(",")).call(n,(function(e){if(e=me.default(e).call(e),!isNaN(je.default(e)))return je.default(e);if(ke.default(e).call(e,'"')&&qe.default(e).call(e,'"')||ke.default(e).call(e,"'")&&qe.default(e).call(e,"'"))return e.substr(1,e.length-2);if("true"===e.toLowerCase()||"false"===e.toLowerCase())return"true"===e.toLowerCase();if(!(ke.default(e).call(e,"{")&&qe.default(e).call(e,"}")||ke.default(e).call(e,"[")&&qe.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 lt(e,t){var r,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=e,l=xe.default({replaceAll:!0},a);for(tt.lastIndex=0;null!==(r=tt.exec(n));){var u=r.groups.varname||"",s=nt(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}tt.lastIndex=0}return n}function ut(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;e.$cache={activeLanguage:t,typedFormatters:{},formatters:{}}}function st(e,t,r){var a,n=[],l=Ye(r);try{var u=function(){var r=a.value;if(r[0]){var l=function(e,t,r){if(e.$cache||ut(e),e.$cache.activeLanguage===t){if(r in e.$cache.formatters)return e.$cache.formatters[r]}else ut(e,t);for(var a=0,n=[e.formatters,e.global.formatters];a1?a-1:0),l=1;li)return it(t,r,a,s[i++]);throw new Error}),{replaceAll:!1})}var ot={defaultLanguage:"zh",activeLanguage:"zh",languages:[{name:"zh",title:"中文",default:!0},{name:"en",title:"英文"}],formatters:et};function ft(e){return je.default(e)>0}function dt(e,t){try{return Le.default(e)?e.length>t?e[t]:e[e.length-1]:e}catch(t){return Le.default(e)?e[0]:e}}function gt(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 ht(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 bt=function(e){fe.default(l,e);var t,r,a,n=Ue(l);function l(){var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return re.default(this,l),e=n.call(this),null!=l.instance||(l.instance=ne.default(e),e._settings=Qe(ot,t),e._scopes=[]),le.default(e,l.instance)}return ae.default(l,[{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 et}},{key:"change",value:(a=te.default(ge.default.mark((function e(t){var r;return ge.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=me.default(t).call(t),-1===_e.default(r=this.languages).call(r,(function(e){return e.name===t}))){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 a.apply(this,arguments)})},{key:"_refreshScopes",value:(r=te.default(ge.default.mark((function e(t){var r,a;return ge.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,a=pe.default(r=this._scopes).call(r,(function(e){return e.refresh(t)})),!Te.default.allSettled){e.next=7;break}return e.next=5,Te.default.allSettled(a);case 5:e.next=9;break;case 7:return e.next=9,Te.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 r.apply(this,arguments)})},{key:"register",value:(t=te.default(ge.default.mark((function e(t){return ge.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t instanceof Ze){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 t.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"===!se.default(t)||"string"!=typeof e)throw new TypeError("Formatter must be a function");be.default(at).call(at,e)?this.formatters[n].$types[e]=t:this.formatters[n][e]=t}}]),l}(Xe),pt={getInterpolatedVars:function(e){var t=[];return lt(e,(function(e,r,a){var n={name:e,formatters:pe.default(r).call(r,(function(e){var t=ce.default(e,2);return{name:t[0],args:t[1]}})),match:a};return-1===_e.default(t).call(t,(function(e){return e.name===n.name&&n.formatters.toString()==e.formatters.toString()}))&&t.push(n),""})),t},replaceInterpolatedVars:ct,I18nManager:bt,translate:function(e){var t=this,r=t.global.activeLanguage,a=e,n=[],l=[],u=null;if("string"===!se.default(e))return e;try{var s,i;if(2===arguments.length&&Ke(arguments[1]))Me.default(s=Ae.default(arguments[1])).call(s,(function(e){var t=ce.default(e,2),r=t[0],a=t[1];if("function"==typeof a)try{n[r]=a()}catch(e){n[r]=a}ke.default(r).call(r,"$")&&"number"==typeof n[r]&&l.push(r)})),n=[arguments[1]];else if(arguments.length>=2){var c,o;n=pe.default(c=$e.default(o=Fe.default(Array.prototype).call(arguments)).call(o,1)).call(c,(function(e,t){try{e="function"==typeof e?e():e,Je(e)&&(u=je.default(e))}catch(e){}return e}))}if(r===t.defaultLanguage)ft(a)&&(a=t.default[a]||e);else{var f=ft(a)?a:t.idMap[gt(a)];a=t.messages[f]||a,a=Le.default(a)?pe.default(a).call(a,(function(e){return ht(e)})):ht(a)}return Le.default(a)&&a.length>0&&(a=null!==u?dt(a,u):pluralVar.length>0?dt(a,je.default(n(pluralVar[0]))):a[0]),0==n.length?a:ct.call.apply(ct,Se.default(i=[t,a]).call(i,ie.default(n)))}catch(e){return a}},i18nScope:Ze,defaultLanguageSettings:ot,getDataTypeName:Ge,isNumber:Je,isPlainObject:Ke};module.exports=pt; +"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"),m=require("@babel/runtime-corejs3/helpers/slicedToArray"),v=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 q=require("@babel/runtime-corejs3/core-js-stable/string/raw"),_=require("@babel/runtime-corejs3/core-js-stable/instance/includes"),x=require("@babel/runtime-corejs3/core-js-stable/instance/map"),w=require("@babel/runtime-corejs3/core-js-stable/instance/trim"),L=require("@babel/runtime-corejs3/core-js-stable/instance/index-of"),S=require("@babel/runtime-corejs3/core-js-stable/instance/last-index-of"),$=require("@babel/runtime-corejs3/core-js-stable/parse-int"),A=require("@babel/runtime-corejs3/core-js-stable/instance/starts-with"),E=require("@babel/runtime-corejs3/core-js-stable/instance/ends-with"),F=require("@babel/runtime-corejs3/core-js-stable/instance/find-index"),M=require("@babel/runtime-corejs3/core-js-stable/object/assign"),I=require("@babel/runtime-corejs3/core-js/instance/replace-all"),N=require("@babel/runtime-corejs3/core-js-stable/array/is-array");require("@babel/runtime-corejs3/core-js-stable/json/stringify");var T=require("@babel/runtime-corejs3/core-js-stable/instance/concat"),D=require("@babel/runtime-corejs3/core-js-stable/instance/splice"),C=require("@babel/runtime-corejs3/core-js-stable/instance/for-each"),O=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"),P=require("@babel/runtime-corejs3/core-js/global-this"),U=require("@babel/runtime-corejs3/core-js-stable/instance/bind");function Y(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var H=Y(e),W=Y(t),G=Y(r),J=Y(a),K=Y(n),Q=Y(l),X=Y(u),Z=Y(s),ee=Y(i),te=Y(c),re=Y(o),ae=Y(f),ne=Y(d),le=Y(g),ue=Y(h),se=Y(b),ie=Y(p),ce=Y(m),oe=Y(v),fe=Y(y),de=Y(j),ge=Y(k),he=Y(q),be=Y(_),pe=Y(x),me=Y(w),ve=Y(L),ye=Y(S),je=Y($),ke=Y(A),qe=Y(E),_e=Y(F),xe=Y(M),we=Y(I),Le=Y(N),Se=Y(T),$e=Y(D),Ae=Y(C),Ee=Y(O),Fe=Y(R),Me=Y(V),Ie=Y(z),Ne=Y(B),Te=Y(P),De=Y(U);var Ce,Oe=function(e){if("object"!==se.default(e)||null===e)return!1;var t=Ie.default(e);if(null===t)return!0;for(var r=t;null!==Ie.default(r);)r=Ie.default(r);return t===r},Re=function(e){return!isNaN(je.default(e))},Ve=function e(t,r){var a,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},l=xe.default({},t);return Ae.default(a=Ee.default(r)).call(a,(function(t){var r=ce.default(t,2),a=r[0],u=r[1];if(a in l)if("object"===se.default(u)&&null!==u)if(Le.default(u)){if(0===n.array)l[a]=u;else if(1===n.array){var s;l[a]=Se.default(s=[]).call(s,ie.default(l[a]),ie.default(u))}else if(2===n.array){var i;l[a]=ie.default(new Ne.default(Se.default(i=[]).call(i,ie.default(l[a]),ie.default(u))))}}else l[a]=e(l[a],u,n);else l[a]=u;else l[a]=u})),l},ze=function(e){return null===e?"Null":void 0===e?"Undefined":"function"==typeof e?"Function":e.constructor&&e.constructor.name},Be=function(){function e(){re.default(this,e),this._callbacks=[]}var t;return ae.default(e,[{key:"on",value:function(e){var t;be.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(re.default(this,e),this._id=t.id||(new Date).getTime().toString()+je.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.$cache={activeLanguage:null,typedFormatters:{},formatters:{}},!Te.default.VoerkaI18n){var a=mt.I18nManager;Te.default.VoerkaI18n=new a({defaultLanguage:this.defaultLanguage,activeLanguage:this.activeLanguage,languages:t.languages})}this.global=Te.default.VoerkaI18n,this._loading=!1,this.register(r)}var t;return ae.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:"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"===!se.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"===!se.default(t)||"string"!=typeof e)throw new TypeError("Formatter must be a function");be.default(Pe).call(Pe,e)?this.formatters[n].$types[e]=t:this.formatters[n][e]=t}},{key:"_fallback",value:function(){this._messages=this._default,this._activeLanguage=this.defaultLanguage}},{key:"refresh",value:(t=te.default(ge.default.mark((function e(t){var r,a,n;return ge.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this._loading=Me.default.resolve(),t||(t=this.activeLanguage),t!==this.defaultLanguage){e.next=5;break}return this._messages=this._default,e.abrupt("return");case 5:if("function"!=typeof(r=this.loaders[t])){e.next=20;break}return e.prev=7,e.next=10,r();case 10:this._messages=e.sent.default,this._activeLanguage=t,e.next=18;break;case 14:e.prev=14,e.t0=e.catch(7),console.warn(Se.default(a=Se.default(n="Error while loading language <".concat(t,"> on i18nScope(")).call(n,this.id,"): ")).call(a,e.t0.message)),this._fallback();case 18:e.next=21;break;case 20:this._fallback();case 21:case"end":return e.stop()}}),e,this,[[7,14]])}))),function(e){return t.apply(this,arguments)})},{key:"on",get:function(){var e;return De.default(e=this.global.on).call(e,this.global)}},{key:"off",get:function(){var e;return De.default(e=this.global.off).call(e,this.global)}},{key:"offAll",get:function(){var e;return De.default(e=this.global.offAll).call(e,this.global)}},{key:"change",get:function(){var e;return De.default(e=this.global.change).call(e,this.global)}}]),e}();function Ye(e){var t=function(){if("undefined"==typeof Reflect||!ee.default)return!1;if(ee.default.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(ee.default(Boolean,[],(function(){}))),!0}catch(e){return!1}}();return function(){var r,a=ue.default(e);if(t){var n=ue.default(this).constructor;r=ee.default(a,arguments,n)}else r=a.apply(this,arguments);return le.default(this,r)}}function He(e,t){var r=void 0!==X.default&&Z.default(e)||e["@@iterator"];if(!r){if(Le.default(e)||(r=function(e,t){var r;if(!e)return;if("string"==typeof e)return We(e,t);var a=Fe.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 Q.default(e);if("Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a))return We(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 We(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[K.default].call(this,r,(function(){var e=arguments;return"object"!=se.default(e[e.length-1])&&(e=Fe.default([]).call(e)).push(a(e,u)),n.apply(this,e)}))}return e[K.default].call(this,r,n)},Ge.apply(this,arguments)}var Je=ze,Ke=Re,Qe=Oe,Xe=Ve,Ze=Be,et=Ue,tt={"*":{$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 Se.default(t=Se.default(r=Se.default(a=Se.default(n=Se.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 Se.default(t=Se.default(r="".concat(e.getHours(),"点")).call(r,e.getMinutes(),"分")).call(t,e.getSeconds(),"秒")},date:function(e){var t,r;return Se.default(t=Se.default(r="".concat(e.getFullYear(),"年")).call(r,e.getMonth()+1,"月")).call(t,e.getDate(),"日")},shortdate:function(e){var t,r;return Se.default(t=Se.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)}}},rt=Ge(/\{\s*(\w+)?((\s*\|\s*\w*(\(.*\))?\s*)*)\s*\}/g,{varname:1,formatters:2});function at(e){return be.default(e).call(e,"{")&&be.default(e).call(e,"}")}he.default(Ce||(Ce=oe.default(["{s*{varname}s*}"],["\\{\\s*{varname}\\s*\\}"])));var nt=["String","Number","Boolean","Object","Array","Function","Error","Symbol","RegExp","Date","Null","Undefined","Set","Map","WeakSet","WeakMap"];function lt(e){var t,r;if(!e)return[];var a=pe.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 pe.default(a).call(a,(function(e){var t=ve.default(e).call(e,"("),r=ye.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?[]:pe.default(n=l.split(",")).call(n,(function(e){if(e=me.default(e).call(e),!isNaN(je.default(e)))return je.default(e);if(ke.default(e).call(e,'"')&&qe.default(e).call(e,'"')||ke.default(e).call(e,"'")&&qe.default(e).call(e,"'"))return e.substr(1,e.length-2);if("true"===e.toLowerCase()||"false"===e.toLowerCase())return"true"===e.toLowerCase();if(!(ke.default(e).call(e,"{")&&qe.default(e).call(e,"}")||ke.default(e).call(e,"[")&&qe.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 ut(e,t){var r,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=e,l=xe.default({replaceAll:!0},a);for(rt.lastIndex=0;null!==(r=rt.exec(n));){var u=r.groups.varname||"",s=lt(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}rt.lastIndex=0}return n}function st(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;e.$cache={activeLanguage:t,typedFormatters:{},formatters:{}}}function it(e,t,r){var a,n=[],l=He(r);try{var u=function(){var r=a.value;if(r[0]){var l=function(e,t,r){if(e.$cache||st(e),e.$cache.activeLanguage===t){if(r in e.$cache.formatters)return e.$cache.formatters[r]}else st(e,t);for(var a=0,n=[e.formatters,e.global.formatters];a1?a-1:0),l=1;li)return ct(t,r,a,s[i++]);throw new Error}),{replaceAll:!1})}var ft={defaultLanguage:"zh",activeLanguage:"zh",languages:[{name:"zh",title:"中文",default:!0},{name:"en",title:"英文"}],formatters:tt};function dt(e){return je.default(e)>0}function gt(e,t){try{return Le.default(e)?e.length>t?e[t]:e[e.length-1]:e}catch(t){return Le.default(e)?e[0]:e}}function ht(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 bt(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 pt=function(e){fe.default(l,e);var t,r,a,n=Ye(l);function l(){var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return re.default(this,l),e=n.call(this),null!=l.instance||(l.instance=ne.default(e),e._settings=Xe(ft,t),e._scopes=[]),le.default(e,l.instance)}return ae.default(l,[{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 tt}},{key:"change",value:(a=te.default(ge.default.mark((function e(t){var r;return ge.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=me.default(t).call(t),-1===_e.default(r=this.languages).call(r,(function(e){return e.name===t}))){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 a.apply(this,arguments)})},{key:"_refreshScopes",value:(r=te.default(ge.default.mark((function e(t){var r,a;return ge.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,a=pe.default(r=this._scopes).call(r,(function(e){return e.refresh(t)})),!Me.default.allSettled){e.next=7;break}return e.next=5,Me.default.allSettled(a);case 5:e.next=9;break;case 7:return e.next=9,Me.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 r.apply(this,arguments)})},{key:"register",value:(t=te.default(ge.default.mark((function e(t){return ge.default.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t instanceof et){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 t.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"===!se.default(t)||"string"!=typeof e)throw new TypeError("Formatter must be a function");be.default(nt).call(nt,e)?this.formatters[n].$types[e]=t:this.formatters[n][e]=t}}]),l}(Ze),mt={getInterpolatedVars:function(e){var t=[];return ut(e,(function(e,r,a){var n={name:e,formatters:pe.default(r).call(r,(function(e){var t=ce.default(e,2);return{name:t[0],args:t[1]}})),match:a};return-1===_e.default(t).call(t,(function(e){return e.name===n.name&&n.formatters.toString()==e.formatters.toString()}))&&t.push(n),""})),t},replaceInterpolatedVars:ot,I18nManager:pt,translate:function(e){var t=this,r=t.global.activeLanguage,a=e,n=[],l=[],u=null;if("string"===!se.default(e))return e;try{var s,i;if(2===arguments.length&&Qe(arguments[1]))Ae.default(s=Ee.default(arguments[1])).call(s,(function(e){var t=ce.default(e,2),r=t[0],a=t[1];if("function"==typeof a)try{n[r]=a()}catch(e){n[r]=a}ke.default(r).call(r,"$")&&"number"==typeof n[r]&&l.push(r)})),n=[arguments[1]];else if(arguments.length>=2){var c,o;n=pe.default(c=$e.default(o=Fe.default(Array.prototype).call(arguments)).call(o,1)).call(c,(function(e,t){try{e="function"==typeof e?e():e,Ke(e)&&(u=je.default(e))}catch(e){}return e}))}if(r===t.defaultLanguage)dt(a)&&(a=t.default[a]||e);else{var f=dt(a)?a:t.idMap[ht(a)];a=t.messages[f]||a,a=Le.default(a)?pe.default(a).call(a,(function(e){return bt(e)})):bt(a)}return Le.default(a)&&a.length>0&&(a=null!==u?gt(a,u):pluralVar.length>0?gt(a,je.default(n(pluralVar[0]))):a[0]),0==n.length?a:ot.call.apply(ot,Se.default(i=[t,a]).call(i,ie.default(n)))}catch(e){return a}},i18nScope:et,defaultLanguageSettings:ft,getDataTypeName:Je,isNumber:Ke,isPlainObject:Qe};module.exports=mt; //# sourceMappingURL=index.cjs.map diff --git a/packages/runtime/dist/index.cjs.map b/packages/runtime/dist/index.cjs.map index d88e68f..4b62c4e 100644 --- a/packages/runtime/dist/index.cjs.map +++ b/packages/runtime/dist/index.cjs.map @@ -1 +1 @@ -{"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}","\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 // 主要用来缓存格式化器的引用,当使用格式化器时可以直接引用,避免检索\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 // 正在加载语言包标识\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 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 */\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 return \r\n }\r\n // 非默认语言需要异步加载语言包文件,加载器是一个异步函数\r\n // 如果没有加载器,则无法加载语言包,因此回退到默认语言\r\n const loader = this.loaders[newLanguage]\r\n if(typeof(loader) === \"function\"){\r\n try{\r\n this._messages = (await loader()).default\r\n this._activeLanguage = newLanguage\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 }else{\r\n this._fallback()\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 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 /**\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){\r\n // 通知所有作用域刷新到对应的语言包\r\n await this._refreshScopes(value)\r\n this._settings.activeLanguage = value\r\n /// 触发语言切换事件\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\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","options","results","_Object$assign","key","_Array$isArray","array","v","undefined","constructor","name","eventemitter","_callbacks","callback","_includesInstanceProperty","push","i","this","length","args","_Promise","allSettled","_mapInstanceProperty","cb","all","scope","_id","id","Date","getTime","toString","Math","random","_languages","languages","_defaultLanguage","defaultLanguage","_activeLanguage","activeLanguage","_default","_messages","messages","_idMap","idMap","_formatters","formatters","_loaders","loaders","_global","$cache","typedFormatters","_globalThis","VoerkaI18n","I18nManager","require$$0","global","_loading","register","then","formatter","language","TypeError","DataTypes","$types","newLanguage","resolve","loader","console","warn","_context3","message","_fallback","_bindInstanceProperty","on","off","offAll","change","getDataTypeName","isNumber","isPlainObject","EventEmitter","require$$1","i18nScope","require$$2","inlineFormatters","toLocaleString","time","toLocaleTimeString","shorttime","date","toLocaleDateString","dict","zh","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","shortime","shortdate","currency","en","varWithPipeRegexp","hasInterpolation","str","parseFormatters","result","substr","split","r","_trimInstanceProperty","firstIndex","_indexOfInstanceProperty","lastIndex","_lastIndexOfInstanceProperty","argsContent","arg","_startsWithInstanceProperty","_endsWithInstanceProperty","toLowerCase","String","JSON","parse","e","forEachInterpolatedVars","match","opts","replaceAll","exec","varname","groups","_replaceAllInstanceProperty","replace","resetScopeCache","buildFormatters","func","target","getFormatter","call","getFormattedValue","formatterFuncs","defaultFormatter","dataType","getDataTypeDefaultFormatter","error","executeFormatter","replaceInterpolatedVars","template","varValues","params","Error","defaultLanguageSettings","title","isMessageId","content","getPluraMessage","escape","unescape","settings","instance","_settings","_scopes","_findIndexInstanceProperty","lang","_refreshScopes","emit","scopeRefreshers","refresh","_context31","runtime","getInterpolatedVars","vars","varName","varItem","varDef","translate","pluralVars","pluraValue","arguments","index","msgId","pluralVar"],"mappings":"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"} \ No newline at end of file +{"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}","\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 // 主要用来缓存格式化器的引用,当使用格式化器时可以直接引用,避免检索\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 // 正在加载语言包标识\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 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 */\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 return \r\n }\r\n // 非默认语言需要异步加载语言包文件,加载器是一个异步函数\r\n // 如果没有加载器,则无法加载语言包,因此回退到默认语言\r\n const loader = this.loaders[newLanguage]\r\n if(typeof(loader) === \"function\"){\r\n try{\r\n this._messages = (await loader()).default\r\n this._activeLanguage = newLanguage\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 }else{\r\n this._fallback()\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 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 /**\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){\r\n // 通知所有作用域刷新到对应的语言包\r\n await this._refreshScopes(value)\r\n this._settings.activeLanguage = value\r\n /// 触发语言切换事件\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\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","options","results","_Object$assign","key","_Array$isArray","array","v","undefined","constructor","name","eventemitter","_callbacks","callback","_includesInstanceProperty","push","i","this","length","args","_Promise","allSettled","_mapInstanceProperty","cb","all","DataTypes","scope","_id","id","Date","getTime","toString","Math","random","_languages","languages","_defaultLanguage","defaultLanguage","_activeLanguage","activeLanguage","_default","_messages","messages","_idMap","idMap","_formatters","formatters","_loaders","loaders","_global","$cache","typedFormatters","_globalThis","VoerkaI18n","I18nManager","require$$0","global","_loading","register","then","formatter","language","TypeError","$types","newLanguage","resolve","loader","console","warn","_context3","message","_fallback","_bindInstanceProperty","on","off","offAll","change","getDataTypeName","isNumber","isPlainObject","EventEmitter","require$$1","i18nScope","require$$2","inlineFormatters","toLocaleString","time","toLocaleTimeString","shorttime","date","toLocaleDateString","dict","zh","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","shortime","shortdate","currency","en","varWithPipeRegexp","hasInterpolation","str","parseFormatters","result","substr","split","r","_trimInstanceProperty","firstIndex","_indexOfInstanceProperty","lastIndex","_lastIndexOfInstanceProperty","argsContent","arg","_startsWithInstanceProperty","_endsWithInstanceProperty","toLowerCase","String","JSON","parse","e","forEachInterpolatedVars","match","opts","replaceAll","exec","varname","groups","_replaceAllInstanceProperty","replace","resetScopeCache","buildFormatters","func","target","getFormatter","call","getFormattedValue","formatterFuncs","defaultFormatter","dataType","getDataTypeDefaultFormatter","error","executeFormatter","replaceInterpolatedVars","template","varValues","params","Error","defaultLanguageSettings","title","isMessageId","content","getPluraMessage","escape","unescape","settings","instance","_settings","_scopes","_findIndexInstanceProperty","lang","_refreshScopes","emit","scopeRefreshers","refresh","_context31","runtime","getInterpolatedVars","vars","varName","varItem","varDef","translate","pluralVars","pluraValue","arguments","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 index d68c0a3..2f30f2d 100644 --- a/packages/runtime/dist/index.esm.js +++ b/packages/runtime/dist/index.esm.js @@ -1,2 +1,2 @@ -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 n from"@babel/runtime-corejs3/core-js-stable/object/create";import a from"@babel/runtime-corejs3/core-js-stable/symbol/replace";import o from"@babel/runtime-corejs3/core-js-stable/array/from";import s 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 m from"@babel/runtime-corejs3/helpers/assertThisInitialized";import g from"@babel/runtime-corejs3/helpers/possibleConstructorReturn";import p from"@babel/runtime-corejs3/helpers/getPrototypeOf";import h from"@babel/runtime-corejs3/helpers/typeof";import b from"@babel/runtime-corejs3/helpers/toConsumableArray";import v from"@babel/runtime-corejs3/helpers/slicedToArray";import y from"@babel/runtime-corejs3/helpers/taggedTemplateLiteral";import d 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 w from"@babel/runtime-corejs3/core-js-stable/instance/map";import L from"@babel/runtime-corejs3/core-js-stable/instance/trim";import S from"@babel/runtime-corejs3/core-js-stable/instance/index-of";import $ from"@babel/runtime-corejs3/core-js-stable/instance/last-index-of";import M from"@babel/runtime-corejs3/core-js-stable/parse-int";import A from"@babel/runtime-corejs3/core-js-stable/instance/starts-with";import F from"@babel/runtime-corejs3/core-js-stable/instance/ends-with";import T from"@babel/runtime-corejs3/core-js-stable/instance/find-index";import E from"@babel/runtime-corejs3/core-js-stable/object/assign";import I from"@babel/runtime-corejs3/core-js/instance/replace-all";import D from"@babel/runtime-corejs3/core-js-stable/array/is-array";import"@babel/runtime-corejs3/core-js-stable/json/stringify";import N from"@babel/runtime-corejs3/core-js-stable/instance/concat";import C from"@babel/runtime-corejs3/core-js-stable/instance/splice";import O from"@babel/runtime-corejs3/core-js-stable/instance/for-each";import V from"@babel/runtime-corejs3/core-js-stable/object/entries";import z from"@babel/runtime-corejs3/core-js-stable/instance/slice";import R from"@babel/runtime-corejs3/core-js-stable/promise";import P from"@babel/runtime-corejs3/core-js-stable/object/get-prototype-of";import B from"@babel/runtime-corejs3/core-js-stable/set";import U from"@babel/runtime-corejs3/core-js/global-this";import Y from"@babel/runtime-corejs3/core-js-stable/instance/bind";var H,W=function(e){if("object"!==h(e)||null===e)return!1;var t=P(e);if(null===t)return!0;for(var r=t;null!==P(r);)r=P(r);return t===r},G=function(e){return!isNaN(M(e))},J=function e(t,r){var n,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=E({},t);return O(n=V(r)).call(n,(function(t){var r=v(t,2),n=r[0],s=r[1];if(n in o)if("object"===h(s)&&null!==s)if(D(s)){if(0===a.array)o[n]=s;else if(1===a.array){var i;o[n]=N(i=[]).call(i,b(o[n]),b(s))}else if(2===a.array){var l;o[n]=b(new B(N(l=[]).call(l,b(o[n]),b(s))))}}else o[n]=e(o[n],s,a);else o[n]=s;else o[n]=s})),o},q=function(e){return null===e?"Null":void 0===e?"Undefined":"function"==typeof e?"Function":e.constructor&&e.constructor.name},K=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()+M(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.$cache={activeLanguage:null,typedFormatters:{},formatters:{}},!U.VoerkaI18n){var n=we.I18nManager;U.VoerkaI18n=new n({defaultLanguage:this.defaultLanguage,activeLanguage:this.activeLanguage,languages:t.languages})}this.global=U.VoerkaI18n,this._loading=!1,this.register(r)}var t;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:"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"===!h(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]:{},n=r.language,a=void 0===n?"*":n;if("function"===!h(t)||"string"!=typeof e)throw new TypeError("Formatter must be a function");x(DataTypes).call(DataTypes,e)?this.formatters[a].$types[e]=t:this.formatters[a][e]=t}},{key:"_fallback",value:function(){this._messages=this._default,this._activeLanguage=this.defaultLanguage}},{key:"refresh",value:(t=c(k.mark((function e(t){var r,n,a;return k.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this._loading=R.resolve(),t||(t=this.activeLanguage),t!==this.defaultLanguage){e.next=5;break}return this._messages=this._default,e.abrupt("return");case 5:if("function"!=typeof(r=this.loaders[t])){e.next=20;break}return e.prev=7,e.next=10,r();case 10:this._messages=e.sent.default,this._activeLanguage=t,e.next=18;break;case 14:e.prev=14,e.t0=e.catch(7),console.warn(N(n=N(a="Error while loading language <".concat(t,"> on i18nScope(")).call(a,this.id,"): ")).call(n,e.t0.message)),this._fallback();case 18:e.next=21;break;case 20:this._fallback();case 21:case"end":return e.stop()}}),e,this,[[7,14]])}))),function(e){return t.apply(this,arguments)})},{key:"on",get:function(){var e;return Y(e=this.global.on).call(e,this.global)}},{key:"off",get:function(){var e;return Y(e=this.global.off).call(e,this.global)}},{key:"offAll",get:function(){var e;return Y(e=this.global.offAll).call(e,this.global)}},{key:"change",get:function(){var e;return Y(e=this.global.change).call(e,this.global)}}]),e}();function X(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,n=p(e);if(t){var a=p(this).constructor;r=l(n,arguments,a)}else r=n.apply(this,arguments);return g(this,r)}}function Z(e,t){var r=void 0!==s&&i(e)||e["@@iterator"];if(!r){if(D(e)||(r=function(e,t){var r;if(!e)return;if("string"==typeof e)return ee(e,t);var n=z(r=Object.prototype.toString.call(e)).call(r,8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return o(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return ee(e,t)}(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,a=function(){};return{s:a,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:a}}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 ee(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r]+)>/g,(function(e,t){return"$"+r[t]})))}if("function"==typeof t){var n=this;return o[a].call(this,e,(function(){var e=arguments;return"object"!=h(e[e.length-1])&&(e=z([]).call(e)).push(l(e,n)),t.apply(this,e)}))}return o[a].call(this,e,t)},te.apply(this,arguments)}var re=q,ne=G,ae=W,oe=J,se=K,ie=Q,le={"*":{$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),n=1;n0&&r.length%2!=0?r[r.length-1]:e}},zh:{$types:{Date:function(e){var t,r,n,a,o;return N(t=N(r=N(n=N(a=N(o="".concat(e.getFullYear(),"年")).call(o,e.getMonth()+1,"月")).call(a,e.getDate(),"日 ")).call(n,e.getHours(),"点")).call(r,e.getMinutes(),"分")).call(t,e.getSeconds(),"秒")}},shortime:function(e){return e.toLocaleTimeString()},time:function(e){var t,r;return N(t=N(r="".concat(e.getHours(),"点")).call(r,e.getMinutes(),"分")).call(t,e.getSeconds(),"秒")},date:function(e){var t,r;return N(t=N(r="".concat(e.getFullYear(),"年")).call(r,e.getMonth()+1,"月")).call(t,e.getDate(),"日")},shortdate:function(e){var t,r;return N(t=N(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)}}},ce=te(/\{\s*(\w+)?((\s*\|\s*\w*(\(.*\))?\s*)*)\s*\}/g,{varname:1,formatters:2});function ue(e){return x(e).call(e,"{")&&x(e).call(e,"}")}_(H||(H=y(["{s*{varname}s*}"],["\\{\\s*{varname}\\s*\\}"])));var fe=["String","Number","Boolean","Object","Array","Function","Error","Symbol","RegExp","Date","Null","Undefined","Set","Map","WeakSet","WeakMap"];function me(e){var t,r;if(!e)return[];var n=w(t=L(r=L(e).call(e).substr(1)).call(r).split("|")).call(t,(function(e){return L(e).call(e)}));return w(n).call(n,(function(e){var t=S(e).call(e,"("),r=$(e).call(e,")");if(-1!==t&&-1!==r){var n,a,o=L(n=e.substr(t+1,r-t-1)).call(n),s=""==o?[]:w(a=o.split(",")).call(a,(function(e){if(e=L(e).call(e),!isNaN(M(e)))return M(e);if(A(e).call(e,'"')&&F(e).call(e,'"')||A(e).call(e,"'")&&F(e).call(e,"'"))return e.substr(1,e.length-2);if("true"===e.toLowerCase()||"false"===e.toLowerCase())return"true"===e.toLowerCase();if(!(A(e).call(e,"{")&&F(e).call(e,"}")||A(e).call(e,"[")&&F(e).call(e,"]")))return String(e);try{return JSON.parse(e)}catch(t){return String(e)}}));return[e.substr(0,t),s]}return[e,[]]}))}function ge(e,t){var r,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},a=e,o=E({replaceAll:!0},n);for(ce.lastIndex=0;null!==(r=ce.exec(a));){var s=r.groups.varname||"",i=me(r.groups.formatters);if("function"==typeof t)try{a=I(o)?I(a).call(a,r[0],t(s,i,r[0])):a.replace(r[0],t(s,i,r[0]))}catch(e){break}ce.lastIndex=0}return a}function pe(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;e.$cache={activeLanguage:t,typedFormatters:{},formatters:{}}}function he(e,t,r){var n,a=[],o=Z(r);try{var s=function(){var r=n.value;if(r[0]){var o=function(e,t,r){if(e.$cache||pe(e),e.$cache.activeLanguage===t){if(r in e.$cache.formatters)return e.$cache.formatters[r]}else pe(e,t);for(var n=0,a=[e.formatters,e.global.formatters];n1?n-1:0),o=1;ol)return be(t,r,n,i[l++]);throw new Error}),{replaceAll:!1})}var ye={defaultLanguage:"zh",activeLanguage:"zh",languages:[{name:"zh",title:"中文",default:!0},{name:"en",title:"英文"}],formatters:le};function de(e){return M(e)>0}function je(e,t){try{return D(e)?e.length>t?e[t]:e[e.length-1]:e}catch(t){return D(e)?e[0]:e}}function ke(e){var t,r,n,a,o,s,i,l;return I(t=I(r=I(n=I(a=I(o=I(s=I(i=I(l=I(e).call(e,/\\(?![trnbvf'"]{1})/g,"\\\\")).call(l,"\t","\\t")).call(i,"\n","\\n")).call(s,"\b","\\b")).call(o,"\r","\\r")).call(a,"\f","\\f")).call(n,"'","\\'")).call(r,'"','\\"')).call(t,"\v","\\v")}function _e(e){var t,r,n,a,o,s,i,l;return I(t=I(r=I(n=I(a=I(o=I(s=I(i=I(l=I(e).call(e,"\\t","\t")).call(l,"\\n","\n")).call(i,"\\b","\b")).call(s,"\\r","\r")).call(o,"\\f","\f")).call(a,"\\'","'")).call(n,'\\"','"')).call(r,"\\v","\v")).call(t,/\\\\(?![trnbvf'"]{1})/g,"\\")}var xe=function(e){d(o,se);var t,r,n,a=X(o);function o(){var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return u(this,o),e=a.call(this),null!=o.instance||(o.instance=m(e),e._settings=oe(ye,t),e._scopes=[]),g(e,o.instance)}return f(o,[{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 le}},{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=L(t).call(t),-1===T(r=this.languages).call(r,(function(e){return e.name===t}))){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:(r=c(k.mark((function e(t){var r,n;return k.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,n=w(r=this._scopes).call(r,(function(e){return e.refresh(t)})),!R.allSettled){e.next=7;break}return e.next=5,R.allSettled(n);case 5:e.next=9;break;case 7:return e.next=9,R.all(n);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 r.apply(this,arguments)})},{key:"register",value:(t=c(k.mark((function e(t){return k.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t instanceof ie){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 t.apply(this,arguments)})},{key:"registerFormatter",value:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=r.language,a=void 0===n?"*":n;if("function"===!h(t)||"string"!=typeof e)throw new TypeError("Formatter must be a function");x(fe).call(fe,e)?this.formatters[a].$types[e]=t:this.formatters[a][e]=t}}]),o}(),we={getInterpolatedVars:function(e){var t=[];return ge(e,(function(e,r,n){var a={name:e,formatters:w(r).call(r,(function(e){var t=v(e,2);return{name:t[0],args:t[1]}})),match:n};return-1===T(t).call(t,(function(e){return e.name===a.name&&a.formatters.toString()==e.formatters.toString()}))&&t.push(a),""})),t},replaceInterpolatedVars:ve,I18nManager:xe,translate:function(e){var t=this,r=t.global.activeLanguage,n=e,a=[],o=[],s=null;if("string"===!h(e))return e;try{var i,l;if(2===arguments.length&&ae(arguments[1]))O(i=V(arguments[1])).call(i,(function(e){var t=v(e,2),r=t[0],n=t[1];if("function"==typeof n)try{a[r]=n()}catch(e){a[r]=n}A(r).call(r,"$")&&"number"==typeof a[r]&&o.push(r)})),a=[arguments[1]];else if(arguments.length>=2){var c,u;a=w(c=C(u=z(Array.prototype).call(arguments)).call(u,1)).call(c,(function(e,t){try{e="function"==typeof e?e():e,ne(e)&&(s=M(e))}catch(e){}return e}))}if(r===t.defaultLanguage)de(n)&&(n=t.default[n]||e);else{var f=de(n)?n:t.idMap[ke(n)];n=t.messages[f]||n,n=D(n)?w(n).call(n,(function(e){return _e(e)})):_e(n)}return D(n)&&n.length>0&&(n=null!==s?je(n,s):pluralVar.length>0?je(n,M(a(pluralVar[0]))):n[0]),0==a.length?n:ve.call.apply(ve,N(l=[t,n]).call(l,b(a)))}catch(e){return n}},i18nScope:ie,defaultLanguageSettings:ye,getDataTypeName:re,isNumber:ne,isPlainObject:ae};export{we as default}; +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 n from"@babel/runtime-corejs3/core-js-stable/object/create";import a from"@babel/runtime-corejs3/core-js-stable/symbol/replace";import o from"@babel/runtime-corejs3/core-js-stable/array/from";import s 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 m from"@babel/runtime-corejs3/helpers/assertThisInitialized";import g from"@babel/runtime-corejs3/helpers/possibleConstructorReturn";import p from"@babel/runtime-corejs3/helpers/getPrototypeOf";import h from"@babel/runtime-corejs3/helpers/typeof";import b from"@babel/runtime-corejs3/helpers/toConsumableArray";import v from"@babel/runtime-corejs3/helpers/slicedToArray";import y from"@babel/runtime-corejs3/helpers/taggedTemplateLiteral";import d 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 w from"@babel/runtime-corejs3/core-js-stable/instance/map";import L from"@babel/runtime-corejs3/core-js-stable/instance/trim";import S from"@babel/runtime-corejs3/core-js-stable/instance/index-of";import $ from"@babel/runtime-corejs3/core-js-stable/instance/last-index-of";import A from"@babel/runtime-corejs3/core-js-stable/parse-int";import E from"@babel/runtime-corejs3/core-js-stable/instance/starts-with";import F from"@babel/runtime-corejs3/core-js-stable/instance/ends-with";import M from"@babel/runtime-corejs3/core-js-stable/instance/find-index";import I from"@babel/runtime-corejs3/core-js-stable/object/assign";import N from"@babel/runtime-corejs3/core-js/instance/replace-all";import T from"@babel/runtime-corejs3/core-js-stable/array/is-array";import"@babel/runtime-corejs3/core-js-stable/json/stringify";import D from"@babel/runtime-corejs3/core-js-stable/instance/concat";import C from"@babel/runtime-corejs3/core-js-stable/instance/splice";import O 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 P from"@babel/runtime-corejs3/core-js-stable/set";import U from"@babel/runtime-corejs3/core-js/global-this";import Y from"@babel/runtime-corejs3/core-js-stable/instance/bind";var H,W=function(e){if("object"!==h(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(A(e))},J=function e(t,r){var n,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=I({},t);return O(n=R(r)).call(n,(function(t){var r=v(t,2),n=r[0],s=r[1];if(n in o)if("object"===h(s)&&null!==s)if(T(s)){if(0===a.array)o[n]=s;else if(1===a.array){var i;o[n]=D(i=[]).call(i,b(o[n]),b(s))}else if(2===a.array){var l;o[n]=b(new P(D(l=[]).call(l,b(o[n]),b(s))))}}else o[n]=e(o[n],s,a);else o[n]=s;else o[n]=s})),o},q=function(e){return null===e?"Null":void 0===e?"Undefined":"function"==typeof e?"Function":e.constructor&&e.constructor.name},K=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()+A(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.$cache={activeLanguage:null,typedFormatters:{},formatters:{}},!U.VoerkaI18n){var n=Le.I18nManager;U.VoerkaI18n=new n({defaultLanguage:this.defaultLanguage,activeLanguage:this.activeLanguage,languages:t.languages})}this.global=U.VoerkaI18n,this._loading=!1,this.register(r)}var t;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:"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"===!h(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]:{},n=r.language,a=void 0===n?"*":n;if("function"===!h(t)||"string"!=typeof e)throw new TypeError("Formatter must be a function");x(Q).call(Q,e)?this.formatters[a].$types[e]=t:this.formatters[a][e]=t}},{key:"_fallback",value:function(){this._messages=this._default,this._activeLanguage=this.defaultLanguage}},{key:"refresh",value:(t=c(k.mark((function e(t){var r,n,a;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=5;break}return this._messages=this._default,e.abrupt("return");case 5:if("function"!=typeof(r=this.loaders[t])){e.next=20;break}return e.prev=7,e.next=10,r();case 10:this._messages=e.sent.default,this._activeLanguage=t,e.next=18;break;case 14:e.prev=14,e.t0=e.catch(7),console.warn(D(n=D(a="Error while loading language <".concat(t,"> on i18nScope(")).call(a,this.id,"): ")).call(n,e.t0.message)),this._fallback();case 18:e.next=21;break;case 20:this._fallback();case 21:case"end":return e.stop()}}),e,this,[[7,14]])}))),function(e){return t.apply(this,arguments)})},{key:"on",get:function(){var e;return Y(e=this.global.on).call(e,this.global)}},{key:"off",get:function(){var e;return Y(e=this.global.off).call(e,this.global)}},{key:"offAll",get:function(){var e;return Y(e=this.global.offAll).call(e,this.global)}},{key:"change",get:function(){var e;return Y(e=this.global.change).call(e,this.global)}}]),e}();function Z(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,n=p(e);if(t){var a=p(this).constructor;r=l(n,arguments,a)}else r=n.apply(this,arguments);return g(this,r)}}function ee(e,t){var r=void 0!==s&&i(e)||e["@@iterator"];if(!r){if(T(e)||(r=function(e,t){var r;if(!e)return;if("string"==typeof e)return te(e,t);var n=V(r=Object.prototype.toString.call(e)).call(r,8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return o(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return te(e,t)}(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,a=function(){};return{s:a,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:a}}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 te(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r]+)>/g,(function(e,t){return"$"+r[t]})))}if("function"==typeof t){var n=this;return o[a].call(this,e,(function(){var e=arguments;return"object"!=h(e[e.length-1])&&(e=V([]).call(e)).push(l(e,n)),t.apply(this,e)}))}return o[a].call(this,e,t)},re.apply(this,arguments)}var ne=q,ae=G,oe=W,se=J,ie=K,le=X,ce={"*":{$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),n=1;n0&&r.length%2!=0?r[r.length-1]:e}},zh:{$types:{Date:function(e){var t,r,n,a,o;return D(t=D(r=D(n=D(a=D(o="".concat(e.getFullYear(),"年")).call(o,e.getMonth()+1,"月")).call(a,e.getDate(),"日 ")).call(n,e.getHours(),"点")).call(r,e.getMinutes(),"分")).call(t,e.getSeconds(),"秒")}},shortime:function(e){return e.toLocaleTimeString()},time:function(e){var t,r;return D(t=D(r="".concat(e.getHours(),"点")).call(r,e.getMinutes(),"分")).call(t,e.getSeconds(),"秒")},date:function(e){var t,r;return D(t=D(r="".concat(e.getFullYear(),"年")).call(r,e.getMonth()+1,"月")).call(t,e.getDate(),"日")},shortdate:function(e){var t,r;return D(t=D(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)}}},ue=re(/\{\s*(\w+)?((\s*\|\s*\w*(\(.*\))?\s*)*)\s*\}/g,{varname:1,formatters:2});function fe(e){return x(e).call(e,"{")&&x(e).call(e,"}")}_(H||(H=y(["{s*{varname}s*}"],["\\{\\s*{varname}\\s*\\}"])));var me=["String","Number","Boolean","Object","Array","Function","Error","Symbol","RegExp","Date","Null","Undefined","Set","Map","WeakSet","WeakMap"];function ge(e){var t,r;if(!e)return[];var n=w(t=L(r=L(e).call(e).substr(1)).call(r).split("|")).call(t,(function(e){return L(e).call(e)}));return w(n).call(n,(function(e){var t=S(e).call(e,"("),r=$(e).call(e,")");if(-1!==t&&-1!==r){var n,a,o=L(n=e.substr(t+1,r-t-1)).call(n),s=""==o?[]:w(a=o.split(",")).call(a,(function(e){if(e=L(e).call(e),!isNaN(A(e)))return A(e);if(E(e).call(e,'"')&&F(e).call(e,'"')||E(e).call(e,"'")&&F(e).call(e,"'"))return e.substr(1,e.length-2);if("true"===e.toLowerCase()||"false"===e.toLowerCase())return"true"===e.toLowerCase();if(!(E(e).call(e,"{")&&F(e).call(e,"}")||E(e).call(e,"[")&&F(e).call(e,"]")))return String(e);try{return JSON.parse(e)}catch(t){return String(e)}}));return[e.substr(0,t),s]}return[e,[]]}))}function pe(e,t){var r,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},a=e,o=I({replaceAll:!0},n);for(ue.lastIndex=0;null!==(r=ue.exec(a));){var s=r.groups.varname||"",i=ge(r.groups.formatters);if("function"==typeof t)try{a=N(o)?N(a).call(a,r[0],t(s,i,r[0])):a.replace(r[0],t(s,i,r[0]))}catch(e){break}ue.lastIndex=0}return a}function he(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;e.$cache={activeLanguage:t,typedFormatters:{},formatters:{}}}function be(e,t,r){var n,a=[],o=ee(r);try{var s=function(){var r=n.value;if(r[0]){var o=function(e,t,r){if(e.$cache||he(e),e.$cache.activeLanguage===t){if(r in e.$cache.formatters)return e.$cache.formatters[r]}else he(e,t);for(var n=0,a=[e.formatters,e.global.formatters];n1?n-1:0),o=1;ol)return ve(t,r,n,i[l++]);throw new Error}),{replaceAll:!1})}var de={defaultLanguage:"zh",activeLanguage:"zh",languages:[{name:"zh",title:"中文",default:!0},{name:"en",title:"英文"}],formatters:ce};function je(e){return A(e)>0}function ke(e,t){try{return T(e)?e.length>t?e[t]:e[e.length-1]:e}catch(t){return T(e)?e[0]:e}}function _e(e){var t,r,n,a,o,s,i,l;return N(t=N(r=N(n=N(a=N(o=N(s=N(i=N(l=N(e).call(e,/\\(?![trnbvf'"]{1})/g,"\\\\")).call(l,"\t","\\t")).call(i,"\n","\\n")).call(s,"\b","\\b")).call(o,"\r","\\r")).call(a,"\f","\\f")).call(n,"'","\\'")).call(r,'"','\\"')).call(t,"\v","\\v")}function xe(e){var t,r,n,a,o,s,i,l;return N(t=N(r=N(n=N(a=N(o=N(s=N(i=N(l=N(e).call(e,"\\t","\t")).call(l,"\\n","\n")).call(i,"\\b","\b")).call(s,"\\r","\r")).call(o,"\\f","\f")).call(a,"\\'","'")).call(n,'\\"','"')).call(r,"\\v","\v")).call(t,/\\\\(?![trnbvf'"]{1})/g,"\\")}var we=function(e){d(o,ie);var t,r,n,a=Z(o);function o(){var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return u(this,o),e=a.call(this),null!=o.instance||(o.instance=m(e),e._settings=se(de,t),e._scopes=[]),g(e,o.instance)}return f(o,[{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 ce}},{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=L(t).call(t),-1===M(r=this.languages).call(r,(function(e){return e.name===t}))){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:(r=c(k.mark((function e(t){var r,n;return k.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(e.prev=0,n=w(r=this._scopes).call(r,(function(e){return e.refresh(t)})),!z.allSettled){e.next=7;break}return e.next=5,z.allSettled(n);case 5:e.next=9;break;case 7:return e.next=9,z.all(n);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 r.apply(this,arguments)})},{key:"register",value:(t=c(k.mark((function e(t){return k.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t instanceof le){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 t.apply(this,arguments)})},{key:"registerFormatter",value:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=r.language,a=void 0===n?"*":n;if("function"===!h(t)||"string"!=typeof e)throw new TypeError("Formatter must be a function");x(me).call(me,e)?this.formatters[a].$types[e]=t:this.formatters[a][e]=t}}]),o}(),Le={getInterpolatedVars:function(e){var t=[];return pe(e,(function(e,r,n){var a={name:e,formatters:w(r).call(r,(function(e){var t=v(e,2);return{name:t[0],args:t[1]}})),match:n};return-1===M(t).call(t,(function(e){return e.name===a.name&&a.formatters.toString()==e.formatters.toString()}))&&t.push(a),""})),t},replaceInterpolatedVars:ye,I18nManager:we,translate:function(e){var t=this,r=t.global.activeLanguage,n=e,a=[],o=[],s=null;if("string"===!h(e))return e;try{var i,l;if(2===arguments.length&&oe(arguments[1]))O(i=R(arguments[1])).call(i,(function(e){var t=v(e,2),r=t[0],n=t[1];if("function"==typeof n)try{a[r]=n()}catch(e){a[r]=n}E(r).call(r,"$")&&"number"==typeof a[r]&&o.push(r)})),a=[arguments[1]];else if(arguments.length>=2){var c,u;a=w(c=C(u=V(Array.prototype).call(arguments)).call(u,1)).call(c,(function(e,t){try{e="function"==typeof e?e():e,ae(e)&&(s=A(e))}catch(e){}return e}))}if(r===t.defaultLanguage)je(n)&&(n=t.default[n]||e);else{var f=je(n)?n:t.idMap[_e(n)];n=t.messages[f]||n,n=T(n)?w(n).call(n,(function(e){return xe(e)})):xe(n)}return T(n)&&n.length>0&&(n=null!==s?ke(n,s):pluralVar.length>0?ke(n,A(a(pluralVar[0]))):n[0]),0==a.length?n:ye.call.apply(ye,D(l=[t,n]).call(l,b(a)))}catch(e){return n}},i18nScope:le,defaultLanguageSettings:de,getDataTypeName:ne,isNumber:ae,isPlainObject:oe};export{Le 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 index 371a3de..beb865b 100644 --- a/packages/runtime/dist/index.esm.js.map +++ b/packages/runtime/dist/index.esm.js.map @@ -1 +1 @@ -{"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}","\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 // 主要用来缓存格式化器的引用,当使用格式化器时可以直接引用,避免检索\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 // 正在加载语言包标识\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 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 */\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 return \r\n }\r\n // 非默认语言需要异步加载语言包文件,加载器是一个异步函数\r\n // 如果没有加载器,则无法加载语言包,因此回退到默认语言\r\n const loader = this.loaders[newLanguage]\r\n if(typeof(loader) === \"function\"){\r\n try{\r\n this._messages = (await loader()).default\r\n this._activeLanguage = newLanguage\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 }else{\r\n this._fallback()\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 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 /**\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){\r\n // 通知所有作用域刷新到对应的语言包\r\n await this._refreshScopes(value)\r\n this._settings.activeLanguage = value\r\n /// 触发语言切换事件\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\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","options","results","_Object$assign","key","_Array$isArray","array","v","undefined","constructor","name","eventemitter","_callbacks","callback","_includesInstanceProperty","push","i","this","length","args","_Promise","allSettled","_mapInstanceProperty","cb","all","scope","_id","id","Date","getTime","toString","Math","random","_languages","languages","_defaultLanguage","defaultLanguage","_activeLanguage","activeLanguage","_default","_messages","messages","_idMap","idMap","_formatters","formatters","_loaders","loaders","_global","$cache","typedFormatters","_globalThis","VoerkaI18n","I18nManager","require$$0","global","_loading","register","then","formatter","language","TypeError","DataTypes","$types","newLanguage","resolve","loader","console","warn","_context3","message","_fallback","_bindInstanceProperty","on","off","offAll","change","getDataTypeName","isNumber","isPlainObject","EventEmitter","require$$1","i18nScope","require$$2","inlineFormatters","toLocaleString","time","toLocaleTimeString","shorttime","date","toLocaleDateString","dict","zh","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","shortime","shortdate","currency","en","varWithPipeRegexp","hasInterpolation","str","parseFormatters","result","substr","split","r","_trimInstanceProperty","firstIndex","_indexOfInstanceProperty","lastIndex","_lastIndexOfInstanceProperty","argsContent","arg","_startsWithInstanceProperty","_endsWithInstanceProperty","toLowerCase","String","JSON","parse","e","forEachInterpolatedVars","match","opts","replaceAll","exec","varname","groups","_replaceAllInstanceProperty","replace","resetScopeCache","buildFormatters","func","target","getFormatter","call","getFormattedValue","formatterFuncs","defaultFormatter","dataType","getDataTypeDefaultFormatter","error","executeFormatter","replaceInterpolatedVars","template","varValues","params","Error","defaultLanguageSettings","title","isMessageId","content","getPluraMessage","escape","unescape","settings","instance","_settings","_scopes","_findIndexInstanceProperty","lang","_refreshScopes","emit","scopeRefreshers","refresh","_context31","runtime","getInterpolatedVars","vars","varName","varItem","varDef","translate","pluralVars","pluraValue","arguments","index","msgId","pluralVar"],"mappings":"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"} \ No newline at end of file +{"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}","\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 // 主要用来缓存格式化器的引用,当使用格式化器时可以直接引用,避免检索\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 // 正在加载语言包标识\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 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 */\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 return \r\n }\r\n // 非默认语言需要异步加载语言包文件,加载器是一个异步函数\r\n // 如果没有加载器,则无法加载语言包,因此回退到默认语言\r\n const loader = this.loaders[newLanguage]\r\n if(typeof(loader) === \"function\"){\r\n try{\r\n this._messages = (await loader()).default\r\n this._activeLanguage = newLanguage\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 }else{\r\n this._fallback()\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 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 /**\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){\r\n // 通知所有作用域刷新到对应的语言包\r\n await this._refreshScopes(value)\r\n this._settings.activeLanguage = value\r\n /// 触发语言切换事件\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\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","options","results","_Object$assign","key","_Array$isArray","array","v","undefined","constructor","name","eventemitter","_callbacks","callback","_includesInstanceProperty","push","i","this","length","args","_Promise","allSettled","_mapInstanceProperty","cb","all","DataTypes","scope","_id","id","Date","getTime","toString","Math","random","_languages","languages","_defaultLanguage","defaultLanguage","_activeLanguage","activeLanguage","_default","_messages","messages","_idMap","idMap","_formatters","formatters","_loaders","loaders","_global","$cache","typedFormatters","_globalThis","VoerkaI18n","I18nManager","require$$0","global","_loading","register","then","formatter","language","TypeError","$types","newLanguage","resolve","loader","console","warn","_context3","message","_fallback","_bindInstanceProperty","on","off","offAll","change","getDataTypeName","isNumber","isPlainObject","EventEmitter","require$$1","i18nScope","require$$2","inlineFormatters","toLocaleString","time","toLocaleTimeString","shorttime","date","toLocaleDateString","dict","zh","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","shortime","shortdate","currency","en","varWithPipeRegexp","hasInterpolation","str","parseFormatters","result","substr","split","r","_trimInstanceProperty","firstIndex","_indexOfInstanceProperty","lastIndex","_lastIndexOfInstanceProperty","argsContent","arg","_startsWithInstanceProperty","_endsWithInstanceProperty","toLowerCase","String","JSON","parse","e","forEachInterpolatedVars","match","opts","replaceAll","exec","varname","groups","_replaceAllInstanceProperty","replace","resetScopeCache","buildFormatters","func","target","getFormatter","call","getFormattedValue","formatterFuncs","defaultFormatter","dataType","getDataTypeDefaultFormatter","error","executeFormatter","replaceInterpolatedVars","template","varValues","params","Error","defaultLanguageSettings","title","isMessageId","content","getPluraMessage","escape","unescape","settings","instance","_settings","_scopes","_findIndexInstanceProperty","lang","_refreshScopes","emit","scopeRefreshers","refresh","_context31","runtime","getInterpolatedVars","vars","varName","varItem","varDef","translate","pluralVars","pluraValue","arguments","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 index b5cb243..8e00732 100644 --- a/packages/runtime/dist/runtime.cjs +++ b/packages/runtime/dist/runtime.cjs @@ -121,6 +121,8 @@ var eventemitter = class EventEmitter{ } }; +const DataTypes$1 = ["String","Number","Boolean","Object","Array","Function","Null","Undefined","Symbol","Date","RegExp","Error"]; + var scope = class i18nScope { constructor(options={},callback){ // 每个作用域都有一个唯一的id @@ -187,7 +189,7 @@ var scope = class i18nScope { if(!typeof(formatter)==="function" || typeof(name)!=="string"){ throw new TypeError("Formatter must be a function") } - if(DataTypes.includes(name)){ + if(DataTypes$1.includes(name)){ this.formatters[language].$types[name] = formatter; }else { this.formatters[language][name] = formatter; @@ -325,7 +327,7 @@ let varWithPipeRegexp = /\{\s*(?\w+)?(?(\s*\|\s*\w*(\(.*\)) function hasInterpolation(str){ return str.includes("{") && str.includes("}") } -const DataTypes$1 = ["String","Number","Boolean","Object","Array","Function","Error","Symbol","RegExp","Date","Null","Undefined","Set","Map","WeakSet","WeakMap"]; +const DataTypes = ["String","Number","Boolean","Object","Array","Function","Error","Symbol","RegExp","Date","Null","Undefined","Set","Map","WeakSet","WeakMap"]; /** @@ -915,7 +917,7 @@ function translate(message) { if(!typeof(formatter)==="function" || typeof(name)!=="string"){ throw new TypeError("Formatter must be a function") } - if(DataTypes$1.includes(name)){ + if(DataTypes.includes(name)){ this.formatters[language].$types[name] = formatter; }else { this.formatters[language][name] = formatter; diff --git a/packages/runtime/dist/runtime.mjs b/packages/runtime/dist/runtime.mjs index 87c3c36..df91f86 100644 --- a/packages/runtime/dist/runtime.mjs +++ b/packages/runtime/dist/runtime.mjs @@ -119,6 +119,8 @@ var eventemitter = class EventEmitter{ } }; +const DataTypes$1 = ["String","Number","Boolean","Object","Array","Function","Null","Undefined","Symbol","Date","RegExp","Error"]; + var scope = class i18nScope { constructor(options={},callback){ // 每个作用域都有一个唯一的id @@ -185,7 +187,7 @@ var scope = class i18nScope { if(!typeof(formatter)==="function" || typeof(name)!=="string"){ throw new TypeError("Formatter must be a function") } - if(DataTypes.includes(name)){ + if(DataTypes$1.includes(name)){ this.formatters[language].$types[name] = formatter; }else { this.formatters[language][name] = formatter; @@ -323,7 +325,7 @@ let varWithPipeRegexp = /\{\s*(?\w+)?(?(\s*\|\s*\w*(\(.*\)) function hasInterpolation(str){ return str.includes("{") && str.includes("}") } -const DataTypes$1 = ["String","Number","Boolean","Object","Array","Function","Error","Symbol","RegExp","Date","Null","Undefined","Set","Map","WeakSet","WeakMap"]; +const DataTypes = ["String","Number","Boolean","Object","Array","Function","Error","Symbol","RegExp","Date","Null","Undefined","Set","Map","WeakSet","WeakMap"]; /** @@ -913,7 +915,7 @@ function translate(message) { if(!typeof(formatter)==="function" || typeof(name)!=="string"){ throw new TypeError("Formatter must be a function") } - if(DataTypes$1.includes(name)){ + if(DataTypes.includes(name)){ this.formatters[language].$types[name] = formatter; }else { this.formatters[language][name] = formatter; diff --git a/packages/runtime/package.json b/packages/runtime/package.json index b2cfcc1..2ed69f1 100644 --- a/packages/runtime/package.json +++ b/packages/runtime/package.json @@ -1,6 +1,6 @@ { "name": "@voerkai18n/runtime", - "version": "1.0.23", + "version": "1.0.24", "description": "Voerkai18n Runtime", "main": "./dist/index.cjs", "module": "dist/index.esm.js", @@ -35,5 +35,5 @@ "rollup-plugin-terser": "^7.0.2", "@voerkai18n/autopublish": "workspace:^1.0.2" }, - "lastPublish": "2022-04-15T17:44:08+08:00" + "lastPublish": "2022-04-16T09:12:02+08:00" } \ No newline at end of file diff --git a/packages/runtime/scope.js b/packages/runtime/scope.js index 04b2cc4..ee0413a 100644 --- a/packages/runtime/scope.js +++ b/packages/runtime/scope.js @@ -1,4 +1,7 @@ + +const DataTypes = ["String","Number","Boolean","Object","Array","Function","Null","Undefined","Symbol","Date","RegExp","Error"]; + module.exports = class i18nScope { constructor(options={},callback){ // 每个作用域都有一个唯一的id diff --git a/packages/utils/index.js b/packages/utils/index.js index ade256c..921f183 100644 --- a/packages/utils/index.js +++ b/packages/utils/index.js @@ -16,7 +16,8 @@ const fs = require("fs-extra") * debug:false,是否输出调试信息,当=true时,.test()方法返回[,pattern] * * }) * - * + * matcher.test("<文件名称>") 返回true/false + * * * * @param {*} patterns @@ -35,6 +36,9 @@ const fs = require("fs-extra") // 默认排除模式 if(defaultPatterns.length===0){ + finalPatterns.push([/__test__\/.*/,true]) + finalPatterns.push([/.*\/.*\.test\.js$/,true]) + finalPatterns.push([/node_modules\/.*/,true]) finalPatterns.push([/.*\/node_modules\/.*/,true]) finalPatterns.push([/.*\/languages\/.*/,true]) // 默认排除语言文件 finalPatterns.push([/\.babelrc/,true]) @@ -46,15 +50,21 @@ const fs = require("fs-extra") inputPatterns.forEach(pattern=>{ if(typeof pattern === "string"){ - pattern.replaceAll("**",".*") - pattern.replaceAll("?","[^\/]?") - pattern.replaceAll(/(? { + shelljs.exec("pnpm add -g @voerkai18n/utils") + shelljs.exec("pnpm add -g @voerkai18n/runtime ") + shelljs.exec("pnpm add -g @voerkai18n/cli ") shelljs.exec("pnpm update -g @voerkai18n/utils") shelljs.exec("pnpm update -g @voerkai18n/runtime ") shelljs.exec("pnpm update -g @voerkai18n/cli ")