我使用新的stringsdict格式在我的应用中对一些字符串进行本地化和复数化。
我阅读了this和this以供参考,我希望我能够正确抓取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"
感谢您的帮助。
答案 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。