6

Çevirmen üzerinde çalıştığım bu formatlı dizgim var. istenen ve asıl sonuç ileXcode İçinde Argümanların Aktarılması ile Gelişmiş Lokalizasyon

////////////////////////////////////// 
// Share Over Twitter 
NSString *frmt = NSLocalizedString(@"Check out the %[email protected] %[email protected] in %[email protected]: %[email protected]", @"The default tweet for sharing sounds. Use %[email protected] for where the sound type (Sound, mix, playlist) will be, %[email protected] for where the audio name will be, %[email protected] for the app name, and %[email protected] for where the sound link will be."); 
NSString *urlString = [NSString stringWithFormat:@"sounds/%@", SoundSoundID(audio)]; 
NSString *url = ([audio audioType] == UAAudioTypeSound ? UrlFor(urlString) : APP_SHORTLINK); 
NSString *msg = [NSString stringWithFormat: 
       frmt, 
       [[Audio titleForAudioType:[audio audioType]] lowercaseString], 
       [NSString stringWithFormat:@"\"%@\"", AudioName(audio)], 
       APP_NAME, 
       url]; 
returnString = msg; 

:

İNGİLİZCE

 
"Check out the %[email protected] %[email protected] in %[email protected]: %[email protected]" = "Check out the %[email protected] %[email protected] in %[email protected]: %[email protected]" 

Almanca çevirisi

 
"Check out the %[email protected] %[email protected] in %[email protected]: %[email protected]" = "Hör Dir mal %[email protected] in %[email protected] an: %[email protected]"; 

Bunlar [NSString stringWithFormat:] çağrı geçirilir

İNGİLİZCE


 
desired: "Hör Dir mal "This Sound Name" in My App Name an: link_to_sound" 
actual: "Hör Dir mal sound in "This Sound Name" an: My App Name" 



ALMANCA
 
desired: "Check out the sound "This Sound Name" in My App Name: link_to_sound" 
actual: "Check out the sound "This Sound Name" in My App Name: link_to_sound" 

Sorun varsayımı altında olmasıdır problem -[NSString stringWithFormat:] numaralı değişken kullanarak, Ben yapabilirim ngs, %[email protected] değişkeninin tamamen atlandığı yerdeki gibi. Eğer fark ederseniz, format dizgisinin Almanca çevirisi ilk argümanı (%[email protected]) hiç kullanmaz, ama yine de ("ses") çıkış dizisinde görünür.

Neyi yanlış yapıyorum?

cevap

7

Bu bir hata değildir. Numaralandırılmış bağımsız değişkenler C standardının bir parçası değildir, ancak aşağıdakileri belirten IEEE Std 1003.1'in bir parçasıdır (önceleme):

Biçim, numaralı argüman dönüşüm belirtimlerini içerebilir (başka bir deyişle, "% n $" ve " * m $ ") veya numarasız argüman dönüştürme özellikleri (yani,% ve *), ancak ikisi de değil. Bunun tek istisnası, %% "% n $" formunda karıştırılabilir. Bir biçim dizesindeki numaralı ve numarasız argüman özelliklerinin karıştırılmasının sonuçları tanımlanmamıştır. numaralı argüman belirtimleri kullanıldığında, Nth argümanı belirtildiğinde, ilkden (N-1) th'ye kadar olan tüm önde gelen argümanların format dizisinde belirtilmesi gerekir.
+0

hatalı yaptığım gibi numaralandırılmış değişkenlerin ihmal edilmesiyle ilgili bir varsayımda bulunuyor. – coneybeare

+0

Bu, Android/Java'da işe yarıyor; onların (geçersiz?) uygulanması olmalı – Opus1217

0

Bana bir hata gibi görünüyor. Ben bir hata dosya gerektiğini düşünüyorum.

CFString'in biçimlendirme motoru fprintf'dan bağımsızdır, bu nedenle bazı farklılıklar olabilir. Örneğin,

printf("a %3$s\n", "b", "c", "d"); // prints "a d" 
NSLog(@"a %3$s\n", "b", "c", "d"); // prints "a b" 

Sen mesela, bir argüman genişliği düzeltilmesi gerekmez, çünkü tüm önceki belirteçleri sağlamanız gerekmektedir

printf("%2$llx %1$llx\n", 1LL, 2LL); // prints "2 1" 
printf("%2$llx\n", 1LL, 2LL);  // prints "200000000" !! 
NSLog(@"%2$llx %1$llx\n", 1LL, 2LL); // prints "2 1" 
NSLog(@"%2$llx\n", 1LL, 2LL);  // prints "1" 

iPhone OS'nin printf atlama 1 kayıp şartname 4 bayt, ve CFString'in biçimlendiricisi 0 bayt atlar.


çözeltilerdir:

  1. ör için endeksler, yeniden düzenleme

    "Check out the %[email protected] %[email protected] in %[email protected]: %[email protected]" 
    "Hör Dir mal %[email protected] in %[email protected] an: %[email protected]"; 
    

    veya

  2. tüm argümanlar kullanılacak zorlamak ve sonra -substringFromIndex: ilk 40 karakteri kesmekte formatında

    [@"%1$10p%2$10p%3$10p%4$10p" stringByAppendingString:frmt] 
    

    kullanın veya

  3. tüm dönüştürme ObjC nesneleri C dizelerine (char*) ve snprintf kullanın.

  4. Kendi biçimlendirme motorunuzu yazın.
+0

Bu geçici çözümlerden kaçınmayı ve dosyaları çevirmenlere geri göndermeyi umuyordum. booooo – coneybeare

+0

Sayı 2'nin ne olduğunu açıklayabilir misiniz? – coneybeare

+0

5'inci seçeneği uygulamaya çalıştım: http://stackoverflow.com/questions/2946649/nsstringwithformat-swizzled-to-allow-missing-format-numbered-args aslında 4 numaralı gibi ama çok fazla değil Kendi motorumun bir geçersiz kılma olarak – coneybeare

İlgili konular