gpt4 book ai didi

iphone - 使用 Objective-C 在 iPhone 上本地化动态复数名词消息(例如 "5 Items Processed")

转载 作者:IT王子 更新时间:2023-10-29 07:44:02 25 4
gpt4 key购买 nike

在我当前的应用程序中,我有显示消息的代码,例如“已处理 5 件元素。”为了保持短语语法正确,即它应该是“5 Item”还是“5 Items”,我使用以下代码:

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为了指出这一点 ->: 您还需要在 .stringsdict 旁边创建 Localizable.strings 文件以使复数工作起作用(即使它是空的)。

关于iphone - 使用 Objective-C 在 iPhone 上本地化动态复数名词消息(例如 "5 Items Processed"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5122941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com