Un site qui parle des dizaines de langues, sans traducteurs
Traduit automatiquement de l’italien · voir l’original
Comment nous avons construit le système de traduction qui alimente ces pages : IA à la demande, cache toujours, zéro temps d'attente perçu.
Le problème de l'i18n traditionnel
Pendant des années, l'internationalisation d'un site web a été une petite odyssée de workflows : fichiers .po, traducteurs humains, clés oubliées, déploiements retardés parce que "le allemand manque encore". Ajouter une langue coûtait du temps et de l'argent ; en ajouter dix était hors de question pour toute petite entreprise.
Avec les LLM de dernière génération, la qualité de la traduction automatique a atteint un point où — pour un site d'entreprise, pas pour la littérature — elle est suffisante. La question n'est plus "pouvons-nous le traduire automatiquement", mais "comment l'intégrons-nous sans casser l'expérience utilisateur".
L'architecture, en bref
Le site est servi statiquement en italien. Lorsqu'un utilisateur choisit une autre langue, un petit moteur entre en jeu sur trois collections MongoDB :
i18n_base: les textes sources dans la langue choisie (aujourd'hui l'italien), chacun avec la déclaration de sa propre langue, une description de l'endroit et de la raison pour laquelle il apparaît sur le site (essentiel pour la qualité de la traduction), le ton et la limite de caractères. Cette description fait partie du prompt envoyé au LLM, qui sait ainsi s'il traduit un bouton ou un paragraphe.i18n_human: les traductions revues et corrigées à la main, lorsque pour certaines pages nous voulons une qualité éditoriale au lieu du résultat du LLM. Elles ont la priorité sur le cache automatique et se "démarquent" automatiquement lorsque le texte source change.i18n_cache: les traductions déjà générées, indexées par (champ, langue). Chaque entrée conserve le timestamp du texte de base au moment de la génération.articoli_i18n: même logique appliquée aux contenus plus longs, comme cet article.
Lors du premier accès dans une nouvelle langue, le système demande au LLM uniquement les champs réellement manquants, enregistre la réponse dans le cache et la renvoie au navigateur. Lors des visites suivantes, la même langue arrive instantanément, sans plus d'appels à l'IA.
L'invalidation qui fonctionne
Un cache est un mensonge ordonné : il dit "ma vérité est celle-ci" jusqu'à ce que quelqu'un le contredise. Le mécanisme de réfutation ici est simple : chaque traduction mise en cache stocke le timestamp du texte source qui l'a générée. Lorsque vous modifiez le texte italien et incrémentez son updated_at, toutes les traductions de ce champ dans toutes les langues deviennent automatiquement obsolètes et sont régénérées au besoin. Zéro cascades manuelles, aucun cache à vider.
L'utilisateur qui n'attend pas
La partie la plus intéressante n'est pas la traduction — c'est la façon dont elle est affichée. Lors du changement de langue, le navigateur se retrouve face à une page italienne avec de petits indicateurs de chargement à côté de chaque bloc de texte à mettre à jour. La tentation est de faire un seul appel qui traduit tout ensemble : simple, propre, et condamne l'utilisateur à attendre que le LLM ait fini avant de voir le moindre changement.
Nous avons pris la direction opposée. Les textes sont regroupés par section (navbar, corps, footer) et divisés en micro-lots de trois champs chacun. Les appels partent en séquence : d'abord les quelques champs de la navbar, qui apparaissent en quelques secondes — l'utilisateur voit que quelque chose se passe et commence à lire. Pendant qu'il lit, arrive la première partie du corps, puis la seconde, enfin le footer.
Le travail de nuit
Un cache n'a qu'un seul véritable ennemi : la première visite. Le premier utilisateur allemand paie le prix de toutes les traductions futures, et c'est son expérience qui lui reste en tête. Pour éliminer (ou presque) le problème, une tâche en arrière-plan se réveille chaque minute, choisit la langue la plus attendue parmi celles encore incomplètes, prend un texte non traduit et le fait passer par le LLM. La minute suivante, le suivant. En quelques jours, les langues les plus répandues sont déjà toutes prêtes.
La tâche nocturne fait également un second métier : elle révise automatiquement les traductions de qualité douteuse, en les retentant avec un modèle IA différent. Lorsque l'alignement entre les langues est important, une traduction médiocre ne reste pas telle quelle.
Si vous êtes le premier Allemand de la journée et que vous arrivez pendant que le système termine encore le cache, vous avez toujours le chargement progressif pour vous occuper. Si vous êtes le deuxième, vous ne vous en apercevez même pas.
Ce que cela apporte
Un site multilingue sans traducteurs, sans fichiers à gérer, sans déploiement pour ajouter une langue. L'utilisateur saisit un code — ja, ca, eu, ce qu'il veut — et la page se traduit. La deuxième fois, c'est instantané. À la troisième, nous y sommes très probablement déjà parvenus, traduite au bon moment par une tâche qui ne dort jamais.
Cette même page, si vous la lisez en allemand, en espagnol, en coréen, n'a jamais été écrite par un traducteur. Elle a été traduite une seule fois, par un LLM, et depuis lors, elle est servie depuis le cache. La seule chose écrite à la main est ce que vous lisez maintenant si c'est en italien.
Intéressé par l'intégration de cette architecture sur votre site ? Parlons-en.
Contactez-nous
Une observation ? Écrivez-nous
Ce message nous est adressé uniquement. Si votre commentaire est pertinent, il pourrait être publié en bas de l'article, après validation.
Pendant que vous écrivez, votre navigateur résout un petit calcul : c'est notre méthode pour bloquer les envois automatiques sans service tiers ni reconnaissance de captcha. Rien ne vous est demandé et aucune donnée ne quitte ce site.