diff --git a/packages/apps/vueapp/src/components/formatters.vue b/packages/apps/vueapp/src/components/formatters.vue index f4722c5..fde90b7 100644 --- a/packages/apps/vueapp/src/components/formatters.vue +++ b/packages/apps/vueapp/src/components/formatters.vue @@ -12,38 +12,53 @@ export default { components: { China }, data() { return { - date1: new Date(), - date2: "2022/12/3 19:08:12", - date3: 1659872118897, + NOW: null//new Date() } } } diff --git a/packages/apps/vueapp/src/languages/en.js b/packages/apps/vueapp/src/languages/en.js index 3d30cae..5f91453 100644 --- a/packages/apps/vueapp/src/languages/en.js +++ b/packages/apps/vueapp/src/languages/en.js @@ -24,6 +24,9 @@ export default { "23": "Now is { value | millisecond }", "24": "Now is { value | timestamp }", "25": "Price: { value | currency }", - "26": "Price: { value | currency(\"==", - "27": "Price: { value | capitalizeCurrency }" + "26": "Price: { value | capitalizeCurrency }", + "27": "Now is { value }", + "28": "Price: { value | currency('CNY','元整',3)}", + "29": "Price:{ value | capitalizeCurrency(true) }", + "30": "Count: { value | number }" } \ No newline at end of file diff --git a/packages/apps/vueapp/src/languages/idMap.js b/packages/apps/vueapp/src/languages/idMap.js index a5a6e00..a0384d5 100644 --- a/packages/apps/vueapp/src/languages/idMap.js +++ b/packages/apps/vueapp/src/languages/idMap.js @@ -24,6 +24,9 @@ export default { "现在是{ value | millisecond }": 23, "现在是{ value | timestamp }": 24, "商品价格:{ value | currency }": 25, - "商品价格:{ value | currency(\"==": 26, - "商品价格:{ value | capitalizeCurrency }": 27 + "商品价格:{ value | capitalizeCurrency }": 26, + "现在是{ value }": 27, + "商品价格:{ value | currency('CNY','元整',3)}": 28, + "商品价格:{ value | capitalizeCurrency(true) }": 29, + "商品数量:{ value | number }": 30 } \ No newline at end of file diff --git a/packages/apps/vueapp/src/languages/index.js b/packages/apps/vueapp/src/languages/index.js index 15a6eea..f05eeb9 100644 --- a/packages/apps/vueapp/src/languages/index.js +++ b/packages/apps/vueapp/src/languages/index.js @@ -13,11 +13,11 @@ const scopeSettings = { "languages": [ { "name": "zh", - "title": "zh" + "title": "中文" }, { "name": "en", - "title": "en" + "title": "英文" } ], "defaultLanguage": "zh", @@ -28,7 +28,7 @@ const scopeSettings = { // 语言作用域 const scope = new i18nScope({ ...scopeSettings, // languages,defaultLanguage,activeLanguage,namespaces,formatters - id: "vueapp", // 当前作用域的id,自动取当前工程的package.json的name + id: "vueapp", // 当前作用域的id,自动取当前工程的package.json的name default: defaultMessages, // 默认语言包 messages : activeMessages, // 当前语言包 idMap:messageIds, // 消息id映射列表 diff --git a/packages/apps/vueapp/src/languages/settings.json b/packages/apps/vueapp/src/languages/settings.json index 9086f99..3984231 100644 --- a/packages/apps/vueapp/src/languages/settings.json +++ b/packages/apps/vueapp/src/languages/settings.json @@ -2,11 +2,11 @@ "languages": [ { "name": "zh", - "title": "zh" + "title": "中文" }, { "name": "en", - "title": "en" + "title": "英文" } ], "defaultLanguage": "zh", diff --git a/packages/apps/vueapp/src/languages/translates/default.json b/packages/apps/vueapp/src/languages/translates/default.json index 383a115..ef29d94 100644 --- a/packages/apps/vueapp/src/languages/translates/default.json +++ b/packages/apps/vueapp/src/languages/translates/default.json @@ -149,16 +149,34 @@ "components\\formatters.vue" ] }, - "商品价格:{ value | currency(\"==": { - "en": "Price: { value | currency(\"==", - "$file": [ - "components\\formatters.vue" - ] - }, "商品价格:{ value | capitalizeCurrency }": { "en": "Price: { value | capitalizeCurrency }", "$file": [ "components\\formatters.vue" ] + }, + "现在是{ value }": { + "en": "Now is { value }", + "$file": [ + "components\\formatters.vue" + ] + }, + "商品价格:{ value | currency('CNY','元整',3)}": { + "en": "Price: { value | currency('CNY','元整',3)}", + "$file": [ + "components\\formatters.vue" + ] + }, + "商品价格:{ value | capitalizeCurrency(true) }": { + "en": "Price:{ value | capitalizeCurrency(true) }", + "$file": [ + "components\\formatters.vue" + ] + }, + "商品数量:{ value | number }": { + "en": "Count: { value | number }", + "$file": [ + "components\\formatters.vue" + ] } } \ No newline at end of file diff --git a/packages/runtime/formatters/en.js b/packages/runtime/formatters/en.js index 4650d38..9a5a775 100644 --- a/packages/runtime/formatters/en.js +++ b/packages/runtime/formatters/en.js @@ -22,7 +22,7 @@ day : value => toDate(value).getDate(), weekdayValue : value => toDate(value).getDay(), weekday : value => ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"][toDate(value).getDay()], - shortWeekday : value => ["Sun", "Mon", "Tues", "Wednes", "Thurs", "Fri", "Satur"][toDate(value).getDay()], + shortWeekday : value => ["Sun", "Mon", "Tues", "Wed", "Thur", "Fri", "Sat"][toDate(value).getDay()], monthName : value => ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"][toDate(value).getMonth()], shorMonthName : value => ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"][toDate(value).getMonth()], // 时间 @@ -34,7 +34,7 @@ timestamp : value => toDate(value).getTime(), // 货币 // 常规货币形式 $111,233.33 - currency: (value, prefix = "$",suffix="", division = 3,precision = 2) => toCurrency(value, { division, prefix, precision,suffix }), + currency : (value, prefix = "$",suffix="", division = 3,precision = 2) => toCurrency(value, { division, prefix, precision,suffix }), // 数字,如,使用分割符 - number: (value, division = 3,precision = 0) => toCurrency(value, { division, precision}) + number : (value, division = 3,precision = 0) => toCurrency(value, { division, precision}) } \ No newline at end of file diff --git a/packages/runtime/formatters/zh.js b/packages/runtime/formatters/zh.js index 5559341..771897e 100644 --- a/packages/runtime/formatters/zh.js +++ b/packages/runtime/formatters/zh.js @@ -14,7 +14,7 @@ module.exports = {// 简体中文 // 日期 date : value => `${value.getFullYear()}年${value.getMonth() + 1}月${value.getDate()}日`, weekday : value => CN_WEEK_DAYS[toDate(value).getDay()], - shortWeekDay : value => CN_SHORT_WEEK_DAYS[toDate(value).getDay()], + shortWeekday : value => CN_SHORT_WEEK_DAYS[toDate(value).getDay()], monthName : value => CN_MONTH_NAMES[toDate(value).getMonth()], shorMonthName: value => CN_SHORT_MONTH_NAMES[toDate(value).getMonth()], // 时间 diff --git a/packages/runtime/index.js b/packages/runtime/index.js index d741f77..a70611e 100644 --- a/packages/runtime/index.js +++ b/packages/runtime/index.js @@ -285,19 +285,19 @@ function getFormatter(scope,activeLanguage,name){ * @param {*} value * @param {*} formatters 多个格式化器顺序执行,前一个输出作为下一个格式化器的输入 */ -function executeFormatter(value,formatters){ +function executeFormatter(value,formatters,scope){ if(formatters.length===0) return value let result = value try{ for(let formatter of formatters){ if(typeof(formatter) === "function") { - result = formatter(result) + result = formatter.call(scope,result) }else{// 如果碰到无效的格式化器,则跳过过续的格式化器 return result } } }catch(e){ - console.error(`Error while execute i18n formatter for ${value}: ${e.message} ` ) + //console.error(`Error while execute i18n formatter for ${value}: ${e.message} ` ) } return result } @@ -308,11 +308,6 @@ function executeFormatter(value,formatters){ * 将 [[格式化器名称,[参数,参数,...]],[格式化器名称,[参数,参数,...]]]格式化器转化为 * 格式化器的调用函数链 * - * - * - * - * - * * @param {*} scope * @param {*} activeLanguage * @param {*} formatters @@ -363,7 +358,7 @@ function getFormattedValue(scope,activeLanguage,formatters,value){ formatterFuncs.splice(0,0,defaultFormatter) } // 3. 执行格式化器 - value = executeFormatter(value,formatterFuncs) + value = executeFormatter(value,formatterFuncs,scope) return value } @@ -432,6 +427,9 @@ const defaultLanguageSettings = { datetime:{ }, + currency:{ + + } } function isMessageId(content){ @@ -501,9 +499,6 @@ function translate(message) { }) } - - - // 3. 取得翻译文本模板字符串 if(activeLanguage === scope.defaultLanguage){ diff --git a/packages/runtime/scope.js b/packages/runtime/scope.js index 37dc7bb..1b90ee1 100644 --- a/packages/runtime/scope.js +++ b/packages/runtime/scope.js @@ -32,11 +32,11 @@ module.exports = class i18nScope { languages: options.languages, }) } - this.global = globalThis.VoerkaI18n + this._global = globalThis.VoerkaI18n this._mergePatchedMessages() this._patch(this._messages,this.activeLanguage) // 正在加载语言包标识 - this._loading=false + this._refreshing=false // 在全局注册作用域 this.register(callback) } @@ -60,7 +60,6 @@ module.exports = class i18nScope { get loaders(){return this._loaders} // 引用全局VoerkaI18n配置,注册后自动引用 get global(){return this._global} - set global(value){this._global = value} /** * 在全局注册作用域 * @param {*} callback 注册成功后的回调 @@ -102,10 +101,14 @@ module.exports = class i18nScope { registerDefaultLoader(fn){ this.global.registerDefaultLoader(fn) } + _getLanguage(lang){ + let index = this._languages.findIndex(lng=>lng.name==lang) + if(index!==-1) return this._languages[index] + } /** * 回退到默认语言 */ - _fallback(){ + _fallback(newLanguage){ this._messages = this._default this._activeLanguage = this.defaultLanguage } @@ -114,7 +117,7 @@ module.exports = class i18nScope { * @param {*} newLanguage */ async refresh(newLanguage){ - this._loading = Promise.resolve() + this._refreshing = true if(!newLanguage) newLanguage = this.activeLanguage // 默认语言,默认语言采用静态加载方式,只需要简单的替换即可 if(newLanguage === this.defaultLanguage){ @@ -131,7 +134,8 @@ module.exports = class i18nScope { this._activeLanguage = newLanguage await this._patch(this._messages,newLanguage) }else if(typeof(this.global.defaultMessageLoader) === "function"){// 如果该语言没有指定加载器,则使用全局配置的默认加载器 - this._messages = await this.global.loadMessagesFromDefaultLoader(newLanguage,this) + const loadedMessages = await this.global.loadMessagesFromDefaultLoader(newLanguage,this) + this._messages = Object.assign({},this._default,loadedMessages) this._activeLanguage = newLanguage }else{ this._fallback() @@ -139,6 +143,8 @@ module.exports = class i18nScope { }catch(e){ console.warn(`Error while loading language <${newLanguage}> on i18nScope(${this.id}): ${e.message}`) this._fallback() + }finally{ + this._refreshing = false } } /** diff --git a/packages/runtime/utils.js b/packages/runtime/utils.js index c7f1af1..f0f6651 100644 --- a/packages/runtime/utils.js +++ b/packages/runtime/utils.js @@ -41,6 +41,19 @@ return false } } +/** + * 当value= null || undefined || "" || [] || {} 时返回true + * @param {*} value + * @returns + */ +function isNothing(value){ + if(["boolean","function"].includes(typeof(value))) return false + if(value=="") return true + if(value==undefined) return true + if(Array.isArray(value) && value.length==0) return true + if(typeof(value)=="object" && Object.keys(value).length==0) return true + return false +} /** * 深度合并对象 @@ -172,6 +185,7 @@ function relativeTime(value, rel){ module.exports ={ isPlainObject, isNumber, + isNothing, deepMerge, deepMixin, getDataTypeName,