function createI18n(locales, defaultLocale = 'en') {
let locale = defaultLocale;
function t(key, vars = {}) {
const parts = key.split('.');
let result = locales[locale] ?? locales[defaultLocale] ?? {};
for (const part of parts) result = result?.[part];
if (typeof result !== 'string') return key;
return result.replace(/\{\{(\w+)\}\}/g, (_, k) => vars[k] ?? `{{${k}}}`);
}
return {
t,
setLocale: (l) => { locale = l; },
getLocale: () => locale,
};
}
// Usage
const i18n = createI18n({
en: { greeting: 'Hello, {{name}}!', nav: { home: 'Home' } },
es: { greeting: '¡Hola, {{name}}!', nav: { home: 'Inicio' } },
});
console.log(i18n.t('greeting', { name: 'Alice' })); // Hello, Alice!
i18n.setLocale('es');
console.log(i18n.t('greeting', { name: 'Alice' })); // ¡Hola, Alice!
Create a free account and build your private vault. Share publicly whenever you want.