import zhCN from "./locales/zh-CN.json"; import enUS from "./locales/en-US.json"; export type Locale = "zh-CN" | "en-US"; export type TranslationValue = string | number; export type TranslationParams = Readonly>; const sourceMessages = zhCN as Record; const localeMessages: Record> = { "zh-CN": sourceMessages, "en-US": enUS as Record, }; let currentMessages: Record = {}; export function setRuntimeLocale(locale: Locale) { const target = localeMessages[locale]; currentMessages = {}; for (const [id, source] of Object.entries(sourceMessages)) { currentMessages[source] = target[id] || source; } } export function t(source: string, params?: TranslationParams): string { const translated = currentMessages[source] || source; if (!params) return translated; return translated.replace(/\{([A-Za-z_][A-Za-z0-9_]*)\}/g, (_match, name: string) => { if (!Object.prototype.hasOwnProperty.call(params, name)) { throw new Error(`Missing i18n parameter: ${name}`); } return String(params[name]); }); }