import * as assert from 'assert'; import { t, setLanguage, getLanguage, getMessageKeys, Language } from '../src/i18n/messages'; suite('I18n Tests', () => { test('all message keys have values for all three languages', () => { const languages: Language[] = ['zh-CN', 'en', 'ja']; const keys = getMessageKeys(); for (const lang of languages) { setLanguage(lang); for (const key of keys) { const result = t(key); assert.ok(result, `Key "${key}" is empty for language "${lang}"`); assert.notStrictEqual(result, key, `Key "${key}" has no translation for language "${lang}"`); } } }); test('default language is zh-CN', () => { setLanguage('zh-CN'); assert.strictEqual(getLanguage(), 'zh-CN'); }); test('setLanguage changes current language', () => { setLanguage('en'); assert.strictEqual(getLanguage(), 'en'); setLanguage('ja'); assert.strictEqual(getLanguage(), 'ja'); setLanguage('zh-CN'); }); test('t() falls back to key when key does not exist', () => { setLanguage('zh-CN'); const result = t('nonexistent.key'); assert.strictEqual(result, 'nonexistent.key'); }); test('t() returns zh-CN string in zh-CN language', () => { setLanguage('zh-CN'); assert.strictEqual(t('review.noEditor'), '请先打开一个文件'); }); test('t() returns English string in en language', () => { setLanguage('en'); assert.strictEqual(t('review.noEditor'), 'Please open a file first'); }); test('t() returns Japanese string in ja language', () => { setLanguage('ja'); assert.strictEqual(t('review.noEditor'), '最初にファイルを開いてください'); }); test('t() with template variables', () => { setLanguage('en'); assert.strictEqual( t('export.saved', { 0: '/home/user/report.md' }), 'Report saved to /home/user/report.md' ); }); test('t() with multiple template variables', () => { setLanguage('zh-CN'); assert.strictEqual( t('report.totalSummary', { 0: '10', 1: '3', 2: '5', 3: '2' }), '总计: 10 | 错误: 3 | 警告: 5 | 建议: 2' ); }); teardown(() => { setLanguage('zh-CN'); }); });