Aceleniz varsa bir çevirinin placeholder'larını doğrudan tarayıcınızda kontrol edin. Araç ücretsizdir, kayıt istemez ve hiçbir şey yüklemez.
% nereden geliyor
Bir iOS uygulamasında, değişken içeren yerelleştirilmiş bir metin bir format string'e dönüşür. SwiftUI'da bu örtük olarak gerçekleşir:
Text("\(count) items left") // anahtar: "%lld items left"
Text("Welcome back, \(name)!") // anahtar: "Welcome back, %@!"
String(localized: "Total: \(price) €") // price bir Double: "Total: %lf €"
Bir Int %lld, bir String %@, bir Double %lf verir. Eski API ile formatı kendiniz yazarsınız: String(format: NSLocalizedString("items_left", comment: ""), count), ve .strings dosyası %d veya %ld içerir.
Her iki durumda da çevirmen ortasında % işaretleri olan bir metin alır ve işler orada bozulur.
Bir çeviriyi bozmanın üç yolu
Belirteci atlamak. "Invitez %@ à modifier cette liste" yerine "Invitez à modifier cette liste". Hiçbir şey çökmez: argüman basitçe yok sayılır ve kişinin adı ekrandan kaybolur. En sık görülen ve en sessiz hatadır.
Türü değiştirmek. %lld'yi %@ ile değiştirmek ya da tersi. Format bu durumda argümanı yanlış türde okur: en iyi ihtimalle anlamsız bir sayı, en kötü ihtimalle bir çökme, çünkü %@ bir nesne beklerken bir tamsayı alır.
Sırayı sessizce değiştirmek. "%@ shared %@", sözcük sırası farklı bir dilde (Türkçe gibi), iki adın yer değiştirdiği bir cümleye dönüşür. Sözdizimi doğru, ama anlam yanlış.
Konum numaralarıyla yeniden sıralamak
Sırayı değiştirmek için argümanları numaralandırın: %1$@ cümlede nerede durursa dursun birinci argüman, %2$@ ikincisidir.
/* kaynak */ "%@ shared %@ with you" = "%1$@ shared %2$@ with you";
/* Türkçe */ "%@ shared %@ with you" = "%1$@ seninle %2$@ paylaştı";
/* diğer sıra */ "%@ shared %@ with you" = "%2$@: %1$@ tarafından paylaşıldı";
Akılda tutulacak tek kural: bir metin içinde ya her şey numaralıdır ya da hiçbir şey. %1$@ ile %@'yi karıştırmak tanımsız davranıştır.
Yüzde işareti tuzağı: "20 % de remise" ve "%20 indirim"
Uygulamanızı Fransızca da yayınlıyorsanız bunu bilmekte yarar var. Fransız tipografisi yüzde işaretinden önce bir boşluk koyar: "20 % de remise" (%20 indirim). Bir format string'de bu bir sorundur, çünkü % d (yüzde, boşluk, d) geçerli bir belirteçtir: boşluk bir printf bayrağıdır ("pozitif sayıları bir boşlukla doldur") ve d tamsayı dönüşümüdür. Şu cümle
"Profitez de %lld % de remise"
bu nedenle tek bir argüman için iki belirteç içerir: %lld ve % d. İkincisi var olmayan bir değeri okur. Doğru biçim işareti ikiler:
"Profitez de %lld %% de remise"
Türkçede yüzde işareti sayıdan önce gelir: "%20 indirim". Format string'den geçen bir metinde bu işaret de ikilenmelidir: "%%%lld indirim". Bu yalnızca bir format'tan geçen metinleri, yani en az bir değişken içeren metinleri etkiler. Argümanı olmayan sabit bir "%20 indirim" yazıldığı gibi görünür. Ama çeviriler değişir: birisi o cümleye bir değişken eklediği gün, tek başına duran % bir hataya dönüşür.
Çoğullar
"1 item / 3 items" için iki anahtar ve kodunuzda bir if yazmayın. Bir String Catalog'da %lld items left anahtarı, her biri kendi %lld'sine sahip çoğul varyasyonları alır (one, other, dile göre ayrıca few veya many; Türkçe yalnızca one ve other kullanır). Bir cümlede bağımsız olarak değişen iki sayı varsa, Xcode substitution'lar (%#@items@) kullanır; bu daha nadir bir durumdur ve Xcode'da düzenlenir.
Yayınlamadan önce kontrol
Temel kontrol mekaniktir: her çeviri için belirteç listesi (tür ve konum) kaynakla eşleşmelidir. LocalePilot'un QA denetimi .strings ve .xcstrings dosyalarında bunu yapar: %@, %1$@, %d, %ld, %lld, %.2f, %u, %i ve %s'yi tanır, %%'yi metin olarak ele alır ve eksik ya da fazla bir belirteci dışa aktarmadan önce işaretler. %e veya %x gibi nadir dönüşümleri bilinçli olarak yok sayar; tam da "20%en" bir hata sanılmasın diye. Yukarıdaki "% d" durumu ise insan incelemesi gerektirir: Fransızca çevirilerinizde ardından boşluk gelen bir % arayın, Türkçe çevirilerinizde de sayıdan önce gelen tek bir %.