2014-09-16 20 views
7

Non sono riuscito a trovare un sostituto per localizedStringWithFormat in rapido. Quello che sto cercando di fare è quello di utilizzare la localizzazione singolare/plurale utilizzando il Localizable.stringsdict, inglese esempio:iOS Swift e 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> 

e il codice:

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

Qualche idea su come fare questo in Swift?

risposta

19

Gli stessi metodi sono disponibili in Swift:

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

uscita:

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

Si noti che in aggiunta al file "Localizable.stringsdict" ci deve essere un "Localizable.strings "file (che può essere vuoto).

Aggiornamento per Swift 3/4:

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

ok fantastico! Il documento XCode riportava solo la funzione obiettivo-C. Grazie – valfer

1

ho scritto un'estensione per un semplice utilizzo:

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 
} 

Ecco alcuni usi:

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) 
} 

Nel caso in cui avere più di un valore numerico in una chiave (devi specificare ogni variabile in il tuo file di risorse come nel seguente esempio), puoi usare questo metodo per passare più di un numero di argomenti per ottenere una stringa localizzata.

Ecco la parte divertente:

<?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> 

codici di esempio:

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) 
    } 
} 

risultato di stampa:

 
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) 

See CLDR: Language Plural Rules per l'inglese.