2014-09-16 11 views
7

Ich konnte keinen Ersatz für localizedStringWithFormat in Swift finden. Was ich versuche zu tun, den Singular/Plural-Lokalisierung zu verwenden, mit dem Localizable.stringsdict, Englisch Beispiel:iOS Swift und 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> 

und den Code:

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

Irgendeine Idee, wie man dies in Swift zu tun?

Antwort

19

Die gleichen Methoden sind in Swift verfügbar:

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

Ausgang:

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

Beachten Sie, dass ein „Localizable.strings neben der "Localizable.stringsdict" Datei dort zu sein braucht "Datei (die möglicherweise leer ist).

Update für Swift 3/4:

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

ok gut! Das XCode-Dokument hat nur die Ziel-C-Funktion gemeldet. Vielen Dank – valfer

1

schrieb ich eine Erweiterung für die einfache Nutzung:

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 
} 

Hier sind einige Verwendungen:

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

Falls Sie haben mehr als einen numerischen Wert in einem Schlüssel (Sie müssen jede Variable in angeben Ihre Ressourcendatei wie im folgenden Beispiel), können Sie mit dieser Methode mehr als eine Anzahl von Argumenten übergeben, um eine lokalisierte Zeichenfolge zu erhalten. Hier

ist der spaßige Teil:

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

Beispiel-Codes:

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

drucken Ergebnis:

 
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 für Englisch.