Çevrilen metin neden kutu görünüyor
Oyunu çevirdiniz, dışa aktarım temiz geçti ve diyalog kutusu □□□ dolu. Bu neredeyse hiçbir zaman bir çeviri sorunu değildir — bir yazı tipi sorunudur ve insanların onunla karıştırdığı iki arızadan farklı bir çözümü vardır. Eksik glifi silinmiş karakterden ve mojibake'den nasıl ayırt edeceğinizi, her birinin Unity, TextMeshPro, Ren'Py ve çalışma zamanı araçlarında nasıl çözüldüğünü anlatıyor.
Dışa aktarım bitti, oyun açıldı ve her diyalog satırı bir sıra özdeş boş dikdörtgen. Çeviride yanlış bir şey yok. Dosyadaki metin sağlayıcının döndürdüğünün tam olarak aynısı ve o dosyayı bir metin düzenleyicide açarsanız doğru okunuyor. Başarısız olan şey zincirin son adımı: oyunun çiziciye verdiği yazı tipinde o karakterlerin çizimi yok.
Bir tofu kutusu aslında nedir
Bir yazı tipi, Unicode kod noktasından bir şekle giden bir arama tablosudur. Bir çiziciden içermediği bir kod noktasını çizmesi istendiğinde, yazı tipinin eksik glifini koyar — genellikle boş ya da çapraz çizgili bir dikdörtgen; teknik adı .notdef, başka her yerdeki adıysa tofu kutusu. Bir kutu, yazı tipinin çizemediği bir karaktere eşittir. Mekanizmanın tamamı bu.
Bundan iki sonuç çıkar ve ikisi de teşhiste işe yarar. Birincisi, kutu sayısı karakter sayısıyla eşleşir: beş Tayca karakter beş kutu üretir, daha kısa bir bozuk dizi değil. İkincisi, dize bellekte sağlamdır — oyun onu hâlâ ölçebilir, karşılaştırabilir, kaydedip yeniden yükleyebilir. Eksik olan yalnızca piksellerdir. Çevrilmiş bir menünün bütünüyle okunaksız olup yine de doğru gezinmesinin nedeni budur.
Üç belirti, üç ayrı sorun
"Çevirim bozuldu" çevresindeki kafa karışıklığının çoğu, bunlardan birinin çözümünü bir diğerine uygulayan insanlardır. Bir şeye dokunmadan önce hasarın şekline bakın.
- □□□ kutuları — karakterler doğru, yazı tipi onları çizemiyor. Yazı tipini düzeltin.
- ???? — karakterler yok olmuş. Bir şey dizeyi daha dar bir karakter kümesine yeniden kodlamış ve temsil edemediği her şeyi değiştirmiş. Hiçbir yazı tipi onları geri getiremez. Kodlamayı düzeltin ya da biçimin taşıyabileceği bir hedef dil seçin.
テã‚ストgibi bozuk Latin harfleri ya daテキストolarak görünenテキスト— mojibake. Baytlar doğru, çözücü yanlış: bir kodlamayla yazılmış metin başka biriyle okunuyor. Hangi kodlamanın okunduğunu düzeltin.
Hızlı bir ayraç: kutular da mojibake de bayt sayısını özgününe kabaca orantılı bırakır, ama mojibake görünür, çeşitli çöp karakterler üretirken tofu özdeş, tekdüze dikdörtgenler üretir. Tekdüze "yazı tipi" demektir. Çeşitli "kodlama" demektir.
Kutular: eksik bir glif
Oyun, yalnızca kendi ihtiyacını karşılayan bir yazı tipiyle geldi. Süreçte bozuk bir şey yok — sanatçının hiç eklemediği bir kod noktası istediniz. Çözüm her zaman çiziciye o glifi taşıyan bir yazı tipi vermektir: ya yazı tipini değiştirerek ya da birincil yazı tipi boş çıktığında çizicinin başvuracağı bir yedek ekleyerek.
Soru işaretleri: karakterler düşürüldü
Bir dizenin, metni eski tip tek ya da çift baytlı bir kodlamada saklayan bir biçime geri yazılması gerektiğinde, o kodlamanın dışındaki her karakterin bir şeye dönüşmesi gerekir. Alışıldık üzere o şey ? olur. Shift-JIS ve cp932 Japoncayı, ASCII'yi ve çok az şeyi taşıyabilir; katı bir ASCII alanı Yunanca, Kiril, Tayca ya da CJK'den hiçbirini taşıyamaz. Bu, yazı tipinin değil dosya biçiminin bir özelliğidir ve dışa aktarma sırasında olur — oyun dosyayı okuduğunda bilgi çoktan gitmiştir.
RuneTranslate'te bunun canlı bir sınır olduğu tek bir motor var ve bu gizlenmek yerine açıkça yazılıyor: YU-RIS dizelerini cp932 olarak yeniden kodluyor; bu, İngilizceye ve diğer Latin çıktısına dosttur ama Tayca'yı ? olarak gönderir. O motorda cp932 dışı hedefler, henüz yapılmamış bir yazı tipi çözümü ister.
Bozuk Latin harfleri: mojibake
Shift-JIS olarak yazılıp UTF-8 olarak okunan (ya da tersi) Japonca metin, uzun aksanlı Latin harfi ve kutu çizim karakteri dizileri üretir. Bu, bir araç dosyayı yanlış kodlamada yazdığında ya da bir oyunun kendi yükleyicisi, dışa aktarmanızın kullanmadığı bir kodlamayı varsaydığında ortaya çıkar. Çözüm, dosyayı motorun beklediği kodlamada yazmaktır — asla yazı tipini değiştirmek değil, ki bu hiçbir şeyi değiştirmez.
CJK ve Tayca neden en çok etkileniyor
Latin kabaca yüz glif ister. Japonca birkaç bin, Çince daha fazla. Yazı tipi dosyaları büyüktür ve oyunlar kendi yazı sistemlerini karşılayan en küçüğünü gönderir, dolayısıyla devraldığınız kapsam tamamen oyunun hangi dil için yapıldığına bağlıdır.
- Japonca için yapılmış bir oyun genellikle kana, yaygın kanji ve ASCII taşır. Onu Rusçaya, Yunancaya, Tayca'ya ya da Koreceye çevirin; ASCII dışındaki her karakter dökülür.
- İngilizce için yapılmış bir oyun genellikle yalnızca Latin taşır — dolayısıyla Japonca, Çince, Korece, Tayca, Yunanca ve Kiril hep birden düşer.
- Tayca pratikte en kötü durumdur: yaygın oyun yazı tiplerinin hepsinin dışındadır ve ayrıca temel karakterin üstüne ve altına konumlanan birleşen ünlü ve ton işaretleri ister, dolayısıyla teknik olarak kod noktalarına sahip bir yazı tipi bile onu kötü çizebilir.
- Latin kendiliğinden güvenli değildir. Lehçe, Çekçe, Macarca, Türkçe, Vietnamca ve Romence, İngilizce ya da Japonca için yapılmış bir yazı tipinin sıkça atladığı Latin-Extended karakterleri kullanır. RuneTranslate tam da bu hedefler için Ren'Py üzerinde daha geniş bir yazı tipi paketler, çünkü "Latin sorun değil" varsayımı yanlış çıktı.
Özellikle Unity ve TextMeshPro
Unity'nin iki metin sistemi vardır ve farklı biçimlerde bozulurlar. Eski uGUI Text bir Font nesnesi kullanır. Modern oyunların çoğunun kullandığı TextMeshPro ise çalışma zamanında hiç yazı tipi dosyası kullanmaz. Bir TMP yazı tipi varlığı kullanır: önceden çizilmiş glif görüntülerinden oluşan bir doku atlası, artı kod noktalarını o atlastaki konumlara eşleyen bir tablo.
Bir TMP yazı tipi varlığının sabit bir karakter kümesi olmasının nedeni budur. Geliştirici onu ürettiğinde bir karakter aralığı seçti — genellikle yalnızca gönderdiği dil — ve TMP tam olarak o glifleri atlasa işledi. Statik bir yazı tipi varlığı, ona ne verirseniz verin o kümenin dışında hiçbir şeyi çizemez. Dinamik bir yazı tipi varlığı ise kaynak yazı tipi dosyasına bir başvuru tutar ve talep üzerine yeni glifleri tarayabilir; geliştiricinin hiç düşünmediği bir dili kapsayacak kadar büyüyebilen tek kip budur.
TMP'nin kaçış kapısı yedek listesidir. Her yazı tipi varlığının bir m_fallbackFontAssets listesi vardır ve TMP Settings'te genel bir yedek listesi bulunur; birincil varlıkta bir kod noktası için glif olmadığında TMP, olan birini bulmak için o listeleri dolaşır. Müdahale edilecek doğru yer burasıdır, çünkü oyunun kendi yazı tipini zaten çizebildiği her şeyin başında bırakır — arayüz amaçlanan görünümünü korur ve yalnızca üstesinden gelemediği karakterler başka yerden gelir.
Bir çalışma zamanı aracıyla düzeltmek
XUnity.AutoTranslator oyunu çalışırken kancalar ve yapılandırma dosyasından yazı tiplerini değiştirebilir. [Behaviour] altındaki ilgili ayarlar:
OverrideFont— eski Unity arayüzüTextbileşenlerinin kullandığı yazı tipini değiştirir. Oyunun ya da işletim sisteminin çözebileceği bir yazı tipi adı alır.OverrideFontTextMeshPro— TMP yazı tipi varlığını bütünüyle değiştirir. Onu bir TMP yazı tipi AssetBundle dosyasına ya da oyunun zaten sahip olduğu bir varlığın adına yönlendirin.FallbackFontTextMeshPro— ikisinin daha güvenli olanı: TMP'nin yalnızca oyunun kendi varlığında eksik olan glifler için başvuracağı bir yazı tipi ekler, geri kalan her yerde özgün karakter tasarımını yerinde bırakır.- tmp_font_assetbundles —
OverrideFontTextMeshProveFallbackFontTextMeshProayarlarının genelde yönlendirildiği, topluluk tarafından sürdürülen hazır TMP yazı tipi AssetBundle koleksiyonu. Bunlar Unity sürümüne göre üretilir ve oyundan farklı bir Unity sürümü için üretilmiş bir paket yüklenmez — sürümü eşleştirmek, insanların atladığı adımdır.
Bir çalışma zamanı aracı makine başına ve yapılandırma başınadır: oyunu kurulu olduğu PC'de düzeltir ve o sürümü çalıştıran herkesin aynı kurulumu yapması gerekir. RuneTranslate, eklentinin kendi _AutoGeneratedTranslations.txt dosyasını okuyup yazabilir, dolayısıyla onu zaten kullanan bir proje çıkmaz sokak değildir — her yaklaşımın nereye oturduğu için karşılaştırmaya bakın.
Dosya düzeyinde düzeltmek
RuneTranslate yedek yolunu doğrudan oyunun verisinde izler. Unity dışa aktarımında oyunun TMP Settings'ini, şablon olarak kullanabileceği bir yazı tipi varlığını ve bir Font bulur, ardından hedef yazı sistemini kapsayan paketlenmiş bir yazı tipi çevresinde Dinamik kipte yeni bir TMP yazı tipi varlığı kurar ve onu yedek listesine ekler. Mevcut yedek kayıtlarına dokunulmaz ve oyunun kendi yazı tipi birincil kalır — dolayısıyla Tayca'ya çevrilmiş bir Japon oyunu, Latin olan her şey için özgün biçimlendirmesini korur ve Tayca gliflerini enjekte edilen varlıktan çeker.
Bunun üzerine iki dürüst not. Oyunun varlıklarının aynı kabında TMP Settings'in, kullanılabilir bir yazı tipi varlığı şablonunun ve bir Font'un bulunmasını gerektirir; bunları farklı yerleştiren bir oyun kapsamın dışında kalabilir. Ve enjeksiyon atlandığında dışa aktarım, yeşil bitmek yerine uyarılarında bunu söyler — kutu olarak giden bir dışa aktarım, çalışan biriyle aynı görünmemelidir. O uyarıyı görürseniz yukarıdaki çalışma zamanı aracı yolu yedek plandır.
Ren'Py aynı sonuca farklı bir mekanizmayla ulaşır, çünkü Ren'Py'de TMP yoktur: RuneTranslate, dışa aktarılan sürüme bir CJK ya da Latin dışı yazı tipi paketleyip onu Ren'Py'nin kendi config.font_replacement_map yapısı üzerinden kaydedebilir, böylece motor, oyunun yazı tipinin yetersiz kaldığı her yerde onu yerine koyar.
Çalışma kontrol listesi
- Hasara bakın. Tekdüze dikdörtgenler,
?karakterleri ya da bozuk harfler — bir şeye dokunmadan önce üçünden hangisi olduğuna karar verin. ?ise dışa aktarılan dosyayı açın. Soru işaretleri dosyadaysa karakterler yazma sırasında kaybolmuştur ve hiçbir yazı tipi yardım etmez; motorun dize kodlamasının hedef dilinizi taşıyıp taşıyamadığına bakın.- Bozuk harflerse yazı tipine değil, motorun o dosya için beklediği kodlamaya bakın.
- Kutularsa dosya içeriğinin doğru olduğunu doğrulayın — neredeyse her zaman doğrudur — ve bunu bir yazı tipi işi olarak ele alın.
- Unity'de oyunun yazı tipini değiştirmek yerine yedek eklemeyi tercih edin. Değiştirme, zaten düzgün çizilenler dahil her dizenin görünümünü değiştirir.
- Bir TMP yazı tipi AssetBundle kullanıyorsanız onu oyunun Unity sürümüyle eşleştirin.
- Yeniden dışa aktarın ve yalnızca ilk diyalog satırını değil, sorun çıkaran belirli karakterleri denetleyin. Latin-Extended ve Tayca işaretleri sıklıkla bir örneklem denetimini atlatıp başka yerde bozulur.
Sırada ne var
Tam Unity iş akışı için — Unity'nin gerçekte hangi metni açtığı ve neyin erişilemez kaldığı — Unity oyunları nasıl çevrilir yazısını ve Unity motor sayfasını okuyun. Veri yerine çizime işlenmiş metin, ayrı bir aracı olan ayrı bir sorundur: görsel çevirisine bakın. Kalan yaygın ilk çalıştırma sürprizlerini de SSS kapsıyor.
RuneTranslate, her motor ve her sağlayıcı açık hâlde ücretsiz kullanılır; üçü hiç API anahtarı istemez. Oyunun kendi dosyalarını ayrıştırır ve sizde kalan, oynanabilir çevrilmiş bir sürüm dışa aktarır. İndirin ya da desteklenen motorlara göz atı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
