Nous avons vérifié chaque traduction automatique. Ce sont les vérifications qui étaient erronées.
Langues
Avant de publier notre Kit de traduction, nous l'avons testé sur une petite application d'exemple : 70 chaînes dans six formats (JSON, Flutter ARB, Android, Apple .strings, gettext et Markdown) traduites en allemand, russe, japonais, arabe et espagnol, à l'aide d'un modèle Qwen ouvert (Qwen3.8-Flash-Next, quantifié sur 4 bits) servi par vLLM sur notre propre machine. Chaque chaîne traduite est soumise à des vérifications avant d'être écrite. Quatre des 350 ont été rejetées. Les quatre rejets étaient erronés.
Ce que recherchent les vérifications
Une traduction qui casse une application est pire que l'absence de traduction, donc chaque chaîne doit conserver ses espaces réservés (%1$s, {name}, {{count}}), ses balises, ses sauts de ligne et ses URL ; elle doit être dans le système d'écriture de la langue cible ; elle ne doit pas être vide, démesurée ou laissée en anglais ; et les formes plurielles doivent couvrir exactement les catégories que la langue possède. Une chaîne qui échoue est redemandée avec le problème nommé, et celle qui échoue à nouveau est laissée de côté, de sorte que l'application affiche l'anglais pour cette seule chaîne.
Les quatre rejets
- « Backups » en allemand était « Backups ». La vérification l'a considérée comme non traduite. L'allemand utilise le mot anglais. Un mot identique est souvent correct ; deux mots identiques ou plus ne le sont pas, c'est donc la règle désormais.
- Une ligne russe et une ligne japonaise contenant une adresse e-mail ont échoué à la vérification du système d'écriture : moins de 60 % des lettres étaient cyrilliques ou japonaises, car
[email protected]est écrit en lettres latines. Les adresses sont désormais traitées comme des espaces réservés : elles doivent revenir inchangées et ne comptent pas comme des lettres. - Un message pluriel japonais est revenu sous la forme
{count, plural, =0{連続記録なし} other{{count}日連続}}. La branche{連続記録なし}n'a pas d'espaces, donc le modèle d'espace réservé l'a prise pour une variable appelée 連続記録なし. Les accolades de branche dans les messages pluriels sont désormais structurelles, et les noms d'espaces réservés doivent être en ASCII.
Une fois les vérifications corrigées, une deuxième exécution n'a demandé au modèle que ces quatre chaînes, puisque tout le reste était dans la mémoire de traduction, et a écrit les 350 chaînes en 45 secondes.
La partie que nous pensions échouer et qui n'a pas échoué
Les formes plurielles sont l’endroit où une traduction naïve casse : l’anglais a une forme pour le singulier et une pour le pluriel, le russe en a quatre (un, peu, beaucoup, autre), l’arabe six catégories, le japonais une seule. Nous avons demandé exactement les catégories de la langue cible et vérifié les espaces réservés de chaque forme. Le modèle a écrit « 1 день, 2 дня, 5 дней » pour le russe et les six formes arabes. Toutes les règles de pluriel Android ont passé du premier coup dans les cinq langues, tout comme tous les messages pluriels sauf celui en japonais, que notre vérification a mal interprété.
Ce qu’aucune vérification ne peut détecter
Nous avons ensuite traduit les 22 chaînes web de l’exemple dans les 42 langues que Polyglot connaît : 924 chaînes sur 924 ont passé. En les lisant, l’une d’elles a attiré l’attention. En khmer, « You are offline » avait été traduit par une phrase signifiant « vous êtes en ligne ». C’est un khmer bien formé, dans le bon alphabet, sans rien de manquant, donc toutes les vérifications l’ont accepté. Les vérifications détectent ce qui casse une application ; un sens erroné nécessite une personne qui lit la langue.
À retenir
Les vérifications automatiques sur la sortie d'une machine nécessitent une sortie réelle pour être testées. Les tests unitaires avec des traductions inventées passaient ; un modèle réel écrivant du japonais réel a trouvé les lacunes en quelques minutes. Polyglot est livré avec ces vérifications, corrigées, et avec les tests pour chacun des quatre cas. Les vérifications seules sont gratuites et open source : translation-checks sur GitHub.