i18n : 1993 clés, 6 langues, 9 passes de traduction automatique
TAMSIV était né en français. Toute l'interface, chaque message d'erreur — tout en dur dans le code. Quand j'ai décidé de supporter 6 langues (FR, EN, DE, ES, IT, PT), j'ai compté les strings à extraire : 1993 clés de traduction.
L'extraction
Première étape : remplacer chaque string française par un appel t('key'). Dans 35 fichiers. À la main. J'ai structuré les clés par écran : feed.empty_state, agenda.filter.participating, profile.settings.language.
Le script de traduction automatique
Traduire 1993 clés manuellement dans 5 langues ? Impossible. J'ai écrit un script npm run translate qui envoie les clés françaises à OpenRouter (Gemini 2.5 Flash). Le LLM comprend le contexte applicatif — "Mémo vocal" devient "Voice memo" et non "Vocal memo".
Les 9 passes
La première passe a traduit le gros du corpus. Ensuite, chaque nouvelle feature ajoutait des clés : gamification (47 clés), agenda (62), groupes (89). Le script détecte les clés manquantes et ne retraduit que le delta.
La détection automatique de langue
Au premier lancement, TAMSIV détecte la langue du système. Si supportée, on l'utilise. Sinon, fallback sur l'anglais. Le choix est sauvegardé en base.
Garder la synchro
Le plus dur : la maintenance. Chaque modification en français doit être propagée. Si fr.json est modifié, le script tourne automatiquement via GitHub Actions. 6 langues maintenues en quasi-temps réel pour quelques centimes par passe.