我是Swift和iOS编程的新手,我遇到了一个关于带有占位符的动态字符串以及Swift中的复数支持的问题
例如,如果你有一个多语言应用程序,并且不想硬编码字符串,标签和消息等...
我可以在Android中轻松地使用以下代码在不同文件夹中的XML文件中执行此操作,其中android设备将根据当前区域设置查找字符串:
<string name="name">You have %2$d new messages.</string>
<plurals name="name">
<item quantity="one">You have a new message.</item>
<item quantity="other">You have %2$d new messages.</item>
</plurals>
借助上述XML并遵循Java:
res.getString(R.string.name, mailCount)
res.getQuantityString(R.plurals.name, mailCount, mailCount)
这项工作是在Android中完成的,我正在寻找与Swift(iOS)相对应的解决方案
答案 0 :(得分:9)
1:设置项目Localizations
,如截图中显示的项目有英语和俄语。
2:创建一个名为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>NumberOfMessages</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@value@</string>
<key>value</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>You have a new message.</string>
<key>other</key>
<string>You have %d new messages.</string>
</dict>
</dict>
</dict>
</plist>
3:为每种语言本地化以上文件,请参见截图,该文件已本地化为英语和俄语语言:
用法:
String(format: NSLocalizedString("NumberOfMessages", comment: ""), 1)
输出:您有新消息。
String(format: NSLocalizedString("NumberOfMessages", comment: ""), 2)
输出:您有2条新消息。
多个规则:在XML代码中,请注意<key>one</key>
和<key>other</key>
,在这里您可以使用zero
,one
,{{1} },two
,few
,many
取决于语言和您的要求。
使用以下链接获取有关特定语言复数规则的更多信息:http://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html
答案 1 :(得分:3)
This blog explains非常详细地说复数是什么。使用IOS的代码示例。
在某些语言中,复数不会像他们一样工作 英语。有些语言不表示复数(如日语), 而对于其他人而言,这个词会根据数量而改变(例如 作为俄语)。为了让事情变得简单,iOS已经对不同的复数进行了分类 类型如下:
- 零。用于表示0数量。
- 一。用于表示正好数量为1。
- 两个。用于表示正好数量为2.
- 很少。用于表示小于2的小数量,但这取决于语言。
- 很多。用于表示大量数字,但这也取决于语言。
其他。用于表示上述内容未涵盖的每个数字 类别。
并非所有语言都需要所有类别 指定,因为所有工作都不同。乍一看,它会 似乎英语需要零,一和多的规则。 但是,英语的复数规则将用一个和 另外,因为除1之外的所有数字都被平等对待。
要指定复数规则,您需要使用字符串字典 (Localizable.stringsdict)而不是常规的Localizable.strings 文件。实际上,您仍然需要.strings文件 为.stringsdict工作,即使它是空的。
在Xcode中,创建一个新的Plist文件,并为其命名 Localizable.stringsdict。填充后,Plist中的原始数据 将如下所示:
<?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>number_of_days</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@value@</string>
<key>value</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>d</string>
<key>one</key>
<string>%d day remaining</string>
<key>other</key>
<string>%d days remaining</string>
</dict>
</dict>
</dict>
</plist>
这是如何在代码中引用复数:
let format = NSLocalizedString("number_of_days", comment: "")
let message = String.localizedStringWithFormat(format, numDays)
再次,信用转到Quentin