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.
Wenn du einen Spielordner geöffnet und darin ein locale-Verzeichnis voller .po- und .mo-Dateien gefunden hast, ist das Spiel mit gettext lokalisiert — und RuneTranslate kann es jetzt vollständig übersetzen, von der Projekterstellung bis zum Export eines spielbaren Builds.
Dieser Leitfaden erklärt, was diese beiden Dateitypen tatsächlich sind, warum das Bearbeiten der lesbaren Datei im Spiel meist nichts ändert, und wie man sie richtig übersetzt.
.po vs. .mo — der Unterschied, über den alle stolpern
Es sind zwei Formen desselben Katalogs:
- `.po` — Portable Object. Eine reine Textdatei, die sich in jedem Editor öffnen lässt. Jeder Eintrag besteht aus
msgid(dem Originalstring) undmsgstr(seiner Übersetzung). In dieser Datei arbeiten Übersetzer. - `.mo` — Machine Object. Eine kompilierte Binärfassung derselben Daten, so angeordnet, dass das Spiel einen String sofort nachschlagen kann. Das ist die Datei, die das laufende Spiel liest.
Genau dieser letzte Punkt kostet viele einen Nachmittag. Du kannst jede Zeile einer .po übersetzen, speichern, das Spiel starten — und siehst keinerlei Änderung, weil das Spiel die .po nie öffnet. Es lädt die .mo daneben, in der noch der alte Text steht. Normalerweise würdest du die eine mit msgfmt aus den GNU-gettext-Tools in die andere kompilieren. RuneTranslate schreibt beide, ein separater Kompilierschritt entfällt.
Wie ein gettext-Spielordner aussieht
Das kanonische Layout ist ein locale-Verzeichnis, nach Sprachcode gegliedert:
MyGame/game.exeMyGame/locale/en/LC_MESSAGES/mygame.moMyGame/locale/fr/LC_MESSAGES/mygame.moMyGame/locale/de/LC_MESSAGES/mygame.mo
Der Ordner LC_MESSAGES gehört zur Konvention und ist kein Versehen; mygame ist die Text-Domain — der Name, den das Spiel beim Laden seiner Strings anfordert. Viele Spiele nutzen stattdessen eine flachere Form wie lang/fr.po, und auch das funktioniert.
Welche Spiele nutzen gettext?
Gettext stammt aus der Unix-Welt und wurde zum Standardweg, Software in C, Python und allem GTK-Basierten zu lokalisieren. Bei Spielen heißt das:
- Python- und pygame-Spiele
- Solarus, SDL und andere C/C++-Engines
- Spiele, die über Poedit, Weblate oder Crowdin lokalisiert wurden — alle sprechen PO nativ
- Manche Godot-Projekte, die PO als Übersetzungsquelle unterstützen
In westlichen Indie-Spielen ist es weit verbreiteter als in japanischen — japanische Engines wie Kirikiri und RPG Maker halten ihren Text in eigenen Formaten.
Ein gettext-Spiel mit RuneTranslate übersetzen
- Richte RuneTranslate auf den Spielordner. Auf den mit
locale/,lang/oderi18n/darin. Die Erkennung liest die tatsächlichen Bytes statt der Endung zu vertrauen, sodass eine.mo, die in Wahrheit eine 3D-Szene ist, ignoriert wird, statt ein kaputtes Projekt zu erzeugen. - Prüfe die Übersicht. Vor dem Anlegen des Projekts siehst du die Anzahl der Kataloge, die Aufteilung zwischen kompilierten
.mound Quell-.po, welche Sprachen das Spiel schon mitbringt und die Gesamtzahl der Strings. - Wähle Sprache und Anbieter. Kostenloses Google oder DeepL, oder dein eigener Schlüssel für DeepL, OpenAI, Claude oder DeepSeek — siehe den Anbietervergleich.
- Prüfen, dann exportieren. Du erhältst eine vollständige Kopie des Spiels mit eingesetzter Übersetzung.
Die zwei Dinge, die gettext-Übersetzungen unbemerkt zerstören
Platzhalter. Eine msgid ist ein Formatstring, kein fertiger Satz. In Hello, %s! wird zur Laufzeit der Spielername eingesetzt. Maschinelle Übersetzer neigen dazu, %s zu löschen, es auseinanderzuziehen oder — bei Pythons benannter Form %(player)s — das Wort darin zu übersetzen. Die Folgen sind nicht kosmetisch: ein fehlendes %s verschiebt alle nachfolgenden Argumente, und die meisten Engines stürzen ab. RuneTranslate maskiert jeden gefundenen Platzhalter (%s, %d, %(player)s, {count}, {0}), bevor der Text zum Anbieter geht, und stellt ihn danach wieder her.
Pluralformen. Englisch hat zwei („1 coin“ / „5 coins“), Japanisch und Türkisch eine, Russisch und Polnisch drei. Ein Katalog erklärt im Header, wie viele er verwendet; stimmt diese Zahl nicht zur Sprache, greift gettext über das Listenende hinaus und fällt stillschweigend auf das unübersetzte Original zurück. RuneTranslate passt die Formen an deine Zielsprache an und schreibt den Header entsprechend neu.
Warum der Export den Katalog zweimal schreibt
Der Export erzeugt sowohl eine korrekte neue Sprache — locale/<deine Sprache>/LC_MESSAGES/ — als auch eine aktualisierte Kopie des Katalogs, den das Spiel bereits geladen hat.
Der zweite sorgt dafür, dass die Übersetzung tatsächlich erscheint. Ein Spiel entscheidet auf Wegen über seine Sprache, die der Ordner nicht verrät: über die Systemsprache, eine Konfigurationsdatei, ein Launcher-Flag oder schlicht fest verdrahtet. Einem Spiel, das nur Englisch anfordert, einen deutschen Katalog hinzuzufügen, ließe dich vor einem scheinbar unveränderten Build sitzen. Den tatsächlich geladenen Katalog zu überschreiben, nimmt das Rätselraten heraus. Beides passiert ausschließlich in der exportierten Kopie — dein Originalordner bleibt unangetastet.
Nicht übersetzte Strings behalten die Übersetzung, die das Spiel schon mitbrachte, sodass ein halbfertiges Projekt die Lokalisierung des Entwicklers nie leert.
Was damit nicht geht
Übersetzt werden kann nur Text, der bereits in einem Katalog steht. Hat ein Entwickler einen String fest im Code notiert, statt ihn durch gettext zu führen, steht er weder in der .po noch in der .mo, und kein PO-Werkzeug findet ihn dort. Das ist eine Grenze des Formats, nicht des Programms.
RuneTranslate behandelt die msgid außerdem als Quelltext — so sieht es gettext selbst vor. Einige Projekte führen englische msgids, während die eigentliche Ausgangssprache im msgstr steht; diese werden aus dem Englischen übersetzt.
Läuft das Spiel schließlich auf einer direkt unterstützten Engine — Godot, Unity, Ren’Py —, übernimmt diese Engine, damit auch der übrige Text des Spiels erreichbar ist und nicht nur seine Kataloge.
Bevor du es weitergibst
Starte den exportierten Build und lies ein paar Bildschirme. Menüs und Schaltflächen sind die schnellste Probe, denn dort steckt der meiste Katalogtext. Wenn etwas nicht stimmt — das Spiel wird nicht erkannt, der Export startet nicht, oder der Text ist noch in der Originalsprache —, melde es über das Hilfemenü der App oder in Discord. Lade RuneTranslate herunter und öffne deinen ersten Katalog.
Bereit, RuneTranslate auszuprobieren?
Der Free-Tarif schaltet jede Engine + jeden Übersetzungsanbieter frei. Supporter ($3/Mon.) schaltet volle Geschwindigkeit frei.
Für Windows herunterladen