iOS .stringsdict 不起作用

Gar*_*yle 6 localization ios swift

我正在尝试使用 iOS 编程中的 .stringsdict 功能来显示数字的正确序数后缀(st、nd、rd 等...)。我已经为英语创建了 .stringsdict 文件,但它只使用了“one”和“other”键。它忽略了“两个”和“几个”选项。有人看到我在这里做错了吗?

该文件如下所示:

<?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>TEAM_RANK_ORDINAL</key>
    <dict>
        <key>NSStringLocalizedFormatKey</key>
        <string>%#@ordinal_string@</string>
        <key>ordinal_string</key>
        <dict>
            <key>NSStringFormatSpecTypeKey</key>
            <string>NSStringPluralRuleType</string>
            <key>NSStringFormatValueTypeKey</key>
            <string>lu</string>
            <key>one</key>
            <string>%lust</string>
            <key>two</key>
            <string>%lund</string>
            <key>few</key>
            <string>%lurd</string>
            <key>other</key>
            <string>%luth</string>
        </dict>
    </dict>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)

然后我像这样从 Swift 访问它。对于值 1,它附加 st,但每隔一个数字附加 th:

    let fmt = NSLocalizedString("TEAM_RANK_ORDINAL", comment: "")
    for i in 0...30 {
        println(String(format: fmt, i))
    }
Run Code Online (Sandbox Code Playgroud)

Mar*_*n R 9

英语语言环境忽略“two”和“few”规则,只使用“one”和“other”。

请参阅“国际化和本地化指南”中的多个规则属性

类别的含义取决于语言,并非所有语言都具有相同的类别。

例如,英语仅使用one, 和other类别来表示复数形式。阿拉伯有不同的复数形式 zeroonetwofewmany,和other类别。...

(据我所知)没有办法使用 .stringsdict 文件来生成序数。

  • 这些类别不是任意的;它们是由 Unicode 定义的。请参阅http://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html。stringsdict 的主要目的是在*英语以外的语言中实现语法正确的复数形式。作为一个附带的好处,它消除了对是否有单独的单数字符串进行 if/else 检查的需要。 (2认同)

Rob*_*Rob 5

虽然马丁回答了您的stringsdict问题,但对于偶然发现“序数”问题的用户,应该只使用NumberFormatter本地化的序数。例如

let formatter = NumberFormatter()
formatter.numberStyle = .ordinal

for i in 1..<30 {
    print(formatter.string(for: i) ?? i)
}
Run Code Online (Sandbox Code Playgroud)

制作(针对英语用户):

1
号2号
3
号4
号5
号6
号7
号8号
9
号10
号11
号12
号13号
14号
15号
16
号17
号18
号19号
20号
21号
22 号23号
24号25号 26 号27 号 28号 29号





而且,FWIW,即使该stringsdict方法适用于two等,也没有祈祷区分使用不同序数语法的大数字,例如第 122 和第 124 之间。NumberFormatter你确实需要为此使用。