镜像自地址
https://github.com/lhly/cloud-drive-renamer.git
已同步 2026-10-21 06:01:51 +08:00
添加完整的国际化支持,包括简体中文、繁体中文和英文翻译 新增语言切换功能,支持运行时动态更新界面语言 修复content script和popup之间的语言同步问题 添加翻译文件转换脚本和单元测试 更新相关组件以支持动态语言切换
105 行
3.1 KiB
TypeScript
105 行
3.1 KiB
TypeScript
/**
|
|
* 语言同步测试
|
|
* 验证 popup 和 content script 之间的语言切换同步机制
|
|
*/
|
|
|
|
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
import { I18nService } from '../../src/utils/i18n';
|
|
import type { LanguageChangeMessage } from '../../src/types/i18n';
|
|
|
|
describe('I18n Service Language Sync', () => {
|
|
beforeEach(() => {
|
|
// Mock chrome.storage.local
|
|
global.chrome = {
|
|
storage: {
|
|
local: {
|
|
get: vi.fn((key: string) => Promise.resolve({ [key]: 'zh_CN' })),
|
|
set: vi.fn(() => Promise.resolve()),
|
|
} as any,
|
|
} as any,
|
|
runtime: {
|
|
sendMessage: vi.fn(() => Promise.resolve()),
|
|
} as any,
|
|
tabs: {
|
|
query: vi.fn(() => Promise.resolve([])),
|
|
sendMessage: vi.fn(() => Promise.resolve()),
|
|
} as any,
|
|
i18n: {
|
|
getUILanguage: vi.fn(() => 'zh-CN'),
|
|
} as any,
|
|
} as any;
|
|
});
|
|
|
|
afterEach(() => {
|
|
vi.clearAllMocks();
|
|
});
|
|
|
|
it('should update currentLanguage when setLanguage is called', async () => {
|
|
// 初始化为默认语言
|
|
await I18nService.getCurrentLanguage();
|
|
expect(I18nService.getCurrentLanguageSync()).toBe('zh_CN');
|
|
|
|
// 切换到英语
|
|
await I18nService.setLanguage('en');
|
|
expect(I18nService.getCurrentLanguageSync()).toBe('en');
|
|
|
|
// 验证 I18nService.t() 使用新语言
|
|
const message = I18nService.t('floating_button_tooltip');
|
|
expect(message).toBeDefined();
|
|
});
|
|
|
|
it('should send LANGUAGE_CHANGED message when language is changed', async () => {
|
|
const sendMessageSpy = vi.spyOn(chrome.runtime, 'sendMessage');
|
|
|
|
await I18nService.setLanguage('zh_TW');
|
|
|
|
expect(sendMessageSpy).toHaveBeenCalledWith(
|
|
expect.objectContaining({
|
|
type: 'LANGUAGE_CHANGED',
|
|
language: 'zh_TW',
|
|
} as LanguageChangeMessage)
|
|
);
|
|
});
|
|
|
|
it('should persist language to chrome.storage.local', async () => {
|
|
const setStorageSpy = vi.spyOn(chrome.storage.local, 'set');
|
|
|
|
await I18nService.setLanguage('en');
|
|
|
|
expect(setStorageSpy).toHaveBeenCalledWith(
|
|
expect.objectContaining({ language: 'en' })
|
|
);
|
|
});
|
|
|
|
it('should handle multiple language switches correctly', async () => {
|
|
// 切换到繁体中文
|
|
await I18nService.setLanguage('zh_TW');
|
|
expect(I18nService.getCurrentLanguageSync()).toBe('zh_TW');
|
|
|
|
// 切换到英语
|
|
await I18nService.setLanguage('en');
|
|
expect(I18nService.getCurrentLanguageSync()).toBe('en');
|
|
|
|
// 切换回简体中文
|
|
await I18nService.setLanguage('zh_CN');
|
|
expect(I18nService.getCurrentLanguageSync()).toBe('zh_CN');
|
|
});
|
|
|
|
it('should throw error for unsupported language', async () => {
|
|
await expect(
|
|
I18nService.setLanguage('fr' as any)
|
|
).rejects.toThrow('Unsupported language: fr');
|
|
});
|
|
|
|
it('should fallback to default language if translation not found', () => {
|
|
// 设置为英语
|
|
I18nService.setLanguage('en').then(() => {
|
|
// 尝试获取不存在的 key
|
|
const message = I18nService.t('non_existent_key');
|
|
|
|
// 应该返回 key 本身
|
|
expect(message).toBe('non_existent_key');
|
|
});
|
|
});
|
|
});
|