2014-09-16 58 views
7

localizedStringWithFormat için hızlı bir alternatif bulamadık.iOS Swift ve localizedStringWithFormat

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
    <dict> 
     <key>%d record trovati</key> 
     <dict> 
      <key>NSStringLocalizedFormatKey</key> 
      <string>%#@[email protected] in the room</string> 
      <key>num_people_in_room</key> 
      <dict> 
       <key>NSStringFormatSpecTypeKey</key> 
       <string>NSStringPluralRuleType</string> 
       <key>NSStringFormatValueTypeKey</key> 
       <string>d</string> 
       <key>zero</key> 
       <string>No record</string> 
       <key>one</key> 
       <string>Only one record</string> 
       <key>other</key> 
       <string>Some records</string> 
      </dict> 
     </dict> 
    </dict> 
</plist> 

ve kodu:

[NSString localizedStringWithFormat:NSLocalizedString(@"%d record trovati", nil), totRecsFound]; 

Swift bu nasıl yapılacağı hakkında herhangi bir fikrin ne yapmaya çalışıyorum Localizable.stringsdict, ingilizce örneği kullanarak tekil/çoğul yerelleştirme kullanmaktır?

cevap

19

aynı yöntemler Swift mevcuttur:

for totRecsFound in 0 ... 3 { 
    let str = NSString.localizedStringWithFormat(NSLocalizedString("%d record trovati", comment: ""), totRecsFound) 
    println(str) 
} 

Çıktı: "Localizable.stringsdict" dosyaya ek olarak bir "Localizable.strings olması gerekir o

 
No record in the room 
Only one record in the room 
Some records in the room 
Some records in the room 

Not "dosya (boş olabilir). Swift 3/4 için

Güncelleme: İşte

extension NSString { static func localizedStringForPlurals(formatKey key: String, comment: String = "", args: CVarArg...) -> String { let format = NSLocalizedString(key, comment: comment) let result = withVaList(args){ (NSString(format: format, locale: NSLocale.current, arguments: $0) as String) } return result } 

bazı kullanımları vardır:

for totRecsFound in 0 ... 3 { 
    let str = String.localizedStringWithFormat(NSLocalizedString("%d record trovati", comment: ""), totRecsFound) 
    print(str) 
} 
+0

tamam harika! XCode dokümanı sadece objektif-C fonksiyonunu rapor etti. teşekkür ederim – valfer

1

Ben kolay kullanım için bir uzantı yazdı durumda

for totRecsFound in 0 ... 3 { 
    let str = String. localizedStringForPlurals(formatKey: "%d record trovati", comment: "my comments", args: totRecsFound) 
    println(str) 
} 
// Or 
for totRecsFound in 0 ... 3 { 
    let str = String. localizedStringForPlurals(formatKey: "%d record trovati", args: totRecsFound) 
    println(str) 
} 

sen Bir anahtarda birden fazla sayısal değer var (her değişkeni Kaynak dosyanız aşağıdaki örnekte olduğu gibi), bu yöntemin yerelleştirilmiş dizeyi elde etmek için birden fazla sayı argümanını iletebilirsiniz.

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>record in room</key> 
    <dict> 
     <key>NSStringLocalizedFormatKey</key> 
     <string>%#@[email protected] in %#@[email protected] (%#@[email protected])</string> 
     <key>num_people_in_room</key> 
     <dict> 
      <key>NSStringFormatSpecTypeKey</key> 
      <string>NSStringPluralRuleType</string> 
      <key>NSStringFormatValueTypeKey</key> 
      <string>d</string> 
      <key>zero</key> 
      <string>No record</string> 
      <key>one</key> 
      <string>Only one record</string> 
      <key>other</key> 
      <string>Some records</string> 
     </dict> 
     <key>room</key> 
     <dict> 
      <key>NSStringFormatSpecTypeKey</key> 
      <string>NSStringPluralRuleType</string> 
      <key>NSStringFormatValueTypeKey</key> 
      <string>d</string> 
      <key>zero</key> 
      <string>none room</string> 
      <key>one</key> 
      <string>%d room</string> 
      <key>other</key> 
      <string>%d rooms</string> 
     </dict> 
     <key>comment</key> 
     <dict> 
      <key>NSStringFormatSpecTypeKey</key> 
      <string>NSStringPluralRuleType</string> 
      <key>NSStringFormatValueTypeKey</key> 
      <string>d</string> 
      <key>zero</key> 
      <string>Weird case: how 0 record in > 0 rooms or 0 room with > 0 records?</string> 
      <key>one</key> 
      <string>Weird case: how 1 record in > 2 rooms?</string> 
      <key>other</key> 
      <string>%dth or normal case: OK</string> 
     </dict> 
    </dict> 
</dict> 
</plist> 

Örnek kodları:

var c = 2 
for r in 0 ... 2 { 
    for m in 0 ... 2 { 
    switch (true) { 
     case (r == 0 && m > 0) || (r > 0 && m == 0): 
     c = 0 
     case r == 1 && m > 1: 
     c = 1 
     default: 
     c = 2 
    } 
    let str = String. localizedStringForPlurals(formatKey: "record in room", args: r, m, c) 
    println(str) 
    } 
} 

Baskı sonucu:

 
No record in none room (Normal case: OK) 
No record in 1 room (Weird case: how 0 record in > 0 rooms or 0 room with > 0 records?) 
No record in 2 rooms (Weird case: how 0 record in > 0 rooms or 0 room with > 0 records?) 
Only one record in none room (Weird case: how 0 record in > 0 rooms or 0 room with > 0 records?) 
Only one record in 1 room (Normal case: OK) 
Only one record in 2 rooms (Weird case: how 1 record in > 2 rooms?) 
Some records in none room (Weird case: how 0 record in > 0 rooms or 0 room with > 0 records?) 
Some records in 1 room (Normal case: OK) 
Some records in 2 rooms (Normal case: OK) 

bakınız CLDR: İngilizce için Language Plural Rules

İşte eğlence parçasıdır.