20 lines
790 B
TypeScript
20 lines
790 B
TypeScript
import en from '@/messages/en.json';
|
|
|
|
export const DEFAULT_LOCALE = 'en';
|
|
export const messages = { en } as const;
|
|
export type Locale = keyof typeof messages;
|
|
|
|
type Vars = Record<string, string | number>;
|
|
|
|
/** Tiny dictionary lookup: t('nav.pricing') with optional {name} interpolation. */
|
|
export function t(key: string, vars?: Vars, locale: Locale = DEFAULT_LOCALE): string {
|
|
const dict = messages[locale] as Record<string, unknown>;
|
|
const value = key.split('.').reduce<unknown>((acc, part) => {
|
|
if (acc && typeof acc === 'object') return (acc as Record<string, unknown>)[part];
|
|
return undefined;
|
|
}, dict);
|
|
if (typeof value !== 'string') return key;
|
|
if (!vars) return value;
|
|
return value.replace(/\{(\w+)\}/g, (_, name: string) => String(vars[name] ?? `{${name}}`));
|
|
}
|