【问题标题】:Pluralized dictionary always return the value from "zero" key复数字典总是从“零”键返回值
【发布时间】:2014-04-09 14:37:39
【问题描述】:

我正在使用新的字符串字典格式来本地化和复数我的应用程序中的一些字符串。

我阅读了thisthis 以供参考,我希望我的来自stringsdict 的本地化字符串被正确抓取。

问题是,我总是看到“零”键的值,我不知道这里发生了什么问题,因为很难调试本地化方法中的操作。

让我在这里放一些代码:

1 - 这是我的 Localizable.stringsdict 文件,在同一个项目中也存在一个 Localizable.strings。

    <?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>%i minutes</key>
        <dict>
            <key>NSStringLocalizedFormatKey</key>
            <string>%i %#@minutes@</string>
            <key>minutes</key>
            <dict>
                <key>NSStringFormatSpecTypeKey</key>
                <string>NSStringPluralRuleType</string>
                <key>NSStringFormatValueTypeKey</key>
                <string>i</string>
                <key>one</key>
                <string>One minute</string>
                <key>two</key>
                <string>Two minutes</string>
                <key>other</key>
                <string>Other minutes</string>
                <key>zero</key>
                <string>Zero minutes</string>
            </dict>
        </dict>
    </dict>
    </plist>

2 - 有一个简单的代码来测试这个字符串

NSString *output = [NSString localizedStringWithFormat:NSLocalizedString(@"%i minutes", nil), 5 ];
NSLog(@"Output: %@", output); // And here, always display "Output: 5 Zero minutes" independently the value I put in the formated string, in this case (five) needs to display "Output: 5 Other minutes"

感谢您的帮助。

【问题讨论】:

    标签: ios objective-c nslocalizedstring


    【解决方案1】:

    错误在于

    [NSString localizedStringWithFormat:NSLocalizedString(@"%i minutes", nil), 5 ];
    

    只将一个参数(整数5)传递给字符串格式化函数, 但格式扩展为

     %i %#@minutes@
    

    需要两个参数。所以第一个%i 是 被5 替换,下一个%#@minutes@ 被未定义的东西替换。 一种可能的解决方法是使用“位置参数”:

     %i %1$#@minutes@
    

    第二种格式中的1$ 部分指定应该从 第一个参数。

    或者,将第一个 %i 格式移动到可能的替换中。 那么stringsdict文件看起来是这样的:

    <plist version="1.0">
    <dict>
        <key>%i minutes</key>
        <dict>
            <key>NSStringLocalizedFormatKey</key>
            <string>%#@minutes@</string>
            <key>minutes</key>
            <dict>
                <key>NSStringFormatSpecTypeKey</key>
                <string>NSStringPluralRuleType</string>
                <key>NSStringFormatValueTypeKey</key>
                <string>d</string>
                <key>one</key>
                <string>%i One minute</string>
                <key>two</key>
                <string>%i Two minutes</string>
                <key>other</key>
                <string>%i Other minutes</string>
                <key>zero</key>
                <string>%i Zero minutes</string>
            </dict>
        </dict>
    </dict>
    </plist>
    

    但请注意,对于英语,复数规则仅支持“零”和“一”,但不支持“二”,如下所述:https://stackoverflow.com/a/21095611/1187415

    【讨论】:

    • 感谢您的回答。我想我错过了这个细节,现在我可以正确地复数我的应用程序了。干杯!
    猜你喜欢
    • 2018-04-08
    • 1970-01-01
    • 2017-10-23
    • 2013-05-11
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多