From 73794587c3e8c7c69e9245d0d0db6e21909f0a59 Mon Sep 17 00:00:00 2001 From: wxzhang Date: Tue, 16 Aug 2022 21:23:03 +0800 Subject: [PATCH] update formatters --- packages/runtime/index.js | 46 ++++++++++++++++++++++----------------- test/translate.test.js | 14 +++++------- 2 files changed, 32 insertions(+), 28 deletions(-) diff --git a/packages/runtime/index.js b/packages/runtime/index.js index 88ffed5..b4633c0 100644 --- a/packages/runtime/index.js +++ b/packages/runtime/index.js @@ -319,12 +319,10 @@ function executeChecker(checker,value){ function executeFormatter(value,formatters,scope,template){ if(formatters.length===0) return value let result = value - - const emptyChecker = formatters.find(func=>func.$name==='empty') - const errorChecker = formatters.find(func=>func.$name==='error') - // 1. 空值检查 - if(emptyChecker){ + const emptyCheckerIndex = formatters.findIndex(func=>func.$name==='empty') + if(emptyCheckerIndex!=-1){ + const emptyChecker = formatters.splice(emptyCheckerIndex,1)[0] const { value,next } = executeChecker(emptyChecker,result) if(next == 'break') { return value @@ -333,15 +331,21 @@ function executeFormatter(value,formatters,scope,template){ } } // 2. 错误检查 - if((result instanceof Error) && errorChecker){ - result.formatter = formatter.$name - const { value,next } = executeChecker(emptyChecker,result) - if(next == 'break') { - return value - }else{ - result = value - } + const errorCheckerIndex = formatters.findIndex(func=>func.$name==='error') + let errorChecker + if(errorCheckerIndex!=-1){ + errorChecker = formatters.splice(errorCheckerIndex,1)[0] + if(result instanceof Error){ + result.formatter = formatter.$name + const { value,next } = executeChecker(errorChecker,result) + if(next == 'break') { + return value + }else{ + result = value + } + } } + // 3. 分别执行格式化器函数 for(let formatter of formatters){ try{ @@ -349,12 +353,14 @@ function executeFormatter(value,formatters,scope,template){ }catch(e){ e.formatter = formatter.$name if(scope.debug) console.error(`Error while execute i18n formatter<${formatter.$name}> for ${template}: ${e.message} ` ) - const { value,next } = executeChecker(errorChecker,result) - if(next=="break"){ - if(value!==undefined) result = value - break - }else if(next=="skip"){ - continue + if(isFunction(errorChecker)){ + const { value,next } = executeChecker(errorChecker,result) + if(next=="break"){ + if(value!==undefined) result = value + break + }else if(next=="skip"){ + continue + } } } } @@ -406,7 +412,7 @@ function wrapperFormatters(scope,activeLanguage,formatters){ // 格式化器无效或者没有定义时,查看当前值是否具有同名的原型方法,如果有则执行调用 // 比如padStart格式化器是String的原型方法,不需要配置就可以直接作为格式化器调用 if(!isFunction(fn)){ - fn = (value,...args) =>{ + fn = (value) =>{ if(isFunction(value[name])){ return value[name](...args) }else{ diff --git a/test/translate.test.js b/test/translate.test.js index 51e4f89..743e215 100644 --- a/test/translate.test.js +++ b/test/translate.test.js @@ -179,12 +179,12 @@ test("位置插值翻译文本内容",async ()=>{ expect(t("1")).toBe("你好"); expect(t("2",now)).toBe(`现在是${dayjs(now).format('YYYY年MM月DD日 HH点mm分ss秒')}`); - await scope.change("en") -.eixt + await scope.change("en") + expect(t("你好")).toBe("hello"); - expect(t("现在是{}",now)).toBe(`Now is ${dayjs(now).format('YYYY-MM-DD HH:mm:ss')}`); + expect(t("现在是{}",now)).toBe(`Now is ${dayjs(now).format('YYYY/MM/DD HH:mm:ss')}`); expect(t("1")).toBe("hello"); - expect(t("2",now)).toBe(`Now is ${dayjs(now).format('YYYY-MM-DD HH:mm:ss')}`); + expect(t("2",now)).toBe(`Now is ${dayjs(now).format('YYYY/MM/DD HH:mm:ss')}`); }) test("命名插值翻译文本内容",async ()=>{ @@ -194,10 +194,9 @@ test("命名插值翻译文本内容",async ()=>{ await scope.change("en") expect(t("你好")).toBe("hello"); - expect(t("现在是{}",now)).toBe(`Now is ${dayjs(now).format('YYYY-MM-DD HH:mm:ss')}`); + expect(t("现在是{}",now)).toBe(`Now is ${dayjs(now).format('YYYY/MM/DD HH:mm:ss')}`); expect(t("1")).toBe("hello"); - expect(t("2",now)).toBe(`Now is ${dayjs(now).format('YYYY-MM-DD HH:mm:ss')}`); - done() + expect(t("2",now)).toBe(`Now is ${dayjs(now).format('YYYY/MM/DD HH:mm:ss')}`); }) @@ -222,6 +221,5 @@ test("翻译复数支持",async ()=>{ expect(t("我有{}个朋友",2)).toBe("I have two friends"); expect(t("我有{}个朋友",3)).toBe("I have 3 friends"); expect(t("我有{}个朋友",4)).toBe("I have 4 friends"); - done() }) \ No newline at end of file