Unity vous propose trois façons d’exporter vos String Tables, et celle que vous choisissez détermine la structure de tout le travail. Pas la qualité, pas le coût : la structure. Une méthode vous donne un fichier unique avec une colonne par langue. Une autre vous donne un fichier par langue. Choisir la mauvaise méthode par rapport à votre façon de travailler peut transformer un travail de deux heures en un chantier de quinze jours.
C’est un guide sur ces trois options, sur ce qu’elles contiennent réellement et sur la manière de lancer la traduction sans avoir à modifier manuellement une seule ligne.
Les trois voies de sortie d’une String Table Collection
Le package de localisation de Unity exporte les String Table Collections vers CSV, XLIFF et Google Sheets. C’est tout le menu, et AI Glot lit nativement ces trois formats, donc aucune étape de conversion n’est nécessaire.
Cependant, ils ne sont pas interchangeables, et c’est là que ces deux minutes d’attention sont utiles :
- One file for every language
- One column per locale, side by side
- One job fills all of them
- Easy to eyeball in a spreadsheet
- Matches on Key or Id at import
- One file per target language
- Each file is one source and one target
- Ten languages is ten files
- What a translation vendor usually asks for
- Version 1.2 or 2.0, your choice
Le CSV regroupe vos langues. Un tableau peut contenir autant de colonnes que vous le souhaitez, donc un seul fichier contient l’anglais, le français, le japonais et tout le reste en même temps. Une seule tâche de traduction peut ainsi remplir toutes les colonnes vides en un seul passage.
L’XLIFF les sépare. Par conception, un fichier XLIFF associe une seule source à une seule cible. Unity génère donc un fichier distinct par langue et ajoute le code langue au nom : une collection appelée MyGame sera exportée sous MyGame-ru pour le russe, MyGame-ja pour le japonais. Ce n’est pas une limitation de Unity, c’est la nature du format. Unity supporte à la fois XLIFF 1.2 et 2.0, et AI Glot lit les deux.
Google Sheets, c’est le format CSV avec un bouton de synchronisation. Envoyez votre collection vers une feuille, puis récupérez-la une fois remplie. Si vous travaillez déjà ainsi, exportez la feuille en CSV ou XLSX et le processus sera identique à la méthode CSV.
Voici donc la recommandation honnête : choisissez le CSV, à moins qu’un outil en aval n’exige du XLIFF. Dix langues dans un seul fichier, c’est une seule tâche à lancer, un seul plan à lire et un seul fichier à réimporter.
Ce que contient réellement l’export CSV
Ouvrez-le une fois et tout le flux de travail devient limpide. Un export basique possède une colonne Key, une colonne Id, et une colonne par locale nommée selon la langue et son code, comme English(en) et French(fr). Si vous exportez avec les commentaires, vous obtenez également une colonne Shared Comments ainsi qu’une colonne par locale telle que French(fr) Comments.
Key,Id,English(en),French(fr)MENU_BTN_START,4102,Start game,MENU_BTN_START,4102,Start game,CommencerHUD_AMMO_LEFT,4103,{0} rounds left,HUD_AMMO_LEFT,4103,{0} rounds left,{0} balles restantesNPC_SMITH_GREET,4104,Need something forged?,NPC_SMITH_GREET,4104,Need something forged?,Une pièce à forger ?Deux colonnes déterminent si votre import fonctionnera ou non.
Key et Id servent de point de liaison. Unity s’appuie sur elles pour faire correspondre les lignes lors de la réimportation, en utilisant les noms d’en-tête des colonnes pour les trouver. Une Key traduite ne provoque pas d’erreur flagrante : la ligne cesse simplement de correspondre, et une chaîne revient silencieusement à sa valeur de secours dans toutes les langues. Précisez clairement quelles colonnes traduire et lesquelles laisser intactes, et cela n’arrivera pas.
Les colonnes de commentaires sont du contexte, pas du contenu. Si votre équipe écrit des notes pour les traducteurs dans Shared Comments, ces notes sont utiles à lire, mais elles ne doivent pas être traduites. Nommez-les.
Ce qui pose problème, et ce n’est pas le timing
Les Smart Strings de Unity sont le véritable danger dans la String Table d’un jeu, car elles sont invisibles pour tout outil qui traduit mot par mot.
Une Smart String contient de la logique à l’intérieur du texte. Un espace réservé vide est {}. Un espace nommé donne du contexte au traducteur, comme {PlayerName}. Les pluriels suivent les règles Unicode CLDR via un formateur, donc une seule entrée peut ressembler à {0:plural:is 1 item|are {} items}. Elles peuvent aussi être imbriquées : {User.Address:{Street}, {City}}.
Un traducteur qui ne connaît pas la syntaxe pourrait réorganiser les accolades, traduire le mot plural, ou transformer utilement {PlayerName} en {NomDuJoueur}. Chacun de ces changements provoquera un crash à l’exécution plutôt qu’une simple faute de frappe, et vous ne le découvrirez que lorsqu’un joueur vous enverra une capture d’écran.
Ceci doit faire l’objet d’une instruction au niveau de la chaîne, et maîtriser cette distinction est l’élément le plus utile de cet article.
- Decides WHICH text is translated
- Read once, against the file
- "Fill the empty French column"
- "Leave Key, Id and the comments alone"
- Decides HOW each line is written
- Applied as every single string is written
- "Keep every {curly-brace} placeholder exactly as written"
- "Keep UI labels under 20 characters"
Placer une règle sur les espaces réservés dans le plan ne servira à rien. Placer une règle de colonne dans l’emplacement dédié aux chaînes ne produira aucun effet, silencieusement, car aucun fichier n’est visible à ce stade. Ces deux erreurs sont discrètes, c’est pourquoi elles méritent trente secondes d’attention.
Pendant que vous y êtes, voici l’autre règle spécifique aux jeux : un bouton qui tient en anglais déborde en allemand. Le texte traduit est généralement 15 à 30% plus long. Une instruction au niveau de la chaîne peut imposer un plafond de caractères, afin que la ligne soit écrite pour s’adapter plutôt que d’être coupée après coup. Précisez-le une fois pour les entrées situées dans une UI à largeur fixe.
Option 1 : utiliser le navigateur
Téléchargez le CSV via le traducteur CSV ou dans l’application, puis décrivez la tâche en une phrase. Quelque chose comme ceci, et c’est volontairement très simple :
The source is the English(en) column. Fill the empty French(fr), German(de)
and Japanese(ja) columns. Leave Key, Id, English(en) and every Comments
column exactly as they are.
Vous recevez un plan avant tout engagement de crédits : les colonnes détectées, la portée, le nombre de mots et le coût. S’il a mal interprété votre fichier, corrigez-le en une phrase et il génère un nouveau plan. Tout est gratuit jusqu’à l’approbation, donc une mauvaise lecture ne vous coûte rien d’autre que le temps de retaper une clause.
Ensuite, téléchargez le CSV, avec les mêmes colonnes, les mêmes Key et Id, et réimportez-le dans Unity.
Option 2 : votre agent gère tout le cycle
Si vous travaillez avec Claude, Cursor, Copilot ou tout agent capable d’exécuter des commandes dans votre projet, il peut tout faire sans que vous n’ayez à ouvrir de navigateur, et peut replacer les résultats là où Unity les attend.
Installez et connectez-vous une seule fois :
npm install --global @ai-glot/cli
aiglot auth login
- 1ExportString Tables to CSVIn Unity
- 2CreateOne job, all localesFree
- 3Read the planColumns, words, costFree
- 4ApproveYour decision, and the only spendSpends credits
- 5Write backInto the repo, ready to importAgent
Voici un prompt que vous pouvez donner à votre agent. Il est conçu pour être copié-collé, et les points essentiels sont expliqués ci-dessous.
Our Unity String Table export is at Assets/Localization/Export/MyGame.csv.
Columns: Key, Id, English(en), and empty columns for French(fr), German(de)
and Japanese(ja).
Use the aiglot CLI to translate it. Run `aiglot batches create --help` and
`aiglot batches approve --help` first so you use the real flags.
Plan instruction: the source is English(en); fill only the empty French(fr),
German(de) and Japanese(ja) cells; leave Key, Id, English(en) and any
Comments column untouched.
Approval instructions: keep every curly-brace placeholder exactly as written,
including plural formatters and nested ones; never translate a placeholder
name; keep entries whose Key starts with MENU_ or HUD_ under 20 characters.
Use the lite quality tier. Show me the plan and the total cost BEFORE you
approve anything, then wait for me to confirm.
After I confirm, poll until it reaches a terminal status, download the result
over the original path, and tell me the row count so I can re-import in Unity.
Il demande à l’agent de lire l’aide d’abord. Un agent qui devine le nom des flags échoue dès le premier appel et invente ensuite une raison.
Il sépare explicitement les deux types d’instructions, ce qui est tout l’intérêt de la section précédente. Rédigé ainsi, l’agent place chaque élément au bon endroit au lieu de tout fusionner en un bloc semi-fonctionnel.
Il s’arrête avant la dépense. aiglot batches approve est la seule commande qui consomme des crédits. Tout ce qui précède est gratuit et répétable, donc un agent qui bouclerait sur vos locales sans surveillance ne peut pas vous surprendre avec une facture. C’est cette caractéristique qui rend l’usage d’un agent raisonnable plutôt que risqué.
Il se termine par un chiffre à vérifier. Demander le nombre de lignes vous permet d’effectuer un test de cohérence rapide avant la réimportation.
Pour référence, voici la séquence obtenue :
# 1. Create the job. Free. Returns a plan and an id.
id=$(aiglot batches create Assets/Localization/Export/MyGame.csv \
--instruction "The source is English(en). Fill only the empty French(fr), German(de) and Japanese(ja) cells. Leave Key, Id, English(en) and Comments columns unchanged." \
--json | jq -r '.data.id')
# 2. Read the plan for free, and only then commit.
aiglot batches get "$id" --json | jq '.data.plan'
# 3. The only step that spends credits.
aiglot batches approve "$id" --quality lite \
--instructions "Keep every curly-brace placeholder exactly as written. Never translate a placeholder name. Keep MENU_ and HUD_ entries under 20 characters."
# 4. Wait for a TERMINAL status, not for a specific one.
until status=$(aiglot batches get "$id" --json | jq -r '.data.status'); \
[ "$status" = "completed" ] || [ "$status" = "failed" ] || [ "$status" = "cancelled" ]; do
sleep 5
done
# 5. Back into the project.
[ "$status" = "completed" ] && \
aiglot batches download "$id" --output Assets/Localization/Export/MyGame.csv
Il existe également un serveur MCP, aiglot mcp, si votre agent préfère les outils au shell. Commencez par le CLI : il fonctionne dans un script, dans la CI, et vous pouvez lire exactement ce qui a été exécuté.
Si vous avez choisi l’option XLIFF
Un fichier par langue signifie une tâche par langue, ce qui est acceptable jusqu’à ce qu’il y en ait dix. Voici deux façons de gérer cela.
Mettez-les dans un seul ZIP. Jusqu’à 200 fichiers et 20 Mo, avec 4 Mo par fichier. Chaque XLIFF de l’archive doit être de la même version, 1.2 ou 2.0, mais ils peuvent avoir des langues cibles différentes, ce qui correspond exactement au format d’exportation de Unity. Une seule tâche, une seule instruction et un seul glossaire appliqués à l’ensemble.
Ou bouclez avec le CLI, comme le fait le prompt ci-dessus, un batch par fichier. Cela fait plus de tâches, mais chaque plan peut être examiné séparément, ce que préfèrent certaines équipes pour un premier essai. Dans les deux cas, les fichiers reviennent au format XLIFF dans la version d’origine, avec les segments source intacts et seulement les cibles remplies.
Le facteur clé de la qualité : votre propre vocabulaire
Tout ce qui précède relève de la technique. La raison pour laquelle un jeu traduit se lit bien ou mal dépend de la cohérence de vos termes.
Renseignez une seule fois dans le glossaire de l’espace de travail les mots qui ne doivent pas varier : noms de personnages, d’objets et de sorts, noms de factions, ou la traduction officielle d’une réplique récurrente. Ce glossaire appartient à l’espace de travail et non à une seule tâche, il s’applique donc à chaque String Table envoyée ultérieurement, y compris l’exportation que vous ferez dans six mois quand le jeu aura grandi de quatre mille entrées. C’est ce qui permet au fichier numéro vingt d’être cohérent avec le fichier numéro un.
Laissez votre agent s’en charger. Le glossaire est accessible via MCP, avec des outils pour lister, lire et modifier les termes. Ainsi, l’agent qui vient de lire vos tables de chaînes peut extraire les noms propres et les mots inventés récurrents, vous soumettre la liste et inscrire les termes approuvés dans l’espace de travail avant le premier lancement de la traduction. Un glossaire que personne ne remplit ne sert à rien, et pour un jeu contenant un millier de termes inventés, le remplir à la main est la tâche que l’on repousse indéfiniment.
C’est là qu’un traducteur automatique généraliste échoue, et la raison est mécanique plutôt qu’une question de style. Son glossaire substitue un terme dès qu’il y a correspondance, sans reconsidérer la phrase environnante. Ici, le glossaire est intégré comme une donnée sémantique pendant l’écriture de la ligne, ainsi un nom s’inflette selon la grammaire au lieu d’être simplement parachuté au milieu de celle-ci.
La portée réelle de l’outil
Ne passez pas vos premières heures de jeu par cet outil pour les publier telles quelles. Les trente premières minutes d’un jeu, la page du magasin et tout ce qu’un joueur est susceptible de citer relèvent de l’écriture, et l’écriture mérite un humain. Il s’agit de quelques centaines de mots qui portent la majeure partie de votre risque réputationnel. Payer un expert natif pour cela ne coûte pas cher en termes absolus et en vaut évidemment la peine.
Les neuf mille autres entrées constituent un travail différent, et c’est cette distinction qu’il faut assimiler: le volume et l’importance ne sont pas corrélés. Les libellés de menus, les infobulles, les descriptions d’objets, les journaux de quêtes, les textes de succès, les chaînes d’erreur: c’est là que partent réellement les heures, et c’est misérable à la main et banal en une seule passe. Traitez le gros du volume ici, puis choisissez votre propre niveau d’exigence: injectez-le directement dans le build, ou ajoutez une révision professionnelle pour vos deux marchés principaux, ou seulement pour les textes de quêtes, et laissez le reste tel quel. Aucune de ces options n’est une réparation d’un premier passage raté, et toutes elles consacrent le temps de votre réviseur à la langue plutôt qu’aux feuilles de calcul.
Si vous voulez tester cela sur un vrai fichier avant de vous engager dans un pipeline, le traducteur CSV accepte un export sans compte. Pour une vision d’ensemble, consultez notre guide pour traduire un jeu vidéo, et la page de localisation de jeux couvre les formats au-delà de Unity si votre studio publie sur plusieurs moteurs.
Le comportement d’exportation de Unity décrit ici provient de la documentation du package Localization pour la version 1.5: la disposition des colonnes CSV, la correspondance Key et Id, les colonnes de commentaires, le support XLIFF 1.2 et 2.0, et le nommage XLIFF par langue. Vérifiez votre propre version du package si votre export semble différent. Les limites de fichiers citées sont celles en vigueur au moment de la rédaction.