1 line
61 KiB
Plaintext
1 line
61 KiB
Plaintext
{"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;i<this._callbacks.length;i++){\r\n if(this._callbacks[i]===callback ){\r\n this._callbacks.splice(i,1)\r\n }\r\n }\r\n }\r\n offAll(){\r\n this._callbacks = []\r\n }\r\n async emit(...args){\r\n if(Promise.allSettled){\r\n await Promise.allSettled(this._callbacks.map(cb=>cb(...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 || \"cn\" // 默认语言名称\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*(?<varname>\\w+)?(?<formatters>(\\s*\\|\\s*\\w*\\s*)*)\\s*\\}/g\r\n\r\n// 支持参数: { var | formatter(x,x,..) | formatter }\r\nlet varWithPipeRegexp = /\\{\\s*(?<varname>\\w+)?(?<formatters>(\\s*\\|\\s*\\w*(\\(.*\\)){0,1}\\s*)*)\\s*\\}/g\r\n\r\n// 有效的语言名称列表\r\nconst languages = [\"af\",\"am\",\"ar-dz\",\"ar-iq\",\"ar-kw\",\"ar-ly\",\"ar-ma\",\"ar-sa\",\"ar-tn\",\"ar\",\"az\",\"be\",\"bg\",\"bi\",\"bm\",\"bn\",\"bo\",\"br\",\"bs\",\"ca\",\"cs\",\"cv\",\"cy\",\"da\",\"de-at\",\"de-ch\",\"de\",\"dv\",\"el\",\"en-au\",\"en-ca\",\"en-gb\",\"en-ie\",\"en-il\",\"en-in\",\"en-nz\",\"en-sg\",\"en-tt\",\"en\",\"eo\",\"es-do\",\"es-mx\",\"es-pr\",\"es-us\",\"es\",\"et\",\"eu\",\"fa\",\"fi\",\"fo\",\"fr-ca\",\"fr-ch\",\"fr\",\"fy\",\"ga\",\"gd\",\"gl\",\"gom-latn\",\"gu\",\"he\",\"hi\",\"hr\",\"ht\",\"hu\",\"hy-am\",\"id\",\"is\",\"it-ch\",\"it\",\"ja\",\"jv\",\"ka\",\"kk\",\"km\",\"kn\",\"ko\",\"ku\",\"ky\",\"lb\",\"lo\",\"lt\",\"lv\",\"me\",\"mi\",\"mk\",\"ml\",\"mn\",\"mr\",\"ms-my\",\"ms\",\"mt\",\"my\",\"nb\",\"ne\",\"nl-be\",\"nl\",\"nn\",\"oc-lnc\",\"pa-in\",\"pl\",\"pt-br\",\"pt\",\"ro\",\"ru\",\"rw\",\"sd\",\"se\",\"si\",\"sk\",\"sl\",\"sq\",\"sr-cyrl\",\"sr\",\"ss\",\"sv-fi\",\"sv\",\"sw\",\"ta\",\"te\",\"tet\",\"tg\",\"th\",\"tk\",\"tl-ph\",\"tlh\",\"tr\",\"tzl\",\"tzm-latn\",\"tzm\",\"ug-cn\",\"uk\",\"ur\",\"uz-latn\",\"uz\",\"vi\",\"x-pseudo\",\"yo\",\"zh-cn\",\"zh-hk\",\"zh-tw\",\"zh\"]\r\n\r\n\r\n// 插值变量字符串替换正则\r\n\r\n//let varReplaceRegexp =String.raw`\\{\\s*(?<var>{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 [[<formatterName>,[<arg>,<arg>,...]]]\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 // 解析格式化器和参数 = [<formatterName>,[<formatterName>,[<arg>,<arg>,...]]]\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 cn:{ \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: \"cn\",\r\n activeLanguage: \"cn\",\r\n languages:[\r\n {name:\"cn\",title:\"中文\",default:true},\r\n {name:\"en\",title:\"英文\"}\r\n ],\r\n formatters\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=默认语言包={<id>:<message>}\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:\"cn\"}) // 适用于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 languages,\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,<value1>,<result1>,<value2>,<result1>,<value3>,<result1>,...)\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;i<args.length;i+=2){\r\n if(args[i]===value){\r\n return args[i+1]\r\n }\r\n }\r\n if(args.length >0 && (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 cn:{ \r\n $types:{\r\n Date:(value)=> `${value.getFullYear()}年${value.getMonth()+1}月${value.getDate()}日 ${value.getHours()}点${value.getMinutes()}分${value.getSeconds()}秒`\r\n },\r\n shortime:(value)=> value.toLocaleTimeString(), \r\n time:(value)=>`${value.getHours()}点${value.getMinutes()}分${value.getSeconds()}秒`, \r\n date: (value)=> `${value.getFullYear()}年${value.getMonth()+1}月${value.getDate()}日`,\r\n shortdate: (value)=> `${value.getFullYear()}-${value.getMonth()+1}-${value.getDate()}`,\r\n currency:(value)=>`${value}元`,\r\n },\r\n en:{\r\n currency:(value)=>{\r\n return `$${value}`\r\n }\r\n }\r\n}"],"names":["utils","obj","_typeof","proto","_Object$getPrototypeOf","baseProto","value","isNaN","_parseInt","deepMerge","toObj","formObj","_context","options","results","_Object$assign","_ref","_ref2","_slicedToArray","key","_Array$isArray","array","_context2","_concatInstanceProperty","call","_toConsumableArray","_context3","_Set","v","undefined","constructor","name","eventemitter","EventEmitter","_classCallCheck","this","_callbacks","_emit","_createClass","callback","_includesInstanceProperty","push","i","length","_spliceInstanceProperty","_asyncToGenerator","_regeneratorRuntime","mark","_callee","_len","args","_key","_context4","_args","arguments","wrap","_context5","prev","next","Array","_Promise","allSettled","_mapInstanceProperty","cb","apply","all","stop","scope","i18nScope","_id","id","Date","getTime","toString","Math","random","_languages","languages","_defaultLanguage","defaultLanguage","_activeLanguage","activeLanguage","_default","_messages","messages","_idMap","idMap","_formatters","formatters","_loaders","loaders","_global","$cache","typedFormatters","_globalThis","VoerkaI18n","I18nManager","require$$0","global","_loading","register","_refresh","get","set","then","formatter","_ref$language","language","TypeError","DataTypes","$types","newLanguage","loader","resolve","abrupt","sent","t0","console","warn","message","_fallback","_x","_bindInstanceProperty","on","off","_context6","offAll","_context7","change","getDataTypeName","isNumber","isPlainObject","require$$1","require$$2","inlineFormatters","toLocaleString","time","toLocaleTimeString","shorttime","date","toLocaleDateString","dict","cn","concat","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","shortime","_context8","_context9","shortdate","_context10","_context11","currency","en","varWithPipeRegexp","varname","hasInterpolation","str","_String$raw","_templateObject","_taggedTemplateLiteral","parseFormatters","result","_trimInstanceProperty","substr","split","r","firstIndex","_indexOfInstanceProperty","lastIndex","_lastIndexOfInstanceProperty","argsContent","arg","_startsWithInstanceProperty","_endsWithInstanceProperty","toLowerCase","String","JSON","parse","e","forEachInterpolatedVars","match","opts","replaceAll","exec","groups","_replaceAllInstanceProperty","replace","_unused","resetScopeCache","buildFormatters","_step2","_iterator2","_createForOfIteratorHelper","_loop","func","_i2","_targets2","target","getFormatter","_v$formatter$","s","n","done","err","f","getFormattedValue","formatterFuncs","defaultFormatter","dataType","_i","_targets","getDataTypeDefaultFormatter","_step","_iterator","error","executeFormatter","replaceInterpolatedVars","template","varValues","params","Error","defaultLanguageSettings","title","default","isMessageId","content","getPluraMessage","_unused2","escape","_context12","_context13","_context14","_context15","unescape","_context16","_context17","_context18","_context19","_context20","_context21","_context22","_context23","_register","_refreshScopes2","_change","_this2","settings","_super2","instance","_assertThisInitialized","_settings","_scopes","_context28","_context29","_findIndexInstanceProperty","lang","_refreshScopes","emit","_callee2","_context30","scopeRefreshers","_context31","refresh","_callee3","_context32","_ref5","_ref5$language","runtime","getInterpolatedVars","vars","varName","varItem","varDef","translate","pluralVars","pluraValue","_context24","_context27","_forEachInstanceProperty","_Object$entries","_ref3","_ref4","_context25","_context26","_sliceInstanceProperty","prototype","index","msgId","pluralVar"],"mappings":"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"} |