# 🌍 Internationalization Implementation - Personotes ## ✅ Ce qui a Ă©tĂ© implĂ©mentĂ© ### 1. Infrastructure i18n (TERMINÉ) **Fichiers de traduction**: - ✅ `locales/en.json` - Traductions anglaises complĂštes (200+ clĂ©s) - ✅ `locales/fr.json` - Traductions françaises complĂštes (200+ clĂ©s) - ✅ `locales/README.md` - Guide pour contributeurs **Backend Go**: - ✅ `internal/i18n/i18n.go` - Package i18n avec Translator - ✅ `internal/i18n/i18n_test.go` - Tests unitaires - ✅ IntĂ©gration dans `cmd/server/main.go` - ✅ Endpoint `/api/i18n/{lang}` pour servir les traductions JSON - ✅ Fonctions helper `getLanguage()` et `t()` dans handler.go **Frontend JavaScript**: - ✅ `frontend/src/i18n.js` - Module i18n client avec dĂ©tection automatique - ✅ `frontend/src/language-manager.js` - Gestionnaire UI et rechargement - ✅ Import dans `frontend/src/main.js` **Interface utilisateur**: - ✅ Nouvel onglet "Autre" dans les Settings - ✅ SĂ©lecteur de langue 🇬🇧 English / đŸ‡«đŸ‡· Français - ✅ Persistance dans localStorage - ✅ Rechargement automatique de l'interface ## 📋 Étapes restantes pour finalisation ### Étape 1: Build du Frontend ```bash cd frontend npm install # Si pas dĂ©jĂ  fait npm run build ``` ### Étape 2: Tester le serveur ```bash go run ./cmd/server ``` VĂ©rifier que: - ✅ Les traductions se chargent au dĂ©marrage (log: `traductions chargees: [en fr]`) - ✅ L'endpoint `/api/i18n/en` retourne du JSON - ✅ L'endpoint `/api/i18n/fr` retourne du JSON - ✅ La modal Settings affiche l'onglet "Autre" ### Étape 3: Migration des messages d'erreur backend (OPTIONNEL) Les messages d'erreur français dans le code Go peuvent ĂȘtre migrĂ©s progressivement. Pour l'instant, ils restent en français car: 1. Ils apparaissent surtout dans les logs serveur 2. L'interface utilisateur peut dĂ©jĂ  ĂȘtre traduite 3. La migration peut se faire progressivement sans casser le code **Exemple de migration (si souhaitĂ©)**: ```go // Avant http.Error(w, "methode non supportee", http.StatusMethodNotAllowed) // AprĂšs http.Error(w, h.t(r, "errors.methodNotAllowed"), http.StatusMethodNotAllowed) ``` ### Étape 4: Migration du JavaScript (OPTIONNEL pour l'instant) Les `alert()` français dans file-tree.js peuvent ĂȘtre migrĂ©s: ```javascript // Avant alert('Veuillez entrer un nom de note'); // AprĂšs import { t } from './i18n.js'; alert(t('fileTree.enterNoteName')); ``` ### Étape 5: Migration des Templates HTML (EN COURS) Les templates HTML contiennent encore du texte français en dur. Deux approches possibles: **Option A: Utiliser data-i18n attributes (RecommandĂ©)** ```html ``` **Option B: Utiliser les fonctions template Go** ```html ``` NĂ©cessite d'ajouter la fonction `t` aux template funcs: ```go funcMap := template.FuncMap{ "t": func(key string) string { return h.i18n.T("en", key) // ou dĂ©tecter la langue }, } templates := template.New("").Funcs(funcMap).ParseGlob("templates/*.html") ``` ## 🚀 Pour aller plus loin ### Ajout d'une nouvelle langue 1. CrĂ©er `locales/es.json` (exemple: espagnol) 2. Copier la structure de `en.json` 3. Traduire toutes les clĂ©s 4. Ajouter dans la modal Settings: ```html ``` 5. RedĂ©marrer le serveur ### DĂ©tection automatique de la langue Le systĂšme dĂ©tecte automatiquement la langue dans cet ordre: 1. Cookie `language` 2. Header HTTP `Accept-Language` 3. Langue du navigateur (JavaScript) 4. DĂ©faut: Anglais ### Persistance - **Frontend**: localStorage (`language`) - **Backend**: Cookie HTTP (Ă  implĂ©menter si besoin) ## 📝 Notes techniques ### Structure des clĂ©s de traduction ``` app.name → "Personotes" menu.home → "Home" / "Accueil" editor.confirmDelete → "Are you sure...?" (avec {{filename}}) errors.methodNotAllowed → "Method not allowed" ``` ### Interpolation de variables ```javascript // JavaScript t('editor.confirmDelete', { filename: 'test.md' }) // → "Are you sure you want to delete this note (test.md)?" // Go h.t(r, "editor.confirmDelete", map[string]string{"filename": "test.md"}) // → "Êtes-vous sĂ»r de vouloir supprimer cette note (test.md) ?" ``` ### Performance - Les traductions sont chargĂ©es une seule fois au dĂ©marrage du serveur - Le frontend charge les traductions de maniĂšre asynchrone - Aucun impact sur les performances aprĂšs le chargement initial ## ✅ Checklist de test - [ ] Le serveur dĂ©marre sans erreur - [ ] `/api/i18n/en` retourne du JSON valide - [ ] `/api/i18n/fr` retourne du JSON valide - [ ] La modal Settings s'ouvre - [ ] L'onglet "Autre" est visible - [ ] On peut changer de langue - [ ] La sĂ©lection persiste aprĂšs rechargement - [ ] La console ne montre pas d'erreurs JavaScript - [ ] Les notes existantes ne sont pas affectĂ©es ## 🐛 DĂ©pannage ### Erreur: "traductions not found" - VĂ©rifier que le dossier `locales/` existe - VĂ©rifier que `en.json` et `fr.json` sont prĂ©sents - VĂ©rifier les permissions de lecture ### Interface ne se traduit pas - Ouvrir la console navigateur (F12) - VĂ©rifier les erreurs rĂ©seau dans l'onglet Network - VĂ©rifier que `/api/i18n/en` retourne du JSON - VĂ©rifier que `i18n.js` est chargĂ© dans main.js ### Langue ne persiste pas - VĂ©rifier que localStorage fonctionne (pas de navigation privĂ©e) - VĂ©rifier la console pour les erreurs de localStorage ## 📚 Documentation La documentation complĂšte du systĂšme i18n est dans: - `locales/README.md` - Guide pour contributeurs - Ce fichier - Guide d'implĂ©mentation - Les commentaires dans le code source ## 🎉 RĂ©sultat final Une fois tout implĂ©mentĂ©, l'application: - ✅ DĂ©tecte automatiquement la langue du navigateur - ✅ Permet de changer de langue via Settings - ✅ Persiste le choix de l'utilisateur - ✅ Recharge l'interface automatiquement - ✅ Supporte facilement l'ajout de nouvelles langues - ✅ N'affecte pas le contenu des notes