import { describe, expect, it } from 'vitest'; import { en } from '../../src/i18n/locales/en'; import { LOCALES, LOCALE_LABEL, type Dict, type Locale } from '../../src/i18n/types'; const EXPECTED_LOCALES = ['en', 'de', 'zh-CN', 'zh-TW', 'pt-BR', 'es-ES', 'ru', 'fa', 'ar', 'ja', 'ko', 'pl', 'hu', 'fr', 'uk', 'tr']; function placeholders(value: string): string[] { const names: string[] = []; for (const match of value.matchAll(/\{(\w+)\}/g)) { if (match[1]) { names.push(match[1]); } } return names.sort(); } async function loadDict(locale: Locale): Promise { const module = await import(`../../src/i18n/locales/${locale}.ts`); const dict = Object.values(module).find((value): value is Dict => { return Boolean(value) && typeof value === 'object'; }); if (!dict) { throw new Error(`No dictionary export found for locale ${locale}`); } return dict; } describe('i18n locales', () => { it('registers every supported locale in the language menu', () => { expect(LOCALES).toEqual(EXPECTED_LOCALES); expect((LOCALE_LABEL as Record).de).toBe('Deutsch'); expect((LOCALE_LABEL as Record).ja).toBe('日本語'); }); it('keeps locale dictionaries aligned with English keys and placeholders', async () => { const englishKeys = Object.keys(en).sort(); for (const locale of LOCALES) { const dict = await loadDict(locale); expect(Object.keys(dict).sort()).toEqual(englishKeys); for (const key of englishKeys) { const dictKey = key as keyof Dict; expect(placeholders(dict[dictKey]), `${locale}.${key}`).toEqual( placeholders(en[dictKey]), ); } } }); });