对于这个问题,还有一个更强大的解决方案。请看来自TranslationExchange.com的Tr8n库。
https://github.com/tr8n/tr8n_objc_clientsdk
该库使用TranslationExchange的TML(翻译标记语言),使国际化过程非常简单。首先,您甚至不需要再处理Strings XML文件了... - Tr8n SDK将会实时为您创建和管理String文件 - 您永远不用再看它们了。
您的特定示例将简单的是:
Tr8nLocalizedStringWithTokens(@"{count || object}", @{@"count": objectList.count})
Tr8n库会自动为您选择任何语言中的正确复数形式。哈?是的,这很神奇。上面令牌示例的完整形式实际上是:
{count:number || one: object, other: objects}
这意味着“count”标记是一种数值类型,使用关键字“one”和“other”映射到英语复数形式...但Tr8n足够聪明,不需要您输入所有内容。它还足够聪明,将参数序列映射到适当的规则值。当然,它知道通过命名约定,“count”与数字规则相关联。因此,它变得非常简单:
{count || object}
顺便提一下,既然你提到了俄语,那么上面的内容的俄语翻译就很简单:
"{count || object}" = "{count || объект, объекта, объектов}"
这个例子太简单了,让我们来看一个更有趣的:
Tr8nLocalizedStringWithTokens(
@"{user} uploaded {count || photo} to {user | his, her} photo album.",
@{@"user": user, @"count": 5}
)
首先,祝你好运使用标准的iOS i18n库(或任何其他库)翻译这个句子...开个玩笑-但实际上,除了Tr8n之外,没有其他方法可以做到。
上述TML翻译成俄语就是简单的:
@"{user || загрузил, загрузила} {count || фотографию, фотографии, фотографий} в свой фотоальбом."
在这里,我们处理性别规则的方式与处理数字规则的方式相同。但是,我们不是使用“one”、“few”、“other”,而是使用“男性”、“女性”、“未知” - 每种语言可能具有不同的性别和数字规则。Tr8n将处理它,因此您无需担心。
好的,让我们把它提升到下一个级别。您已经决定必须将照片的数量加粗显示。小菜一碟。
Tr8nLocalizedAttributedStringWithTokens(
@"{user} uploaded [bold: {count || photo}] to {user | his, her} photo album.",
@{
@"user": user,
@"count": 5,
@"bold": @{@"font":@{@"name": @"system", @"size": @12, @"type": @"bold"}}
}
)
[加粗:... ] 是一个修饰标记。你是否注意到我们将宏切换到了AttributedString版本?这个宏实际上会使用iOS本地的装饰机制来产生NSAttributedString。你能猜出俄语翻译是什么吗?
@"{user || загрузил, загрузила} [bold: {count || фотографию, фотографии, фотографий}] в свой фотоальбом."
另外,您可以在其他地方预定义所有装饰令牌,这样您就不必每次都定义它们。
让我们再做一个最后的例子... 假设您有一篇以下形式的新闻订阅:
Tr8nLocalizedAttributedStringWithTokens(
@"{actor} sent {target} [bold: {count || gift}].",
@{
@"actor": user1,
@"target": user2,
@"count": 5
}
)
在英语中看起来并不有趣。但是在俄语或任何支持语言格的语言中,它都会变得有趣。如果{target}的名称恰好是俄语,则实际上需要使用俄语与格。
http://en.wikipedia.org/wiki/Dative_case
如果您不会说俄语,那么您可能不需要了解它。但是您的俄语翻译应该知道。让我们看看俄语翻译:
@"{actor || подарил, подарила} {target::dat} [bold: {count || подарок, подарка, подарков}].",
Tr8n 足够智能,可以使用其强大的语言规则引擎,并将与 {target} 令牌传递的俄语名称应用于与格语态...
对于一个简单的数字问题来说,这是一个有点长的答案。感谢您阅读到这里。希望它有所帮助。
免责声明:我是 Tr8n 框架和 TML 语言的创建者。如果您有任何问题,请联系我,我很乐意为您解答所有翻译问题。