在iOS 7中使用新的格式字符串说明符配置字典(支持复数)

在iOS 7中使用新的格式字符串说明符配置字典(支持复数),ios,objective-c,cocoa,localization,internationalization,Ios,Objective C,Cocoa,Localization,Internationalization,我正在尝试使用新的支持在iOS 7中对复数进行更复杂的本地化。我已经创建了.STRIGISDICT文件,根据基础发布注释中的信息格式化(COCOA WWDC会话中的新内容)。我已验证.stringsdict正在复制到我的应用程序包中(并且确实-[NSBundle pathForResource:…]找到了它)。但是,+[NSString localizedStringWithFormat:不会返回根据配置字典中的规则格式化的字符串 代码: Localizable.stringsdict: <

我正在尝试使用新的支持在iOS 7中对复数进行更复杂的本地化。我已经创建了.STRIGISDICT文件,根据基础发布注释中的信息格式化(COCOA WWDC会话中的新内容)。我已验证.stringsdict正在复制到我的应用程序包中(并且确实
-[NSBundle pathForResource:…]
找到了它)。但是,
+[NSString localizedStringWithFormat:
不会返回根据配置字典中的规则格式化的字符串

代码:

Localizable.stringsdict:

<?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>%d people are in the room</key>
     <dict>
          <key>NSStringLocalizedFormatKey</key>
          <string>%#@num_people_in_room@ in the room</string>
          <key>num_people_in_room</key>
          <dict>
               <key>NSStringFormatSpecTypeKey</key>
               <string>NSStringPluralRuleType</string>
                     <key>NSStringFormatValueTypeKey</key>
                     <string>d</string>
               <key>zero</key>
               <string>No one is</string>
                     <key>one</key>
                     <string>A person is</string>
               <key>two</key>
               <string>Two people are</string>
                     <key>other</key>
                     <string>%d people are</string>
          </dict>
     </dict>
</dict>
</plist>

%d房间里有人
NSStringLocalizedFormatKey
%#@房间里的人数
房间里的人数
NSStringFormatSpecTypeKey
NSStringPluralRuleType
NSStringFormatValueTypeKey
D
零
没有人是
一
一个人是
二
两个人在一起
其他
%d人是
我还上传了一个完整的、非常简单的示例项目:。您在文本字段中输入一个数字,标签将根据
-localizedStringWithFormat:
的结果进行更新

有人用过这个吗?我在设置它时有没有做错什么?

stringsdict(复数)在OS X Mavericks和iOS 7中都可以使用,并且基于Unicode CLDR(公共区域设置数据存储库)。英语只支持零、一和其他。有些语言支持“Two”,如阿拉伯语、希伯来语、爱尔兰语等

资料来源:
更新(2015年9月1日): 正如我在下面的回复中提到的(从2014年1月13日开始),常规字符串文件仍然是必需的,即使它是空的

您是否也添加了一个空字符串文件?文档中说,即使字符串文件将为空,也必须添加字符串文件,这可能是由于Cocoa中本地化的内部实现


这里的问题是缺少
可本地化的.strings
文件

即使它是空的,也需要它


在您的项目中尝试了它,并添加了文件,使项目工作正常。

您是否尝试了此APi StringWithFormat:?在我看来,这只是Cocoa(OS X)的一项功能,但在Cocoa Touch(iOS)中不可用。@hussainShabbir,是的,我尝试过,但行为没有改变。引用的WWDC会话清楚地表明,
-localizedStringWithFormat:
是正确的方法(即使在这种新的、更好的复数支持之前也是如此)。@MartinR,你可能是对的!我在iOS 7文档中找不到这方面的任何参考资料。然而,我实际上首先尝试了10.9(我实际上是一个OSX开发人员),并且遇到了完全相同的问题。我问iOS 7只是因为NDA…谢谢你的回答@bolot。不幸的是,这对我仍然不起作用。自从这个问题发布后,我尝试只为“一个”和“另一个”指定格式。在这两种情况下(即变量为1且变量大于1),格式化的字符串不会更改以反映stringsdict文件中的多元化规则。我在OS X和iOS 7上都试过了。@AndrewMadsen您是否也添加了空字符串文件?文档中说,即使字符串文件将为空,也必须添加字符串文件,这可能是由于Cocoa中本地化的内部实现!我想在我问了这个问题之后,这个注释被添加到了文档中。这就解决了问题,现在工作正常。谢谢!花了很多时间想弄明白为什么它不起作用!
<?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>%d people are in the room</key>
     <dict>
          <key>NSStringLocalizedFormatKey</key>
          <string>%#@num_people_in_room@ in the room</string>
          <key>num_people_in_room</key>
          <dict>
               <key>NSStringFormatSpecTypeKey</key>
               <string>NSStringPluralRuleType</string>
                     <key>NSStringFormatValueTypeKey</key>
                     <string>d</string>
               <key>zero</key>
               <string>No one is</string>
                     <key>one</key>
                     <string>A person is</string>
               <key>two</key>
               <string>Two people are</string>
                     <key>other</key>
                     <string>%d people are</string>
          </dict>
     </dict>
</dict>
</plist>