This commit is contained in:
wxzhang 2023-04-10 20:17:47 +08:00
parent ffbf5ad9ad
commit d1d34a146c
3 changed files with 62 additions and 34 deletions

View File

@ -1,6 +1,6 @@
import {test,vi,describe,expect,afterAll,beforeAll} from 'vitest'
import {test,vi,describe,expect,afterAll,beforeAll, beforeEach} from 'vitest'
import { VoerkaI18nScope } from '../scope'
import zhFormatters from '../formatters/zh';
import enFormatters from '../formatters/en';
@ -10,6 +10,7 @@ import { VoerkaI18nLanguageMessages, VoerkaI18nFormatterConfigs } from '../types
import { deepMerge } from 'flex-tools/object/deepMerge';
import { isPlainObject } from 'flex-tools/typecheck/isPlainObject';
import { default as inlineFormatters } from '../formatters';
import { InvalidLanguageError } from '../errors';
function mergeFormattersConfigs(configSources:any[]){
return configSources.reduce((finalConfig, curConfig)=>{
@ -79,23 +80,26 @@ const formatters ={
},
jp:()=>{}
}
let scope:VoerkaI18nScope;
beforeAll(async ()=>{
return new Promise((resolve)=>{
scope = new VoerkaI18nScope({
id: "test",
languages,
idMap,
messages,
formatters,
callback:()=>{
resolve()
}
})
})
})
beforeEach(async ()=>{
await scope.change("zh")
})
describe("VoerkaI18nScope", () => {
let scope:VoerkaI18nScope;
beforeAll(async ()=>{
return new Promise((resolve)=>{
scope = new VoerkaI18nScope({
id: "test",
languages,
idMap,
messages,
formatters,
callback:()=>{
resolve()
}
})
})
})
test("成功创建实例", () => {
expect(scope).toBeInstanceOf(VoerkaI18nScope)
expect(scope.activeLanguage).toBe("zh")
@ -107,28 +111,53 @@ describe("VoerkaI18nScope", () => {
// 全局管理器
expect(scope.global).toBeInstanceOf(VoerkaI18nManager)
})
test("切换语言", () => {
return new Promise<void>((resolve)=>{
scope.on((language:string) => {
expect(language).toBe("en")
expect(scope.activeLanguage).toBe("en")
expect(scope.defaultLanguage).toBe("zh")
expect(scope.messages).toEqual(messages)
expect(scope.default).toEqual(zhMessages)
expect(scope.current).toEqual(enMessages)
expect(scope.idMap).toEqual(idMap)
resolve()
})
scope.change("en")
})
})
test("格式化器配置", async () => {
test("切换到不存在的语言", async () => {
try{
await scope.change("xn")
}catch(e){
expect(e).toBeInstanceOf(InvalidLanguageError)
}
})
})
describe("格式化化配置与参数", () => {
test("格式化器参数", async () => {
expect(scope.formatters).toBeInstanceOf(VoerkaI18nFormatterRegistry)
expect(scope.formatters.activeLanguage).toBe("zh")
expect(scope.formatters.formatters).toEqual(formatters)
expect(scope.formatters.config).toBe(zhFormatters.$config)
expect(scope.formatters.types).toBe(zhFormatters.$types)
})
test("查找格式化器", async () => {
expect(scope.formatters.get("add")).toBe(formatters['*'].add)
expect(scope.formatters.get("first")).toBe(formatters.zh.first)
await scope.change("en")
expect(scope.formatters.get("first")).toBe(formatters.en.first)
})
test("格式化器配置", async () => {
test("合并后的格式化器配置", async () => {
let fallbackLanguage = scope.getLanguage(scope.activeLanguage)?.fallback
const globalFormatters = inlineFormatters
let scopeConfig = mergeFormattersConfigs([
globalFormatters['*'].$config,
(fallbackLanguage! in globalFormatters) ? (globalFormatters as any)?.[fallbackLanguage!].$config:{},
globalFormatters.zh.$config,
formatters['*'].$config,
(fallbackLanguage! in formatters) ? (formatters as any)?.[fallbackLanguage!]?.$config:{},
formatters.zh.$config
])
@ -137,17 +166,17 @@ describe("VoerkaI18nScope", () => {
await scope.change("en")
fallbackLanguage = scope.getLanguage(scope.activeLanguage)?.fallback
scopeConfig = mergeFormattersConfigs([
globalFormatters['*'].$config,
(fallbackLanguage! in globalFormatters) ? (globalFormatters as any)?.[fallbackLanguage!].$config:{},
// globalFormatters.zh.$config,
formatters['*'].$config,
globalFormatters.en.$config,
(fallbackLanguage! in formatters) ? (formatters as any)?.[fallbackLanguage!]?.$config:{},
formatters.en.$config
])
expect(scope.formatters.config).toEqual(scopeConfig)
expect(scope.formatters.config).toEqual(scopeConfig)
})
})
test('translate', () => {})
describe('翻译函数', () => {
})

View File

@ -69,8 +69,8 @@ export class VoerkaI18nFormatterRegistry{
*/
async change(language:string){
try {
if (language in this. formatters) {
this.#language = language
if (language in this.formatters) {
const formatters = this.formatters[language]
if(isFunction(formatters)){
this.#activeFormatters = await (formatters as Function)() // 如果格式化器集合是异步加载,则需要等待加载完成
@ -78,9 +78,9 @@ export class VoerkaI18nFormatterRegistry{
this.#activeFormatters = formatters as VoerkaI18nFormatters
}
// 合并生成格式化器的配置参数,当执行格式化器时该参数将被传递给格式化器
this.generateFormattersConfigs(language)
// 清空缓存
this.#formatterCache = {typedFormatters:{},formatters:{}}
this.generateFormattersConfigs(language)
this.#language = language
} else {
if (this.scope?.debug) console.warn(`Not configured <${language}> formatters.`);
}
@ -93,12 +93,10 @@ export class VoerkaI18nFormatterRegistry{
const configSources = [ ]
const fallbackLanguage = this.scope?.getLanguage(language)?.fallback ;
if(this.scope){ // 从全局Scope读取
configSources.push(this.scope.global.formatters.getConfig('*'))
if(fallbackLanguage) configSources.push(this.scope.global.formatters.getConfig(fallbackLanguage))
configSources.push(this.scope.global.formatters.getConfig(language))
}
// 从当前Scope读取
configSources.push(this.getConfig('*'))
if(fallbackLanguage) configSources.push(this.getConfig(fallbackLanguage))
configSources.push(this.getConfig(language))
// 合并当前语言的格式化器配置参数

View File

@ -5,6 +5,7 @@ import inlineFormatters from "./formatters"
import type { VoerkaI18nScope } from "./scope"
import type { VoerkaI18nLanguageDefine, VoerkaI18nLanguageFormatters, VoerkaI18nDefaultMessageLoader, VoerkaI18nFormatter, VoerkaI18nTypesFormatters } from "./types"
import { VoerkaI18nFormatterRegistry } from "./formatterRegistry"
import { InvalidLanguageError } from './errors';
// 默认语言配置
const defaultLanguageSettings = {
@ -92,7 +93,7 @@ export class VoerkaI18nManager extends EventEmitter{
await this.emit(language) // 触发语言切换事件
return language
}else{
throw new Error("Not supported language:"+language)
throw new InvalidLanguageError()
}
}
/**