Perso · Méthode
Knowledge Hub bilingue : version anglaise + auto-traduction
Contexte
Je maîtrise le FR et l'EN, et je voulais ouvrir le site à un public anglophone. J'ai d'abord demandé une étude d'impact et de charge avant de lancer quoi que ce soit.
Première surprise en explorant le repo : la branche de travail de départ était périmée — elle ne contenait qu'une poignée de pages, alors que le vrai site sur main fait ~76 pages (≈44 entrées de journal, ~20 guides, les pages projets, veille IA, lexique…). J'ai donc resynchronisé sur main avant tout, sinon je traduisais un site fantôme.
Contraintes à respecter : site statique (HTML/CSS, zéro dépendance, GitHub Pages), socle SEO/GEO existant (JSON-LD, llms.txt) à préserver, et un ton direct/chaleureux à garder à l'identique en anglais.
Ce qui a été fait
Architecture : anglais en miroir sous /en/, FR conservé à la racine (hreflang x-default = FR), zéro JS pour la bascule. Mêmes slugs FR/EN pour fiabiliser le mapping.
Socle (scripts réutilisables dans scripts/) :
i18n_scaffold.py: génère le miroir/en/, injectehreflangfr/en/x-default +canonical/og:localepar langue, et un sélecteur de langue FR/EN dans la nav de chaque page.search.js/lexique.jsrendus bilingues (détection de/en/→ index, glossaire et libellés EN).build_sitemap.py:sitemap.xmlbilingue avec alternancesxhtml:link(146 URLs).i18n_us_spelling.py: normalisation en anglais US (organize, color, analyze…), en protégeant les slugs d'URL et les tags.i18n_normalize_nav.py: uniformisation nav/footer (Glossary, AI Watch, Connect…).en/llms.txt+en/llms-full.txt, et pointeur EN dans lellms.txtFR.
Traduction (~59 000 mots) : j'ai traduit les pages piliers à la main (accueil, méthode, à propos) pour fixer le ton de référence, puis lancé 7 sous-agents en parallèle pour les 20 guides, les 43 entrées de journal et les pages structurelles, le tout cadré par un TRANSLATION_GUIDE.md (ton, règles, zones à ne pas toucher, glossaire imposé).
Automatisation : .github/workflows/i18n-translate.yml + scripts/auto_translate.py (appel API Claude en urllib, zéro dépendance). À chaque page FR poussée sur main, il (re)traduit sa jumelle EN et ouvre une PR à relire. Secret requis : ANTHROPIC_API_KEY (configuré côté GitHub, jamais dans le repo).
Bug corrigé en cours de route : le script ré-échafaudait une source FR déjà balisée i18n → il régressait nav/footer et cassait les hreflang. Passage en mode « splice » : on garde le chrome EN existant et on ne re-traduit que <main> + les méta (title/description/og), avec échappement des guillemets (" → ").
Commandes types :
python3 scripts/i18n_scaffold.py # génère/rafraîchit le miroir /en/ python3 scripts/build_sitemap.py # sitemap bilingue python3 scripts/auto_translate.py guides/<page>.html # traduit la jumelle EN
Résultat & suite
En prod : le site est désormais bilingue, FR par défaut à la racine et EN en miroir sous /en/, avec sélecteur de langue, hreflang, sitemap bilingue (146 URLs) et recherche/lexique adaptés à la langue. Le socle SEO/GEO (JSON-LD, llms.txt) est préservé dans les deux langues.
Surtout, la suite est automatique : chaque nouvelle page FR poussée déclenche la traduction de sa jumelle EN via GitHub Actions, livrée en PR à relire. La leçon clé : ne jamais ré-échafauder une page déjà balisée — isoler la traduction au seul contenu (<main> + méta) évite de casser le maillage et les balises de langue.