iOS Swift和localizedStringWithFormat

我无法在swift中find替代的localizedStringWithFormat 。 我想要做的是使用Localizable.stringsdict ,英文例子中的单数/复数本地化:

 <?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>%#@num_people_in_room@ 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> 

和代码:

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

任何想法如何在Swift中做到这一点?

Swift中也有相同的方法:

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

输出:

没有在房间里的logging
房间里只有一个logging
在房间里的一些logging
在房间里的一些logging

请注意,除了“Localizable.stringsdict”文件之外,还需要有一个“Localizable.strings”文件(可能为空)。

我写了一个易于使用的扩展:

 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 } 

以下是一些用法:

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

如果你在一个键中有多个数字值(你必须在你的资源文件中指定每个variables,如下例所示),你可以通过这个方法传递多个数字参数来得到本地化的string。

这是有趣的部分:

 <?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>%#@num_people_in_room@ in %#@room@ (%#@comment@)</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> 

示例代码:

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

打印结果:

没有房间的logging(正常情况下:确定)
 1房间没有logging(奇怪的情况:0logging在0房间或0房间logging> 0logging?)
 2房间没有logging(奇怪的情况:0logging在0房间或0房间logging> 0logging?)
只有一个logging在无房间(奇怪的情况:如何0logging在> 0房间或0房间> 0logging?)
一个房间只有一个logging(正常情况:确定)
只有一个logging在2个房间(奇怪的情况:如何1logging在> 2房间?)
有些logging在无房间(奇怪的情况:0logging在> 0房间或0房间> 0logging?)
一室的一些logging(正常情况:确定)
 2房间的一些logging(正常情况下:确定)

请参阅CLDR: 英语语言复数规则 。