const {i18nScope, translate, getInterpolatedVars } = require('../packages/runtime/dist/runtime.cjs') const dayjs = require('dayjs'); function toLanguageDict(values,startIndex=0){ return values.reduce((result,curValue,i)=>{ result[i+startIndex] = curValue; return result },{}) } function toLanguageIdMap(values,startIndex=0){ return values.reduce((result,curValue,i)=>{ result[curValue] = i+startIndex return result },{}) } // 显示两个数组哪一行不同 function diffArray(arr1,arr2){ let diffs = [] arr1.forEach((v,i)=>{ if(v!=arr2[i]) diffs.push([i,[v,arr2[i]]]) }) return diffs } const NOW = new Date("2022/08/12 10:12:36") const zhDatetimes =[ "现在是{ value }", "现在是{ value | date }", "现在是{ value | date('local') }", "现在是{ value | date('long') }", "现在是{ value | date('short') }", "现在是{ value | date('iso') }", "现在是{ value | date('gmt') }", "现在是{ value | date('utc') }", "现在是{ value | date('YYYY-MM-DD HH:mm:ss')}", "现在是{ value | date('YYYY-MM-DD')}", "现在是{ value | date('HH:mm:ss')}", "现在是{ value | month }", "现在是{ value | month('long')}", "现在是{ value | month('short')}", "现在是{ value | month('number')}", "现在是{ value | weekday }", "现在是{ value | weekday('long')}", "现在是{ value | weekday('short')}", "现在是{ value | weekday('number')}", "现在是{ value | quarter }", "现在是{ value | quarter('long')}", "现在是{ value | quarter('short')}", "现在是{ value | quarter('number')}", // 时间 "现在时间 - { value | time }", "现在时间 - { value | time('local') }", "现在时间 - { value | time('long') }", "现在时间 - { value | time('short') }", "现在时间 - { value | time('timestamp') }", "现在时间 - { value | time('HH:mm:ss') }", "现在时间 - { value | time('mm:ss') }", "现在时间 - { value | time('ss') }" ] // const expectZhDatetimes =[ "现在是2022/8/12 10:12:36", // { value } "现在是2022/8/12 10:12:36", // { value | date } `现在是${NOW.toLocaleString()}`, // { value | date('local') } "现在是2022年08月12日 10点12分36秒", // { value | date('long') } "现在是2022/08/12", // { value | date('short') } `现在是${NOW.toISOString()}`, // { value | date('iso') } `现在是${NOW.toGMTString()}`, // { value | date('gmt') } `现在是${NOW.toUTCString()}`, // { value | date('utc') } "现在是2022-08-12 10:12:36", // { value | date('YYYY-MM-DD HH:mm:ss')} "现在是2022-08-12", // { value | date('YYYY-MM-DD')} "现在是10:12:36", // { value | date('HH:mm:ss')} "现在是八月", // { value | month } "现在是八月", // { value | month('long')} "现在是8月", // { value | month('short')} "现在是8", // { value | month('number')} "现在是星期五", // { value | weekday } "现在是星期五", // { value | weekday('long')} "现在是周五", // { value | weekday('short')} "现在是5", // { value | weekday('number')} "现在是Q3", // { value | quarter } "现在是三季度", // { value | quarter('long')} "现在是Q3", // { value | quarter('short')} "现在是3", // { value | quarter('number')} // 时间 `现在时间 - ${NOW.toLocaleTimeString()}`, // { value | time } `现在时间 - ${NOW.toLocaleTimeString()}`, // { value | time('local') } "现在时间 - 10点12分36秒", // { value | time('long') } "现在时间 - 10:12:36", // { value | time('short') } "现在时间 - 1660270356000", // { value | time('timestamp') } "现在时间 - 10:12:36", // { value | time('HH:mm:ss') } "现在时间 - 12:36", // { value | time('mm:ss') } "现在时间 - 36", // { value | time('ss') }" ] const enDatetimes =[ "Now is { value }", "Now is { value | date }", "Now is { value | date('local') }", "Now is { value | date('long') }", "Now is { value | date('short') }", "Now is { value | date('iso') }", "Now is { value | date('gmt') }", "Now is { value | date('utc') }", "Now is { value | date('YYYY-MM-DD HH:mm:ss')}", "Now is { value | date('YYYY-MM-DD')}", "Now is { value | date('HH:mm:ss')}", "Now is { value | month }", "Now is { value | month('long')}", "Now is { value | month('short')}", "Now is { value | month('number')}", "Now is { value | weekday }", "Now is { value | weekday('long')}", "Now is { value | weekday('short')}", "Now is { value | weekday('number')}", "Now is { value | quarter }", "Now is { value | quarter('long')}", "Now is { value | quarter('short')}", "Now is { value | quarter('number')}", // 时间 "Now time: { value | time }", "Now time: { value | time('local') }", "Now time: { value | time('long') }", "Now time: { value | time('short') }", "Now time: { value | time('timestamp') }", "Now time: { value | time('HH:mm:ss') }", "Now time: { value | time('mm:ss') }", "Now time: { value | time('ss') }" ] const expectEnDatetimes =[ "Now is 2022/8/12 10:12:36", // { value } "Now is 2022/8/12 10:12:36", // { value | date } `Now is ${NOW.toLocaleString()}`, // { value | date('local') } "Now is 2022/08/12 10:12:36", // { value | date('long') } "Now is 2022/08/12", // { value | date('short') } `Now is ${NOW.toISOString()}`, // { value | date('iso') } `Now is ${NOW.toGMTString()}`, // { value | date('gmt') } `Now is ${NOW.toUTCString()}`, // { value | date('utc') } "Now is 2022-08-12 10:12:36", // { value | date('YYYY-MM-DD HH:mm:ss')} "Now is 2022-08-12", // { value | date('YYYY-MM-DD')} "Now is 10:12:36", // { value | date('HH:mm:ss')} "Now is August", // { value | month } "Now is August", // { value | month('long')} "Now is Aug", // { value | month('short')} "Now is 8", // { value | month('number')} "Now is Friday", // { value | weekday } "Now is Friday", // { value | weekday('long')} "Now is Fri", // { value | weekday('short')} "Now is 5", // { value | weekday('number')} "Now is Q3", // { value | quarter } "Now is Third Quarter", // { value | quarter('long')} "Now is Q3", // { value | quarter('short')} "Now is 3", // { value | quarter('number')} // 时间 `Now time: ${NOW.toLocaleTimeString()}`, // { value | time } `Now time: ${NOW.toLocaleTimeString()}`, // { value | time('local') } "Now time: 10:12:36", // { value | time('long') } "Now time: 10:12:36", // { value | time('short') } "Now time: 1660270356000", // { value | time('timestamp') } "Now time: 10:12:36", // { value | time('HH:mm:ss') } "Now time: 12:36", // { value | time('mm:ss') } "Now time: 36", // { value | time('ss') }" ] const MONEY = 123456789.88 const zhMoneys = [ "商品价格: { value | currency}", // 默认格式 // long "商品价格: { value | currency('long')}", // 长格式 "商品价格: { value | currency('long',1)}", // 长格式: 万元 "商品价格: { value | currency('long',2)}", // 长格式: 亿 "商品价格: { value | currency('long',3)}", // 长格式: 万亿 "商品价格: { value | currency('long',4)}", // 长格式: 万万亿 // short "商品价格: { value | currency('short')}", // 短格式 "商品价格: { value | currency('short',1)}", // 短格式 Thousands "商品价格: { value | currency('short',2)}", // 短格式 Millions "商品价格: { value | currency('short',3)}", // 短格式 Billions "商品价格: { value | currency('short',4)}", // 短格式 Trillions // 自定义货币格式 "商品价格: { value | currency({symbol:'¥¥'})}", "商品价格: { value | currency({symbol:'¥¥',prefix:'人民币:'})}", "商品价格: { value | currency({symbol:'¥¥',prefix:'人民币:',suffix:'元整'})}", "商品价格: { value | currency({symbol:'¥¥',prefix:'人民币:',suffix:'元整',unit:2})}", "商品价格: { value | currency({symbol:'¥¥',prefix:'人民币:',suffix:'元整',unit:2,precision:4})}", "商品价格: { value | currency({symbol:'¥¥',prefix:'人民币:',suffix:'元整',unit:2,precision:4,format:'{prefix}*{symbol}*{value}*{unit}*{suffix}'})}" ] const expectZhMoneys =[ "商品价格: ¥1,2345,6789.88", // { value | currency } // long "商品价格: RMB ¥1,2345,6789.88元", // { value | currency('long')} "商品价格: RMB ¥1,2345.678988万元", // { value | currency('long',1)} "商品价格: RMB ¥1.2345678988亿元", // { value | currency('long',2)} "商品价格: RMB ¥0.00012345678988万亿元", // { value | currency('long',3)} "商品价格: RMB ¥0.000000012345678988万万亿元", // { value | currency('long',4)} // short "商品价格: ¥1,2345,6789.88", // { value | currency('short')} "商品价格: ¥1,2345.678988万", // { value | currency('short',1)} "商品价格: ¥1.2345678988亿", // { value | currency('short',2)} "商品价格: ¥0.00012345678988万亿", // { value | currency('short',3)} "商品价格: ¥0.000000012345678988万万亿", // { value | currency('short',4)} // 自定义货币格式 "商品价格: RMB ¥¥1,2345,6789.88元", "商品价格: 人民币: ¥¥1,2345,6789.88元", "商品价格: 人民币: ¥¥1,2345,6789.88元整", "商品价格: 人民币: ¥¥1.2345678988亿元整", "商品价格: 人民币: ¥¥1.2346+亿元整", "商品价格: 人民币:*¥¥*1.2346+*亿*元整" ] const enMoneys = [ "Price: { value | currency }", // 默认格式 // long "Price: { value | currency('long') }", // 长格式 "Price: { value | currency('long',1) }", // 长格式: 万元 "Price: { value | currency('long',2) }", // 长格式: 亿 "Price: { value | currency('long',3) }", // 长格式: 万亿 "Price: { value | currency('long',4) }", // 长格式: 万万亿 // short "Price: { value | currency('short') }", // 短格式 "Price: { value | currency('short',1) }", // 短格式 Thousands "Price: { value | currency('short',2) }", // 短格式 Millions "Price: { value | currency('short',3) }", // 短格式 Billions "Price: { value | currency('short',4) }", // 短格式 Trillions ] const expectEnMoneys =[ "Price: $123,456,789.88", // { value | currency } // long "Price: USD $123,456,789.88", // { value | currency('long')} "Price: USD $123,456.78988 thousands", // { value | currency('long',1)} "Price: USD $123.45678988 millions", // { value | currency('long',2)} "Price: USD $0.12345678988 billions", // { value | currency('long',3)} "Price: USD $0.00012345678988 trillions", // { value | currency('long',4)} // short "Price: $123,456,789.88", // { value | currency('short')} "Price: $123,456.78988 thousands", // { value | currency('short',1)} "Price: $123.45678988 millions", // { value | currency('short',2)} "Price: $0.12345678988 billions", // { value | currency('short',3)} "Price: $0.00012345678988 trillions", // { value | currency('short',4)} ] const loaders = { zh:{ 1:"你好", 2:"现在是{ value | }", 3:"我出生于{year}年,今年{age}岁", 4:"我有{}个朋友", ...toLanguageDict(zhDatetimes,5), }, en :{ 1:"hello", 2:"Now is {}", 3:"I was born in {year}, now is {age} years old", 4:["I have no friends","I have one friends","I have two friends","I have {} friends"], ...toLanguageDict(enDatetimes,5), } } const formatters = { zh:{ $config:{}, $types:{}, book:(v)=>`《${v}》`, }, en:{ $config:{a:1}, $types:{ }, book:(v)=>`<${v}>`, }, } const idMap = { "你好":1, "现在是{ value | }":2, "我出生于{year}年,今年{age}岁":3, "我有{}个朋友":4, ...toLanguageIdMap(zhDatetimes,5) } const languages = [ { name: "zh", title: "中文" }, { name: "en", title: "英文" }, { name: "de", title: "德语" }, { name: "jp", title: "日语" } ] const scope = new i18nScope({ id : "test", defaultLanguage: "zh", activeLanguage : "zh", namespaces : {}, default : loaders.zh, // 默认语言包 messages : loaders.zh, // 当前语言包 languages, // 语言配置 idMap, // 消息id映射列表 formatters, // 扩展自定义格式化器 loaders // 语言包加载器 }) const t = translate.bind(scope) // 适用于所有语言的格式化器,并且注册到全局 scope.registerFormatters({ "*":{ sum : (v,n=1)=>v+n, double: (v)=>v*2, upper : (v)=>v.toUpperCase() } },true) describe("翻译函数",()=>{ beforeEach(() => { scope.change("zh") }); test("获取翻译内容中的插值变量",done=>{ const results = getInterpolatedVars("中华人民共和国成立于{date | year(1,2) | time('a','b') | rel }年,首都是{city}市"); expect(results.length).toEqual(2); // expect(results[0].name).toEqual("date"); expect(results[0].formatters.length).toEqual(3); // year(1,2) expect(results[0].formatters[0].name).toEqual("year"); expect(results[0].formatters[0].args).toEqual([1,2]); // time('a','b') expect(results[0].formatters[1].name).toEqual("time"); expect(results[0].formatters[1].args).toEqual(["a","b"]); // rel expect(results[0].formatters[2].name).toEqual("rel"); expect(results[0].formatters[2].args).toEqual([]); expect(results[1].name).toEqual("city"); expect(results[1].formatters.length).toEqual(0); done() }) test("获取翻译内容中定义了重复的插值变量",done=>{ const results = getInterpolatedVars("{a}{a}{a|x}{a|x}{a|x|y}{a|x|y}"); expect(results.length).toEqual(3); expect(results[0].name).toEqual("a"); expect(results[0].formatters.length).toEqual(0); expect(results[1].name).toEqual("a"); expect(results[1].formatters.length).toEqual(1); expect(results[1].formatters[0].name).toEqual("x"); expect(results[1].formatters[0].args).toEqual([]); expect(results[2].name).toEqual("a"); expect(results[2].formatters.length).toEqual(2); expect(results[2].formatters[0].name).toEqual("x"); expect(results[2].formatters[0].args).toEqual([]); expect(results[2].formatters[1].name).toEqual("y"); expect(results[2].formatters[1].args).toEqual([]); done() }) test("替换翻译内容的位置插值变量",done=>{ expect(t("{}{}{}",1,2,3)).toBe("123"); expect(t("{a}{b}{c}",1,2,3)).toBe("123"); // 定义了一些无效的格式化器,直接忽略 expect(t("{a|xxx}{b|dd}{c|}",1,2,3)).toBe("123"); expect(t("{a|xxx}{b|dd}{c|}",1,2,3,4,5,6)).toBe("123"); expect(t("{ a|}{b|dd}{c|}{}",1,2,3)).toBe("123{}"); // 中文状态下true和false被转换成中文的"是"和"否" expect(t("{}{}{}",1,"2",true)).toBe("12是"); expect(t("{|double}{}{}",1,"2",true)).toBe("22是"); done() }) test("替换翻译内容的命名插值变量",done=>{ expect(t("{a}{b}{c}",{a:11,b:22,c:33})).toBe("112233"); expect(t("{a}{b}{c}{a}{b}{c}",{a:1,b:"2",c:3})).toBe("123123"); done() }) test("命名插值变量使用格式化器",done=>{ // 提供无效的格式化器,直接忽略 expect(t("{a|x}{b|x|y}{c|}",{a:1,b:2,c:3})).toBe("123"); expect(t("{a|x}{b|x|y}{c|double}",{a:1,b:2,c:3})).toBe("126"); // padStart和trim格式化器只是字符串的原型方法,不需要额外定义可以直接使用 expect(t("{a|padStart(10)}",{a:"123"})).toBe(" 123"); expect(t("{a|padStart(10)|trim}",{a:"123"})).toBe("123"); done() }) test("命名插值变量使用格式化器",done=>{ // 提供无效的格式化器,直接忽略 expect(t("{a|x}{b|x|y}{c|}",{a:1,b:2,c:3})).toBe("123"); expect(t("{a|x}{b|x|y}{c|double}",{a:1,b:2,c:3})).toBe("126"); // 默认的字符串格式化器,不需要定义使用字符串方法 expect(t("{a|x}{b|x|y}{c|double}",{a:1,b:2,c:3})).toBe("126"); expect(t("{a|padStart(10)}",{a:"123"})).toBe(" 123"); expect(t("{a|padStart(10)|trim}",{a:"123"})).toBe("123"); done() }) test("切换到其他语言时的自动匹配同名格式化器",async ()=>{ expect(t("{a}",{a:true})).toBe("是"); expect(t("{name|book}是毛泽东思想的重要载体","毛泽东选集")).toBe("《毛泽东选集》是毛泽东思想的重要载体"); await scope.change("en") expect(t("{a}",{a:false})).toBe("False"); expect(t("{name|book}是毛泽东思想的重要载体","毛泽东选集")).toBe("<毛泽东选集>是毛泽东思想的重要载体"); }) test("位置插值翻译文本内容",async ()=>{ const now = new Date() expect(t("你好")).toBe("你好"); expect(t("现在是{ value | }",now)).toBe(`现在是${dayjs(now).format('YYYY/M/D HH:mm:ss')}`); // 经babel自动码换后,文本内容会根据idMap自动转为id expect(t("1")).toBe("你好"); expect(t("2",now)).toBe(`现在是${dayjs(now).format('YYYY/M/D HH:mm:ss')}`); await scope.change("en") expect(t("你好")).toBe("hello"); expect(t("现在是{ value | }",now)).toBe(`Now is ${dayjs(now).format('YYYY/M/D HH:mm:ss')}`); expect(t("1")).toBe("hello"); expect(t("2",now)).toBe(`Now is ${dayjs(now).format('YYYY/M/D HH:mm:ss')}`); }) test("命名插值翻译文本内容",async ()=>{ const now = new Date() expect(t("你好")).toBe("你好"); expect(t("现在是{ value | }",now)).toBe(`现在是${dayjs(now).format('YYYY/M/D HH:mm:ss')}`); await scope.change("en") expect(t("你好")).toBe("hello"); expect(t("现在是{ value | }",now)).toBe(`Now is ${dayjs(now).format('YYYY/M/D HH:mm:ss')}`); // 使用idMap expect(t("1")).toBe("hello"); expect(t("2",now)).toBe(`Now is ${dayjs(now).format('YYYY/M/D HH:mm:ss')}`); }) test("当没有对应的语言翻译时,保持原始输出",async ()=>{ expect(t("我是中国人")).toBe("我是中国人"); await scope.change("en") expect(t("我是中国人")).toBe("我是中国人"); }) test("切换到未知语言时回退到默认语言",async ()=>{ expect(t("我是中国人")).toBe("我是中国人"); expect(async ()=>await scope.change("xn")).rejects.toThrow(Error); expect(t("我是中国人")).toBe("我是中国人"); }) test("翻译复数支持",async ()=>{ await scope.change("en") expect(t("我有{}个朋友",0)).toBe("I have no friends"); expect(t("我有{}个朋友",1)).toBe("I have one friends"); expect(t("我有{}个朋友",2)).toBe("I have two friends"); expect(t("我有{}个朋友",3)).toBe("I have 3 friends"); expect(t("我有{}个朋友",4)).toBe("I have 4 friends"); }) test("日期时间格式化",async ()=>{ let zhTranslatedResults = zhDatetimes.map(v=>t(v,NOW)) // let p = diffArray(zhTranslatedResults,expectZhDatetimes) expect(zhTranslatedResults).toStrictEqual(expectZhDatetimes) await scope.change("en") let enTranslatedResults = zhDatetimes.map(v=>t(v,NOW)) expect(enTranslatedResults).toStrictEqual(expectEnDatetimes) }) test("相对时间格式化",async ()=>{ //const NOW = new Date("2022/08/12 10:12:36") let times = [ // Before "2022/08/12 10:12:30", "2022/08/12 10:2:36", "2022/08/12 8:12:36", "2022/08/08 8:12:36", "2022/07/12 10:12:36", "2018/08/12 10:12:36", // After "2022/08/12 10:12:45", "2022/08/12 10:18:36", "2022/08/12 12:12:36", "2022/08/13 10:12:36", ] let expectCNTimes = [ "6秒前","10分钟前","2小时前","4天前","1月前","4年前", "9秒后","6分钟后","2小时后","1天后" ] let expectENTimes = [ "6 seconds ago","10 minutes ago","2 hours ago","4 days ago","1 months ago","4 years ago", "after 9 seconds","after 6 minutes","after 2 hours","after 1 days" ] scope.activeFormatterConfig.datetime.relativeTime.base = NOW let relTimes = times.map(v=>t("{value | relativeTime }",v)) expect(relTimes).toStrictEqual(expectCNTimes) await scope.change("en") scope.activeFormatterConfig.datetime.relativeTime.base = NOW let relEnTimes = times.map(v=>t("{value | relativeTime }",v)) expect(relEnTimes).toStrictEqual(expectENTimes) }) test("货币格式化",async ()=>{ let zhMoneysResults = zhMoneys.map(v=>t(v,MONEY)) const p = diffArray(zhMoneysResults,expectZhMoneys) expect(zhMoneysResults).toStrictEqual(expectZhMoneys) await scope.change("en") let enMoneysResults = enMoneys.map(v=>t(v,MONEY)) expect(enMoneysResults).toStrictEqual(expectEnMoneys) }) test("数字格式化",async ()=>{ expect(t("{value}",123)).toBe("123") expect(t("{value | number}",123)).toBe("123") expect(t("{value | number}",123456789)).toBe("1,2345,6789") expect(t("{value | number}",123456789.8888)).toBe("1,2345,6789.8888") expect(t("{value | number(3)}",123456789.8888)).toBe("1,2345,6789.889+") expect(t("{value | number(3,2)}",123456789.8888)).toBe("1,23,45,67,89.889+") await scope.change("en") expect(t("{value}",123)).toBe("123") expect(t("{value | number }",123)).toBe("123") expect(t("{value | number }",123456789)).toBe("123,456,789") expect(t("{value | number }",123456789.8888)).toBe("123,456,789.8888") expect(t("{value | number(3) }",123456789.8888)).toBe("123,456,789.889+") expect(t("{value | number(3,2) }",123456789.8888)).toBe("1,23,45,67,89.889+") }) test("中文数字格式化",(done)=>{ let cnNumbers = [ 1, 12, 123, 1234, 12345, 123456, 1234567, 12345678, 123456789, ] let expectCNumbers = [ "一", "十二", "一百二十三", "一千二百三十四", "一万二千三百四十五", "十二万三千四百五十六", "一百二十三万四千五百六十七", "一千二百三十四万五千六百七十八", "一亿二千三百四十五万六千七百八十九" ] let expectCNBigumbers=[ "壹", "壹拾貳", "壹佰貳拾參", "壹仟貳佰參拾肆", "壹萬貳仟參佰肆拾伍", "壹拾貳萬參仟肆佰伍拾陸", "壹佰貳拾參萬肆仟伍佰陸拾柒", "壹仟貳佰參拾肆萬伍仟陸佰柒拾捌", "壹億貳仟參佰肆拾伍萬陸仟柒佰捌拾玖" ] let cnTanslated = cnNumbers.map(n=>t("{value |chineseNumber}",n)) expect(cnTanslated).toStrictEqual(expectCNumbers) let cnBigTanslated = cnNumbers.map(n=>t("{value |chineseNumber(true)}",n)) expect(cnBigTanslated).toStrictEqual(expectCNBigumbers) done() }) test("中文货币格式化",(done)=>{ let cnNumbers = [ 1.88, 12.88, 123.88, 1234.88, 12345.88, 123456.88, 1234567.88, 12345678.88, 123456789.88, ] let expectCNumbers = [ "一元八角八分", "十二元八角八分", "一百二十三元八角八分", "一千二百三十四元八角八分", "一万二千三百四十五元八角八分", "十二万三千四百五十六元八角八分", "一百二十三万四千五百六十七元八角八分", "一千二百三十四万五千六百七十八元八角八分", "一亿二千三百四十五万六千七百八十九元八角八分", ] let expectCNBigumbers=[ "壹元捌角捌分", "壹拾貳元捌角捌分", "壹佰貳拾參元捌角捌分", "壹仟貳佰參拾肆元捌角捌分", "壹萬貳仟參佰肆拾伍元捌角捌分", "壹拾貳萬參仟肆佰伍拾陸元捌角捌分", "壹佰貳拾參萬肆仟伍佰陸拾柒元捌角捌分", "壹仟貳佰參拾肆萬伍仟陸佰柒拾捌元捌角捌分", "壹億貳仟參佰肆拾伍萬陸仟柒佰捌拾玖元捌角捌分", ] let expectCNBigumbers2=[ "人民币:壹元捌角捌分整", "人民币:壹拾貳元捌角捌分整", "人民币:壹佰貳拾參元捌角捌分整", "人民币:壹仟貳佰參拾肆元捌角捌分整", "人民币:壹萬貳仟參佰肆拾伍元捌角捌分整", "人民币:壹拾貳萬參仟肆佰伍拾陸元捌角捌分整", "人民币:壹佰貳拾參萬肆仟伍佰陸拾柒元捌角捌分整", "人民币:壹仟貳佰參拾肆萬伍仟陸佰柒拾捌元捌角捌分整", "人民币:壹億貳仟參佰肆拾伍萬陸仟柒佰捌拾玖元捌角捌分整", ] let cnTanslated = cnNumbers.map(n=>t("{value |rmb }",n)) expect(cnTanslated).toStrictEqual(expectCNumbers) let cnBigTanslated = cnNumbers.map(n=>t("{value |rmb(true)}",n)) expect(cnBigTanslated).toStrictEqual(expectCNBigumbers) let cnBigTanslated2 = cnNumbers.map(n=>t("{value |rmb({big:true,prefix:'人民币:', unit:'元',suffix:'整'})}",n)) expect(cnBigTanslated2).toStrictEqual(expectCNBigumbers2) done() }) test("注册普通格式化器",async ()=>{ const f1 = (value,$config) => value + 1 scope.registerFormatter("f1",f1) expect(t("{value | f1}",1)).toBe("2") expect(t("{value | f1}","1")).toBe("11") const f2 = (value,arg,$config) => value + arg scope.registerFormatter("f2",f2) expect(t("{value | f2('*')}","1")).toBe("1*") const f3 = (value,args,$config) => value + args.name scope.registerFormatter("f3",f3) expect(t("{value | f3({name:'x'})}","1")).toBe("1x") const f4 = (value,$config) => value + 1 scope.registerFormatter("f4",f4,{languages:"en"}) expect(t("{value | f4(1)}",1)).toBe("2") }) })