@voerkai18n/runtime
Version:
runtime of voerkai18n
136 lines (124 loc) • 6.37 kB
text/typescript
/**
* 语言切换测试
*/
import { test, describe, expect, beforeEach } from 'vitest'
import { createVoerkaI18nScope, resetVoerkaI18n } from './_utils';
describe('语言切换', () => {
beforeEach(() => {
resetVoerkaI18n()
});
test('单scope切换语言', async () => {
const scope = createVoerkaI18nScope();
expect(scope.id).toBe('test-scope');
expect(scope.debug).toBe(false);
expect(scope.activeLanguage).toBe('zh');
expect(scope.defaultLanguage).toBe('zh');
expect(scope.activeMessages).toEqual({ message: '你好' });
await scope.change("en")
expect(scope.activeLanguage).toBe('en');
expect(scope.defaultLanguage).toBe('zh');
expect(scope.activeMessages).toEqual({ message: 'Hello' });
});
test('多scope切换语言', async () => {
const scope1 = createVoerkaI18nScope({ id: "a" });
const scope2 = createVoerkaI18nScope({ id: "b", library: true });
const scope3 = createVoerkaI18nScope({ id: "c", library: true });
const scope4 = createVoerkaI18nScope({ id: "d", library: true });
expect(globalThis.VoerkaI18n.scopes.length).toBe(4);
const newLanguage = await scope1.change("en")
expect(newLanguage).toBe('en');
expect(scope1.activeLanguage).toBe('en');
expect(scope1.activeMessages).toEqual({ message: 'Hello' });
expect(scope2.activeLanguage).toBe('en');
expect(scope2.activeMessages).toEqual({ message: 'Hello' });
expect(scope3.activeLanguage).toBe('en');
expect(scope3.activeMessages).toEqual({ message: 'Hello' });
expect(scope4.activeLanguage).toBe('en');
expect(scope4.activeMessages).toEqual({ message: 'Hello' });
})
test('先创建libScope再注册appScope', async () => {
const libScope1 = createVoerkaI18nScope({ id: "b", library: true });
const libScope2 = createVoerkaI18nScope({ id: "c", library: true });
const libScope3 = createVoerkaI18nScope({ id: "d", library: true });
const appScope = createVoerkaI18nScope({ id: "a" });
expect(globalThis.VoerkaI18n.scopes.length).toBe(4);
const newLanguage = await appScope.change("en")
expect(newLanguage).toBe('en');
expect(appScope.activeLanguage).toBe('en');
expect(appScope.activeMessages).toEqual({ message: 'Hello' });
expect(libScope1.activeLanguage).toBe('en');
expect(libScope1.activeMessages).toEqual({ message: 'Hello' });
expect(libScope2.activeLanguage).toBe('en');
expect(libScope2.activeMessages).toEqual({ message: 'Hello' });
expect(libScope3.activeLanguage).toBe('en');
expect(libScope3.activeMessages).toEqual({ message: 'Hello' });
})
test('先创建appScope再注册libScope', async () => {
const scope1 = createVoerkaI18nScope({ id: "a" });
await scope1.change("en")
const scope2 = createVoerkaI18nScope({ id: "b", library: true });
const scope3 = createVoerkaI18nScope({ id: "c", library: true });
const scope4 = createVoerkaI18nScope({ id: "d", library: true });
// 由于是语言切换是异步的,所以需要等待切换完成
await scope2.ready()
await scope3.ready()
await scope4.ready()
expect(scope1.activeLanguage).toBe('en');
expect(scope1.activeMessages).toEqual({ message: 'Hello' });
expect(scope2.activeLanguage).toBe('en');
expect(scope2.activeMessages).toEqual({ message: 'Hello' });
expect(scope3.activeLanguage).toBe('en');
expect(scope3.activeMessages).toEqual({ message: 'Hello' });
expect(scope4.activeLanguage).toBe('en');
expect(scope4.activeMessages).toEqual({ message: 'Hello' });
})
test("语言切换change事件",()=>{
return new Promise<void>((resolve)=>{
const scope1 = createVoerkaI18nScope({ id: "a" });
VoerkaI18n.on("change",(language)=>{
expect(language).toBe('en');
resolve()
})
scope1.change("en").then((language)=>{
expect(scope1.activeLanguage).toBe('en');
expect(scope1.activeMessages).toEqual({ message: 'Hello' });
expect(language).toBe('en');
})
})
})
test("ready事件",async ()=>{
const libScope1 = createVoerkaI18nScope({ id: "b", library: true });
const libScope2 = createVoerkaI18nScope({ id: "c", library: true });
const libScope3 = createVoerkaI18nScope({ id: "d", library: true });
const appScope = createVoerkaI18nScope({ id: "a" });
expect(globalThis.VoerkaI18n.scopes.length).toBe(4);
appScope.change("en")
await VoerkaI18n.ready()
expect(appScope.activeLanguage).toBe('en');
expect(appScope.activeMessages).toEqual({ message: 'Hello' });
expect(libScope1.activeLanguage).toBe('en');
expect(libScope1.activeMessages).toEqual({ message: 'Hello' });
expect(libScope2.activeLanguage).toBe('en');
expect(libScope2.activeMessages).toEqual({ message: 'Hello' });
expect(libScope3.activeLanguage).toBe('en');
expect(libScope3.activeMessages).toEqual({ message: 'Hello' });
})
test("切换appScope语言时不影响detachedScope",async ()=>{
const detachedScope = createVoerkaI18nScope({ id: "b", library: true,attached:false });
const appScope = createVoerkaI18nScope({ id: "a" });
await VoerkaI18n.change('en')
expect(appScope.activeLanguage).toBe("en")
expect(appScope.activeMessages).toEqual({ message: 'Hello' })
expect(detachedScope.activeLanguage).toBe("zh")
expect(detachedScope.activeMessages).toEqual({ message: '你好' })
})
test("独立切换detachedScope语言",async ()=>{
const detachedScope = createVoerkaI18nScope({ id: "b", library: true,attached:false });
const appScope = createVoerkaI18nScope({ id: "a" });
await detachedScope.change('en')
expect(appScope.activeLanguage).toBe("zh")
expect(appScope.activeMessages).toEqual({ message: '你好' })
expect(detachedScope.activeLanguage).toBe("en")
expect(detachedScope.activeMessages).toEqual({ message: 'Hello' })
})
});