UNPKG

@voerkai18n/runtime

Version:
136 lines (124 loc) 6.37 kB
/** * 语言切换测试 */ 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' }) }) });