多元化字典总是从"零"返回值。键

时间:2014-04-09 14:37:40

标签: ios objective-c nslocalizedstring

我使用新的stringsdict格式在我的应用中对一些字符串进行本地化和复数化。

我阅读了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"

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

错误就是

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

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

 %i %#@minutes@

期望两个参数。所以第一个%i是 由5替换,下一个%#@minutes@由未定义的内容替换。 一种可能的解决方法是使用&#34;位置参数&#34;:

 %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>

但请注意,对于英语,只有&#34;零&#34;支持多个规则。和&#34;一个&#34;,但不是&#34;两个&#34;,如下所述:https://stackoverflow.com/a/21095611/1187415