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.
Jika Anda membuka folder gim dan menemukan direktori locale berisi berkas .po dan .mo, gim itu dilokalkan dengan gettext — dan RuneTranslate kini bisa menerjemahkannya dari awal sampai akhir, dari pembuatan proyek hingga mengekspor build yang bisa dimainkan.
Panduan ini menjelaskan apa sebenarnya kedua jenis berkas itu, mengapa menyunting berkas yang bisa Anda baca biasanya tidak mengubah apa pun di dalam gim, dan bagaimana menerjemahkannya dengan benar.
.po vs .mo — perbedaan yang membuat semua orang tersandung
Keduanya adalah dua bentuk dari katalog yang sama:
- `.po` — Portable Object. Berkas teks biasa yang bisa dibuka di editor mana pun. Setiap entri berisi
msgid(string asli) danmsgstr(terjemahannya). Inilah berkas yang dikerjakan penerjemah. - `.mo` — Machine Object. Versi biner terkompilasi dari data yang sama, disusun agar gim bisa mencari string secara instan. Inilah berkas yang dibaca gim saat berjalan.
Poin terakhir itulah yang memakan waktu banyak orang. Anda bisa menerjemahkan setiap baris .po, menyimpannya, menjalankan gim — dan tidak melihat perubahan apa pun, karena gim tidak pernah membuka .po. Yang dimuat adalah .mo di sebelahnya, yang masih menyimpan teks lama. Biasanya Anda mengompilasi yang satu menjadi yang lain dengan msgfmt dari perkakas GNU gettext. RuneTranslate menulis keduanya, jadi tidak ada langkah kompilasi terpisah.
Seperti apa folder gim gettext
Tata letak kanonisnya adalah direktori locale yang dikunci berdasarkan kode bahasa:
MyGame/game.exeMyGame/locale/en/LC_MESSAGES/mygame.moMyGame/locale/fr/LC_MESSAGES/mygame.moMyGame/locale/de/LC_MESSAGES/mygame.mo
Folder LC_MESSAGES adalah bagian dari konvensi, bukan kekeliruan, dan mygame adalah domain teks — nama yang diminta gim saat memuat stringnya. Banyak gim justru memakai bentuk yang lebih datar seperti lang/fr.po, dan itu juga berfungsi.
Gim apa saja yang memakai gettext?
Gettext lahir di dunia Unix dan menjadi cara baku melokalkan perangkat lunak yang ditulis dengan C, Python, dan segala sesuatu berbasis GTK. Dalam gim itu berarti:
- Gim Python dan pygame
- Solarus, SDL, dan mesin C/C++ lainnya
- Gim yang dilokalkan lewat Poedit, Weblate, atau Crowdin, yang semuanya memahami PO secara native
- Sebagian proyek Godot, yang mendukung PO sebagai sumber terjemahan
Jauh lebih umum pada gim indie Barat daripada gim Jepang — mesin Jepang seperti Kirikiri dan RPG Maker menyimpan teksnya dalam format sendiri.
Menerjemahkan gim gettext dengan RuneTranslate
- Arahkan RuneTranslate ke folder gim. Folder yang berisi
locale/,lang/, ataui18n/. Deteksi membaca bita sebenarnya alih-alih memercayai ekstensi, sehingga.moyang ternyata adegan 3D diabaikan, bukan menghasilkan proyek rusak. - Periksa ringkasannya. Sebelum membuat proyek, Anda melihat jumlah katalog, pembagian antara
.moterkompilasi dan.posumber, bahasa apa saja yang sudah disertakan gim, serta total stringnya. - Pilih bahasa dan penyedia. Google atau DeepL gratis, atau kunci DeepL, OpenAI, Claude, DeepSeek milik Anda — lihat perbandingan penyedia.
- Tinjau, lalu ekspor. Anda memperoleh salinan lengkap gim dengan terjemahan sudah terpasang.
Dua hal yang diam-diam merusak terjemahan gettext
Placeholder. Sebuah msgid adalah string format, bukan kalimat jadi. Pada Hello, %s!, nama pemain disubstitusikan saat runtime. Penerjemah mesin cenderung menghapus %s, memberinya spasi, atau — pada bentuk bernama milik Python %(player)s — menerjemahkan kata di dalamnya. Akibatnya bukan sekadar tampilan: satu %s yang hilang menggeser semua argumen berikutnya, dan sebagian besar mesin langsung crash. RuneTranslate menyamarkan setiap placeholder yang ditemukannya (%s, %d, %(player)s, {count}, {0}) sebelum teks dikirim ke penyedia, lalu memulihkannya.
Bentuk jamak. Bahasa Inggris punya dua (“1 coin” / “5 coins”). Jepang dan Turki satu. Rusia dan Polandia tiga. Katalog menyatakan berapa banyak yang dipakainya di header, dan bila angka itu tidak cocok dengan bahasanya, gettext mengindeks melewati ujung daftar lalu diam-diam jatuh kembali ke teks asli yang belum diterjemahkan. RuneTranslate menyesuaikan bentuknya dengan bahasa tujuan Anda dan menulis ulang headernya.
Mengapa ekspor menulis katalog dua kali
Ekspor menghasilkan bahasa baru yang benar — locale/<bahasa Anda>/LC_MESSAGES/ — sekaligus salinan terbarui dari katalog yang sudah dimuat gim.
Yang kedua itulah yang membuat terjemahan benar-benar muncul. Gim menentukan lokal yang dimuat lewat cara yang tak tampak dari isi folder: bisa membaca bahasa sistem operasi, berkas konfigurasi, flag peluncur, atau sekadar dipatok dalam kode. Menambahkan katalog Indonesia ke gim yang hanya pernah meminta bahasa Inggris akan membuat Anda menatap build yang seakan tidak berubah. Menimpa katalog yang memang dimuat menghapus tebak-tebakan itu. Keduanya hanya terjadi pada salinan hasil ekspor — folder gim asli Anda tidak diubah.
String yang belum Anda terjemahkan tetap memakai terjemahan bawaan gim, sehingga proyek yang belum selesai tidak pernah mengosongkan pelokalan milik pengembang.
Yang tidak bisa dilakukan
Hanya teks yang sudah ada di katalog yang bisa diterjemahkan. Jika pengembang menuliskan string langsung di kode alih-alih melewatkannya ke gettext, string itu tidak ada di .po maupun .mo, dan tidak ada perkakas PO yang bisa menemukannya di sana. Itu batas formatnya, bukan batas aplikasinya.
RuneTranslate juga memperlakukan msgid sebagai teks sumber, sesuai ketentuan gettext sendiri. Beberapa proyek memasang msgid berbahasa Inggris sementara bahasa asli sebenarnya ada di msgstr; yang seperti itu akan diterjemahkan dari bahasa Inggris.
Terakhir, jika gim berjalan di mesin yang didukung langsung — Godot, Unity, Ren’Py — mesin itulah yang menanganinya, agar sisa teks gim juga terjangkau, bukan hanya katalognya.
Sebelum Anda membagikannya
Jalankan build hasil ekspor dan baca beberapa layar. Menu dan tombol adalah pemeriksaan tercepat, karena di situlah sebagian besar teks katalog berada. Jika ada yang salah — gim tidak terdeteksi, hasil ekspor tidak jalan, atau teks masih berbahasa asli — laporkan lewat menu Bantuan aplikasi atau di Discord. Unduh RuneTranslate dan buka katalog pertama Anda.
Siap mencoba RuneTranslate?
Tier gratis membuka setiap engine + setiap penyedia terjemahan. Supporter ($3/mo) membuka kecepatan penuh.
Unduh untuk Windows