Kafayı yiyecektim arkadaşlar. Şaka gibi ama, uygulamamın arayüz metinlerini kodun içine direkt yazıyordum. "Kullanıcı Adı", "Şifre", "Giriş Yap"... Her şey hardcode. Sonra bir müşteri çıkageldi, "Bunu İngilizce'ye de çevirebilir miyiz?" dedi. O an, kodumun içine gömülü o yüzlerce string'i tek tek bulup değiştirmenin kabusunu gördüm. Meğerse Qt'nin hazır bir çözümü varmış: .ts (Translation Source) dosyaları.
İlk iş, .pro dosyama şu satırları eklemek oldu. Qt Creator'ın işi sizin için otomatik yapmasını beklemeyin, bazen elle müdahale şart.
Kod:
TRANSLATIONS += app_tr_TR.ts
TRANSLATIONS += app_en_US.ts
Sonra terminale daldım ve lupdate komutunu çalıştırdım. Bu sihirli araç, projemdeki tüm tr() fonksiyonları içine alınmış string'leri tarayıp, .ts dosyalarını oluşturuyor.
Kod:
lupdate projeadi.pro
Oluşan .ts dosyasını açmak için Qt Linguist uygulamasını kullandım. Arayüzü biraz eski görünse de, işini mükemmel yapıyor. Her bir string için kaynak ve hedef dilde çeviri alanları var. "Giriş Yap" -> "Log In" yaptım. Tüm çevirileri tamamlayıp kaydettikten sonra, sıra geldi bu XML benzeri .ts dosyasını, uygulamanın okuyabileceği yoğun bir .qm (Qt Message) dosyasına çevirmeye.
Kod:
lrelease app_en_US.ts
Artık elimde app_en_US.qm dosyam vardı. Uygulama başlangıcında, sadece aşağıdaki gibi birkaç satır kodla bu dosyayı yükleyip, tüm arayüz anında İngilizce'ye dönebiliyor.
Python:
translator = QTranslator()
translator.load("app_en_US.qm", ".")
app.installTranslator(translator)
Şaka gibi ama, bu sisteme geçtikten sonra yeni bir dil eklemek saatler süren bir iş olmaktan çıkıp dakikalar süren bir iş haline geldi. Kodum temizlendi, sadece tr("metin") ifadeleri kaldı. Çevirmen, kodla hiç uğraşmadan sadece .ts dosyasıyla ilgilenebiliyor. StackOverflow'da bile bu kadar temiz bir çözüm aramıştım.
Peki ya siz? UI metinlerinizi nasıl yönetiyorsunuz? Hiç hardcode string kabusu yaşadınız mı? Qt'nin bu sisteminde takıldığınız, "keşke şöyle olsaydı" dediğiniz bir nokta var mı?