# đ 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