2014-09-16 17 views
7

Nie mogłem znaleźć zamiennika dla localizedStringWithFormat w szybkim tempie. Jakie usiłuję zrobić jest użycie liczby pojedynczej/mnogiej lokalizacji pomocą Localizable.stringsdict, angielski przykład:iOS Swift i 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> 

i kod:

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

Każdy pomysł na jak to zrobić w Swift? są dostępne

Odpowiedz

19

Te same metody w Swift:

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

wyjściowa:

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

Należy pamiętać, że oprócz "Localizable.stringsdict" plik nie musi być „Localizable.strings "plik (który może być pusty).

Aktualizacja Swift 3/4:

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

ok świetnie! Dokument XCode zgłosił tylko funkcję celu C. Dziękuję Ci – valfer

1

pisałem rozszerzenie dla łatwego użycia:

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 
} 

Oto niektóre zwyczaje:

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

W przypadku mają więcej niż jedną wartość numeryczną w kluczu (musisz podać każdą zmienną w twój plik zasobów, jak w poniższym przykładzie), możesz przekazać więcej niż jedną liczbę argumentów, aby uzyskać zlokalizowany łańcuch.

Oto część zabawy:

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

Przykładowe kody:

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

Drukuj wynik:

 
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 dla języka angielskiego.