Bir anda "Ya, oyunumu global yapayım, herkes oynasın!" diye bir fikir geldi. Heyecanla Unity'de Localization asset'ini araştırdım, sistem kurdum. "Harika!" dedim, "Artık sadece key-value çiftleri yazacağım, oyun otomatik diline göre çevirecek." Ne kadar safmışım.
Sistemi kurduktan sonra projeyi taramaya başladım. Kafayı yiyecektim! Sahnedeki her bir TextMeshPro objesi, her bir Button altındaki yazı, her bir Tooltip, her bir Placeholder... Hepsi hard-coded, Inspector'dan direkt girilmişti. Yüzlerce obje vardı.
C#:
// Eskiden böyleydi, mutluydum (sanıyordum)
public TextMeshProUGUI titleText;
void Start() {
titleText.text = "OYUNA BAŞLA";
}
Şaka gibi ama, bu text'leri tek tek bulup, Localization Key'i ile değiştirmem gerekiyordu. Yani her bir UI elementi için:
1. Objeyi bul.
2. Script'ini aç veya Inspector'dan Localized String Event component'i ekle.
3. Key değerini gir (örn: main_menu_start_button).
4. CSV dosyasına gidip o key için tüm dil çevirilerini yaz.
Bu işi manuel yaparsam iki günde çıldırırdım. Hemen Editor Scripting'e daldım. Amacım, sahnedeki tüm TextMeshProUGUI component'lerini tarayıp, içlerindeki string'leri otomatik olarak bir key'e çeviren ve component'leri değiştiren bir araç yazmaktı.
Birkaç saatlik kod ve StackOverflow'da bile tam bulamadığım hatalarla boğuşmanın ardından, basit bir "bul ve değiştir" aracı yazmayı başardım. Meğerse sorun şuradaymış: Prefab instance'larını düzgün handle edemiyordum, hepsi MissingReferenceException veriyordu. Neyse ki PrefabUtility ile hallettim.
Nihayetinde, otomasyon işin %70'ini halletti. Ama yine de özel durumlar, dinamik olarak set edilen text'ler (örneğin "Seni yendim, PlayerName!" gibi) için tek tek uğraşmak gerekti. Localisation'ı projenin EN BAŞINDA düşünmek gerektiğini kanla, terle ve biraz da gözyaşıyla öğrendim.
Siz de böyle "retrofit" yapmak zorunda kaldığınız, kodun her yerine dağılmış bir şeyi toparladığınız oldu mu? Ya da bu UI text'lerini toplamanın daha akıllıca bir yolu var mı? Lütfen söyleyin, bir daha aynı acıyı çekmeyeyim.