// Created on savesnippets.com · https://savesnippets.com/maHWS5rdQzfMiZ 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!