使用Objective-C在iPhone上本地化动态复数名词消息(例如“5个项目已处理”)

在我目前的应用程式中,我有显示讯息的程式码,例如“5个项目已处理。为了保持短语语法正确,即是否应该是“5项目”或“5项目”,我使用以下代码:

int numItems = 5;
NSString *myString = [[NSString alloc] initWithFormat:@"%d Item%@ Processed", numItems, (numItems == 1 ? @"" : @"s")];

这工作正常现在。但我本地化我的应用程序,并希望确保文本是语法正确的所有我正在翻译应用程序的语言。我可以做这样的事情:

int numItems = 5;
NSString *myString = (numItems == 1 ? 
NSLocalizedStringWithTable(@"%d Item Processed", @"myApp", @"singular version") :
NSLocalizedStringWithTable(@"%d Items Processed", @"myApp", @"plural version"));

然而,并不是所有的语言都有相同的规则如何复数运作!例如,(在这里原谅我的非常具体的例子),在俄语中,用以最后一位数字1结束的数字修饰的名词(即,21,31,但不是11)取指数情况,以2-4结束的数字为单数,和5采取基因复数情况。这将需要更严重的逻辑来处理如何以语法正确的方式来复数特定名词,并且该逻辑将不匹配到英语逻辑。因此,在理论上,我不能在我的Objective-C代码中的语法逻辑,但应该在字符串文件中的语法逻辑。有没有办法做到这一点?用户如何翻译其应用的动态文本,以使其在语法上保持正确?

从iOS 7,Foundation框架有native support for pluralization.
这里是一个快速教程如何使用它:

创建一个名为Localizable.stringsdict的plist文件

英语本地化:

<?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 tasks waiting for action</key>
        <dict>
            <key>NSStringLocalizedFormatKey</key>
            <string>%#@tasks@ waiting for action</string>
            <key>tasks</key>
            <dict>
                <key>NSStringFormatSpecTypeKey</key>
                <string>NSStringPluralRuleType</string>
                <key>NSStringFormatValueTypeKey</key>
                <string>d</string>
                <key>one</key>
                <string>A task is</string>
                <key>two</key>
                <string>Two tasks are</string>
                <key>other</key>
                <string>%d tasks are</string>
            </dict>
        </dict>
    </dict>
</plist>

波兰语本地化:

<?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 tasks waiting for action</key>
        <dict>
            <key>NSStringLocalizedFormatKey</key>
            <string>Masz %#@zadanie@ do zrobienia</string>
            <key>zadanie</key>
            <dict>
                <key>NSStringFormatSpecTypeKey</key>
                <string>NSStringPluralRuleType</string>
                <key>NSStringFormatValueTypeKey</key>
                <string>d</string>
                <key>one</key>
                <string>jedno zadanie</string>
                <key>few</key>
                <string>%d zadania</string>
                <key>other</key>
                <string>%d zadań</string>
            </dict>
        </dict>
    </dict>
</plist>

最后在你的实现文件中,你可以这样调用字典:

cell.tasksInfoLabel.text = [NSString localizedStringWithFormat:NSLocalizedString(@"%d tasks waiting for action", @"%d tasks waiting for action"), (long)taskCount];

编辑:
感谢Zaphod指出这 – >:你还需要创建Localizable.strings文件旁边的.stringsdict有复数的工作(即使它是空的)。

http://stackoverflow.com/questions/5122941/localizing-dynamic-plural-noun-messages-e-g-5-items-processed-on-iphone-usi

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:使用Objective-C在iPhone上本地化动态复数名词消息(例如“5个项目已处理”)