4e9746c308
- Crée js/i18n/i18n.js : module central avec t(), getLocale(), setLocale() - Crée js/i18n/locales/fr.json et en.json : traductions FR et EN - Crée js/i18n/applyTranslations.js : applique les data-i18n au DOM - Crée js/i18n/langSwitcher.js : sélecteur de langue (boutons FR/EN) - Modifie index.html : ajoute les attributs data-i18n sur tous les textes - Modifie js/main.js : intègre i18n et relance l'application des traductions - Modifie css/form.css : styles pour le sélecteur de langue - Persistance de la langue dans localStorage (clé cv_lang)
36 lines
1.0 KiB
JavaScript
36 lines
1.0 KiB
JavaScript
import fr from './locales/fr.json' assert { type: 'json' };
|
|
import en from './locales/en.json' assert { type: 'json' };
|
|
|
|
const LOCALES = { fr, en };
|
|
const SUPPORTED = Object.keys(LOCALES);
|
|
const STORAGE_KEY = 'cv_lang';
|
|
|
|
let currentLocale = localStorage.getItem(STORAGE_KEY) || 'fr';
|
|
if (!SUPPORTED.includes(currentLocale)) currentLocale = 'fr';
|
|
|
|
function resolve(obj, path) {
|
|
return path.split('.').reduce((acc, key) => acc?.[key], obj);
|
|
}
|
|
|
|
export function t(key, params = {}) {
|
|
const messages = LOCALES[currentLocale] ?? LOCALES.fr;
|
|
let str = resolve(messages, key) ?? resolve(LOCALES.fr, key) ?? key;
|
|
return str.replace(/\{(\w+)\}/g, (_, k) => params[k] ?? `{${k}}`);
|
|
}
|
|
|
|
export function getLocale() {
|
|
return currentLocale;
|
|
}
|
|
|
|
export function setLocale(lang) {
|
|
if (!SUPPORTED.includes(lang)) return;
|
|
currentLocale = lang;
|
|
localStorage.setItem(STORAGE_KEY, lang);
|
|
document.documentElement.lang = lang;
|
|
document.dispatchEvent(new CustomEvent('localechange', { detail: { lang } }));
|
|
}
|
|
|
|
export function getSupportedLocales() {
|
|
return SUPPORTED;
|
|
}
|