· Hasan Alp Güngör
Oyun metinlerini {değişkenleri} bozmadan çevirmek: LocaGen nasıl çalışıyor
Makine çevirisi oyun dosyalarındaki {player} ve %d gibi değişkenleri bozuyor. LocaGen'de bunu nasıl çözdüğümü ve PRO sürümde Gemini'yi nasıl kullandığımı anlatıyorum.
- Python
- PHP
- Gemini API
- Localization

Oyunlardaki metinler genelde bir JSON dosyasında anahtar ve değer olarak durur. Oyunu başka bir dile çevirmek için bu dosyadaki değerleri çevirmek yeterli gibi görünür. Ben de ilk başta öyle düşündüm, sonra değişkenlerle karşılaştım.
json{
"welcome": "Welcome back, {player}!",
"coins": "You have %d coins",
"warning": "<b>Danger:</b> low health"
}Bu metni doğrudan bir çeviri servisine verirsen {player} bazen {oyuncu} olarak çevriliyor, %d bazen "% d" oluyor, <b> etiketi bazen kayboluyor. Oyun da bu değişkenleri bulamayınca ya yanlış metin gösteriyor ya da hata veriyor.
Değişkenleri saklamak
Çözümüm basit: çeviriden önce bütün değişkenleri bulup yerlerine çevirinin dokunmayacağı [VAR_0], [VAR_1] gibi işaretler koyuyorum. Çeviri bitince bu işaretleri asıl değişkenlerle değiştiriyorum. Çeviri servisleri bazen işareti küçük harfe çevirdiği için [var_0] halini de kontrol ediyorum.
pythonPATTERN = re.compile(r'(\{.*?\}|<.*?>|%[sd])')
def translate(text, target):
placeholders = {}
for i, match in enumerate(PATTERN.findall(text)):
marker = f"[VAR_{i}]"
placeholders[marker] = match
text = text.replace(match, marker)
result = GoogleTranslator(source="auto", target=target).translate(text)
for marker, original in placeholders.items():
result = result.replace(marker, original).replace(marker.lower(), original)
return resultAnahtarlara hiç dokunmuyorum; sadece değerler çevriliyor. Dosya düz bir anahtar-değer listesi de olabilir, nesnelerden oluşan bir liste de; ikisini de destekliyorum.
Ücretsiz sürüm
Ücretsiz sürüm Python ile yazılmış bir masaüstü uygulaması. Arayüzü CustomTkinter ile terminal görünümünde tasarladım, çeviri için deep-translator üzerinden Google Translate kullanıyorum. Çeviri ayrı bir iş parçacığında çalıştığı için arayüz donmuyor ve ilerleme çubuğu canlı doluyor. Uygulama açılışta GitHub'daki son sürümü kontrol ediyor ve yeni bir sürüm varsa kendisi indiriyor.
PRO sürüm: Gemini ile oyuncu dili
Google Translate kelimeleri doğru çeviriyor ama oyun dilini bilmiyor. "Health potion" gibi terimler robotik çıkıyor. PRO sürümde çeviriyi Gemini 2.5 Flash'a yaptırıyorum. Gemini'ye kendini bir oyun yerelleştirme uzmanı olarak düşünmesini, terimleri bir oyuncunun kullanacağı şekilde çevirmesini, anahtarlara asla dokunmamasını ve sadece geçerli JSON döndürmesini söylüyorum.
Yapay zekâyla çalışırken öğrendiğim en önemli şey, cevaba körü körüne güvenmemek oldu. Gemini'den gelen metni her zaman JSON olarak çözümlemeyi deniyorum; geçersizse kullanıcıya bozuk bir dosya vermek yerine hata gösteriyorum. PRO sürüm PHP ve MySQL ile çalışıyor: kullanıcı girişi, çeviri geçmişi ve bir yönetici paneli var.

