How to translate a game’s .po and .mo files (gettext)
The .po is the editable source; the .mo is the compiled catalog the game actually loads — which is why editing the .po alone changes nothing. RuneTranslate reads both, protects %s and {count} placeholders, refits plural forms to your language, and writes a working .mo back.
Si vous avez ouvert le dossier d’un jeu et trouvé un répertoire locale rempli de fichiers .po et .mo, ce jeu est localisé avec gettext — et RuneTranslate peut désormais le traduire de bout en bout, de la création du projet jusqu’à l’export d’une version jouable.
Ce guide explique ce que sont réellement ces deux types de fichiers, pourquoi modifier celui que vous pouvez lire ne change généralement rien en jeu, et comment les traduire correctement.
.po et .mo — la distinction sur laquelle tout le monde bute
Ce sont deux formes du même catalogue :
- `.po` — Portable Object. Un fichier texte que vous pouvez ouvrir dans n’importe quel éditeur. Chaque entrée comporte un
msgid(la chaîne d’origine) et unmsgstr(sa traduction). C’est le fichier dans lequel travaillent les traducteurs. - `.mo` — Machine Object. Une version binaire compilée des mêmes données, organisée pour que le jeu retrouve une chaîne instantanément. C’est le fichier que lit le jeu en cours d’exécution.
Ce dernier point coûte une après-midi à bien des gens. Vous pouvez traduire chaque ligne d’un .po, l’enregistrer, lancer le jeu — et ne voir aucun changement, parce que le jeu n’ouvre jamais le .po. Il charge le .mo situé à côté, qui contient toujours l’ancien texte. Normalement, vous compileriez l’un en l’autre avec msgfmt, des outils GNU gettext. RuneTranslate écrit les deux, il n’y a donc pas d’étape de compilation séparée.
À quoi ressemble le dossier d’un jeu gettext
La disposition canonique est un répertoire locale indexé par code de langue :
MyGame/game.exeMyGame/locale/en/LC_MESSAGES/mygame.moMyGame/locale/fr/LC_MESSAGES/mygame.moMyGame/locale/de/LC_MESSAGES/mygame.mo
Le dossier LC_MESSAGES fait partie de la convention, ce n’est pas une erreur, et mygame est le domaine de texte — le nom que le jeu demande lorsqu’il charge ses chaînes. Beaucoup de jeux utilisent plutôt une forme plus plate, comme lang/fr.po, et cela fonctionne aussi.
Quels jeux utilisent gettext ?
Gettext est né dans le monde Unix et est devenu la manière par défaut de localiser les logiciels écrits en C, en Python et tout ce qui repose sur GTK. Pour les jeux, cela signifie :
- Les jeux en Python et pygame
- Solarus, SDL et d’autres moteurs C/C++
- Les jeux localisés via Poedit, Weblate ou Crowdin, qui parlent tous PO nativement
- Certains projets Godot, qui acceptent PO comme source de traduction
C’est bien plus courant dans les jeux indépendants occidentaux que japonais — les moteurs japonais comme Kirikiri et RPG Maker conservent leur texte dans leurs propres formats.
Traduire un jeu gettext avec RuneTranslate
- Pointez RuneTranslate vers le dossier du jeu. Celui qui contient
locale/,lang/oui18n/. La détection lit les octets réels au lieu de se fier à l’extension : un.moqui est en fait une scène 3D est ignoré plutôt que de produire un projet cassé. - Vérifiez le récapitulatif. Avant de créer le projet, vous voyez le nombre de catalogues, la répartition entre
.mocompilés et.posources, les langues déjà présentes dans le jeu et le nombre total de chaînes. - Choisissez une langue et un fournisseur. Google ou DeepL gratuits, ou votre propre clé DeepL, OpenAI, Claude ou DeepSeek — voyez le comparatif des fournisseurs.
- Relisez, puis exportez. Vous obtenez une copie complète du jeu, traduction en place.
Les deux choses qui cassent discrètement une traduction gettext
Les marqueurs. Un msgid est une chaîne de format, pas un texte fini. Dans Hello, %s!, le nom du joueur est substitué à l’exécution. Les traducteurs automatiques ont tendance à supprimer %s, à l’espacer, ou — avec la forme nommée de Python %(player)s — à traduire le mot à l’intérieur. Les conséquences ne sont pas esthétiques : un %s manquant décale tous les arguments suivants et la plupart des moteurs plantent. RuneTranslate masque chaque marqueur qu’il trouve (%s, %d, %(player)s, {count}, {0}) avant d’envoyer le texte au fournisseur, puis les restaure.
Les formes plurielles. L’anglais en a deux (« 1 coin » / « 5 coins »). Le japonais et le turc, une. Le russe et le polonais, trois. Un catalogue déclare dans son en-tête combien il en utilise, et si ce nombre ne correspond pas à la langue, gettext dépasse la fin de la liste et retombe silencieusement sur l’original non traduit. RuneTranslate réajuste les formes à votre langue cible et réécrit l’en-tête en conséquence.
Pourquoi l’export écrit le catalogue deux fois
L’export produit à la fois une nouvelle langue correcte — locale/<votre langue>/LC_MESSAGES/ — et une copie mise à jour du catalogue que le jeu chargeait déjà.
C’est le second qui fait réellement apparaître la traduction. Un jeu décide de la langue à charger par des chemins que le dossier ne révèle pas : il peut lire la langue du système, un fichier de configuration, un paramètre de lanceur, ou l’avoir codée en dur. Ajouter un catalogue français à un jeu qui ne demande que l’anglais vous laisserait devant une version apparemment inchangée. Écraser le catalogue qu’il charge vraiment supprime cette incertitude. Les deux n’ont lieu que dans la copie exportée — votre dossier de jeu d’origine n’est pas modifié.
Les chaînes que vous n’avez pas traduites conservent la traduction déjà livrée par le jeu : un projet inachevé n’efface jamais la localisation du développeur.
Ce que cela ne peut pas faire
Seul le texte déjà présent dans un catalogue peut être traduit. Si un développeur a codé une chaîne en dur au lieu de la passer par gettext, elle n’est ni dans le .po ni dans le .mo, et aucun outil PO ne peut l’y trouver. C’est une limite du format, pas de l’outil.
RuneTranslate traite aussi le msgid comme le texte source, ce que gettext lui-même spécifie. Quelques projets mettent des msgid en anglais alors que la vraie langue d’origine se trouve dans msgstr ; ceux-là seront traduits depuis l’anglais.
Enfin, si le jeu tourne sur un moteur pris en charge directement — Godot, Unity, Ren’Py — c’est ce moteur qui s’en charge, afin que le reste du texte du jeu soit également accessible, et pas seulement ses catalogues.
Avant de le partager
Lancez la version exportée et lisez quelques écrans. Les menus et les boutons sont la vérification la plus rapide, car c’est là que se trouve l’essentiel du texte de catalogue. Si quelque chose ne va pas — le jeu n’est pas détecté, l’export ne démarre pas, ou le texte est encore dans la langue d’origine — signalez-le depuis le menu Aide de l’application ou sur Discord. Téléchargez RuneTranslate et ouvrez votre premier catalogue.
Prêt à essayer RuneTranslate ?
L'offre gratuite débloque tous les moteurs et tous les fournisseurs de traduction. Supporter (3 $/mois) débloque la vitesse maximale.
Télécharger pour Windows