【发布时间】:2017-03-12 10:11:14
【问题描述】:
我创建了一个 Localizable.strings 文件,翻译工作正常。但是有一种特殊情况,在英语中有一个单数和复数单词,例如“系列”。但是在德语中有两个不同的词:一个系列是“Serie”,两个及更多系列是“Serien”。如何处理此类异常?
谢谢马丁
【问题讨论】:
标签: ios swift localization
我创建了一个 Localizable.strings 文件,翻译工作正常。但是有一种特殊情况,在英语中有一个单数和复数单词,例如“系列”。但是在德语中有两个不同的词:一个系列是“Serie”,两个及更多系列是“Serien”。如何处理此类异常?
谢谢马丁
【问题讨论】:
标签: ios swift localization
这正是 Plural Rule Properties 在 Stringsdict files 是为了。
因此,除了“Localizable.strings”文件之外,您还必须提供 "Localizable.stringsdict" 属性列表文件 语言的复数规则。在你的情况下:
Localizable.strings:
"%ld series" = "%ld Serien";
Localizable.stringsdict:
<plist version="1.0">
<dict>
<key>%ld series</key>
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@series@</string>
<key>series</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>one</key>
<string>%ld Serie</string>
<key>other</key>
<string>%ld Serien</string>
</dict>
</dict>
</dict>
</plist>
注意Int 的正确格式说明符(可以
是一个 32 位或 64 位整数)是%ld。
现在一切都“自动”运行,Swift 代码没有任何变化:
for n in 1...3 {
let str = String(format: NSLocalizedString("%ld series", comment: ""), n)
print(str)
}
输出:
1 系列 2 连续剧 3 连续剧即使添加了更多具有其他复数规则的语言,也没有变化 在 Swift 代码中是必需的。
【讨论】:
有很多方法可以做到这一点。但是我更喜欢使用Apple推出的方式,它非常简单明了。
使用NSLocalizedString检查您的案件金额。
例子:
let toast: String
if days == 1 {
toast = NSLocalizedString("Serie.one", comment: "")
}
else {
toast = String(format: NSLocalizedString("Serien.other", comment: ""), days)
}
Localizable.strings 包含以下信息:
Serie.one = "Serie";
Serien.other = "Serien %d ";
【讨论】:
我的做法是按如下方式命名我的本地化名称:series = "series" and "Serie" and series_pural = "series" and "Serien"。然后系统只是在之后查找一个 _plural,如果它存在,那么它会显示它(如果你告诉它它是你正在本地化的复数词)。另一种方法是您根据具体情况处理一个单词是否是复数。
【讨论】: