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.
Bir oyun klasörünü açtığınızda .po ve .mo dosyalarıyla dolu bir locale dizini bulduysanız, o oyun gettext ile yerelleştirilmiştir — ve RuneTranslate artık böyle bir oyunu proje oluşturmadan oynanabilir bir sürüm dışa aktarmaya kadar baştan sona çevirebilir.
Bu rehber, o iki dosya türünün gerçekte ne olduğunu, okuyabildiğiniz dosyayı düzenlemenin oyunda neden çoğu zaman hiçbir şeyi değiştirmediğini ve bunları düzgün biçimde nasıl çevireceğinizi anlatıyor.
.po ile .mo — herkesin takıldığı ayrım
İkisi aynı katalogun iki biçimidir:
- `.po` — Portable Object. Herhangi bir düzenleyicide açabileceğiniz düz metin dosyası. Her kayıt bir
msgid(özgün metin) ve birmsgstr(çevirisi) içerir. Çevirmenlerin çalıştığı dosya budur. - `.mo` — Machine Object. Aynı verinin, oyunun bir metni anında bulabilmesi için düzenlenmiş derlenmiş ikili sürümü. Çalışan oyunun okuduğu dosya budur.
Son madde, insanlara bir öğleden sonrasına mal olan maddedir. Bir .po dosyasının her satırını çevirip kaydedebilir, oyunu başlatabilir — ve hiçbir değişiklik göremezsiniz, çünkü oyun .po dosyasını hiç açmaz. Yanındaki, hâlâ eski metni tutan .mo dosyasını yükler. Normalde birini diğerine GNU gettext araçlarındaki msgfmt ile derlersiniz. RuneTranslate ikisini birden yazdığı için ayrı bir derleme adımı yoktur.
Bir gettext oyun klasörü neye benzer
Standart düzen, dil koduna göre anahtarlanmış bir locale dizinidir:
MyGame/game.exeMyGame/locale/en/LC_MESSAGES/mygame.moMyGame/locale/fr/LC_MESSAGES/mygame.moMyGame/locale/de/LC_MESSAGES/mygame.mo
LC_MESSAGES klasörü bir hata değil, kuralın parçasıdır; mygame ise metin alanı (text domain) — yani oyunun metinlerini yüklerken istediği addır. Pek çok oyun bunun yerine lang/fr.po gibi daha düz bir yapı kullanır; o da çalışır.
Hangi oyunlar gettext kullanır?
Gettext Unix dünyasında doğdu ve C, Python ile GTK tabanlı her şeyde yerelleştirmenin varsayılan yolu hâline geldi. Oyunlarda bu şu anlama gelir:
- Python ve pygame oyunları
- Solarus, SDL ve diğer C/C++ motorları
- Hepsi PO’yu doğal olarak konuşan Poedit, Weblate veya Crowdin üzerinden yerelleştirilen oyunlar
- PO’yu çeviri kaynağı olarak destekleyen bazı Godot projeleri
Batılı bağımsız oyunlarda Japon oyunlarına kıyasla çok daha yaygındır — Kirikiri ve RPG Maker gibi Japon motorları metinlerini kendi biçimlerinde tutar.
RuneTranslate ile bir gettext oyununu çevirmek
- RuneTranslate’i oyun klasörüne yöneltin. İçinde
locale/,lang/ya dai18n/bulunan klasöre. Algılama uzantıya güvenmek yerine gerçek baytları okur; böylece aslında bir 3B sahne dosyası olan.mobozuk bir proje üretmek yerine yok sayılır. - Özeti kontrol edin. Projeyi oluşturmadan önce katalog sayısını, derlenmiş
.moile kaynak.podağılımını, oyunun hâlihazırda içerdiği dilleri ve toplam satır sayısını görürsünüz. - Bir dil ve sağlayıcı seçin. Ücretsiz Google veya DeepL, ya da kendi DeepL, OpenAI, Claude veya DeepSeek anahtarınız — sağlayıcı karşılaştırmasına bakın.
- Gözden geçirin, sonra dışa aktarın. Çevirinin yerine oturduğu, oyunun tam bir kopyasını alırsınız.
Gettext çevirilerini sessizce bozan iki şey
Yer tutucular. Bir msgid bitmiş bir metin değil, bir biçim dizesidir. Hello, %s! içinde oyuncunun adı çalışma anında yerine konur. Makine çevirmenleri %s ifadesini silmeye, aralarını açmaya ya da Python’un adlandırılmış biçimi %(player)s söz konusu olduğunda içindeki kelimeyi çevirmeye eğilimlidir. Sonuçları görsel değildir: silinen bir %s, sonraki tüm argümanları kaydırır ve çoğu motor doğrudan çöker. RuneTranslate bulduğu her yer tutucuyu — %s, %d, %(player)s, {count}, {0} — metin sağlayıcıya gitmeden önce maskeler ve sonra geri koyar.
Çoğul biçimler. İngilizcede iki tane vardır (“1 coin” / “5 coins”). Japonca ve Türkçede bir. Rusça ve Lehçede üç. Bir katalog kaç tane kullandığını başlığında bildirir; bu sayı dille uyuşmazsa gettext listenin sonunu aşar ve sessizce çevrilmemiş özgün metne düşer. RuneTranslate biçimleri hedef dilinize göre yeniden ayarlar ve başlığı buna uygun olarak yazar.
Dışa aktarma katalogu neden iki kez yazar
Dışa aktarma hem düzgün bir yeni dil — locale/<diliniz>/LC_MESSAGES/ — hem de oyunun zaten yüklemekte olduğu katalogun güncellenmiş bir kopyasını üretir.
Çevirinin gerçekten görünmesini sağlayan ikincisidir. Bir oyun hangi dili yükleyeceğine, klasörde hiçbir izi olmayan yollarla karar verir: işletim sistemi dilinizi okuyabilir, bir yapılandırma dosyasına, bir başlatıcı bayrağına bakabilir veya dili doğrudan koda gömmüş olabilir. Yalnızca İngilizce isteyen bir oyuna Türkçe katalog eklemek, sizi hiç değişmemiş görünen bir sürüme bakar hâlde bırakırdı. Oyunun gerçekten yüklediği katalogun üzerine yazmak bu tahmini ortadan kaldırır. İkisi de yalnızca dışa aktarılan kopyada olur — özgün oyun klasörünüz değiştirilmez.
Çevirmediğiniz satırlar, oyunun hâlihazırda içerdiği çeviriyi korur; böylece yarım kalmış bir proje geliştiricinin kendi yerelleştirmesini asla boşaltmaz.
Bunun yapamayacağı şey
Yalnızca zaten bir katalogda bulunan metin çevrilebilir. Bir geliştirici bir satırı gettext’ten geçirmek yerine doğrudan koda gömdüyse, o satır .po veya .mo içinde yoktur ve hiçbir PO aracı onu orada bulamaz. Bu, aracın değil biçimin sınırıdır.
RuneTranslate ayrıca msgid alanını kaynak metin olarak kabul eder; gettext’in kendi tanımı budur. Birkaç projede msgid alanları İngilizce tutulurken gerçek özgün dil msgstr içinde durur; bunlar İngilizceden çevrilir.
Son olarak, oyun RuneTranslate’in doğrudan desteklediği bir motorda çalışıyorsa — Godot, Unity, Ren’Py — onu o motor işler; böylece yalnızca katalogları değil, oyunun metninin geri kalanı da erişilebilir olur.
Paylaşmadan önce
Dışa aktardığınız sürümü başlatın ve birkaç ekran okuyun. En hızlı kontrol menüler ve düğmelerdir, çünkü katalog metninin çoğu oradadır. Bir şey yanlışsa — oyun algılanmıyorsa, dışa aktarılan sürüm çalışmıyorsa ya da metin hâlâ özgün dildeyse — uygulamanın Yardım menüsünden veya Discord’dan bildirin. RuneTranslate’i indirin ve ilk katalogunuzu açın.
RuneTranslate'i denemeye hazır mısın?
Ücretsiz katman her motoru + her çeviri sağlayıcısını açar. Supporter ($3/mo) tam hızı açar.
Windows için indir