%@, %1$@, %lld: çeviride bozulan format belirteçleri

Güncelleme: · LocalePilot

Değişken içeren bir iOS metninde %@ ya da %lld bulunur ve çevirmenin bunu doğru yerde, doğru türle koruması gerekir. Bu rehber sık tekrarlanan hataları, yüzde işaretiyle ilgili bir tuzağı ve bunları nasıl fark edeceğinizi anlatıyor.

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 %.

Sık sorulan sorular

%d, %ld ve %lld arasındaki fark nedir?

Beklenen tamsayının boyutu. SwiftUI, interpolasyonla eklenen bir Int için %lld kullanır; elle yazılmış bir .strings dosyasında kaynaktaki belirteci koruyun.

Çevrilmiş bir metinde % işaretini nasıl yazarım?

Değişken içeren bir metinde ikileyin: %%. Aksi halde "% d" veya "% s" belirteç olarak okunabilir.

Bir çevirmen değişkenlerin sırasını değiştirebilir mi?

Evet, konum numaralarıyla: önce %2$@, sonra %1$@. Bu durumda metindeki tüm belirteçler numaralı olmalıdır.