我不确定如何在以下情况下正确使用 NSNumberFormatter 并正确保持本地化/国际化。
英文输出:
0 bananas
1 banana
5 bananas
我应该怎么做才能正确保持国际化/本地化?
我不确定如何在以下情况下正确使用 NSNumberFormatter 并正确保持本地化/国际化。
英文输出:
0 bananas
1 banana
5 bananas
我应该怎么做才能正确保持国际化/本地化?
复数的国际化是一个难题。我不是专家,但是除了英语简单的“1 是单数,所有其他都是复数”之外,各种语言都有各种复数方案。某些语言对 0、1、2、3 和 >3 有不同的形式。鉴于语言的复杂性,可能还有更复杂的方案。
Cocoa 中的任何内容,包括NSNumberFormatter
,都没有提供任何帮助,而不仅仅是NSLocalizedString
和朋友的正常字符串本地化。因此,您可以使用NSLocalizedString
“0 香蕉”、“1 香蕉”、“2 香蕉”、“3 香蕉”和“%d 香蕉”等键。然后,使用一个开关来加载您希望格式化的实际香蕉数量的开关。
另一种方法是使用类似“bananas: %d”的字符串。
或者,您可以通过为 0、1 和 >1 提供本地化字符串来组合技术,并建议翻译人员在这些形式不足以满足他们的语言时切换到平底船样式。
肯回答得很好。
我会添加这个。
首先,最好将完整的短语提供给翻译人员,因为不同语言的语法差异很大。但这还不够。您必须准备好处理翻译团队的一些请求。例如,在法语中,船被翻译成 le bateau,飞机被翻译成 l'avion(而不是 le avion)。翻译人员经常使用技巧来避免这种情况,引入特殊情况,但这并不总是可能的,也不可取。
与翻译团队合作寻找最佳解决方案,并尽可能将特定案例推广到所有语言,以使代码保持语言中立。几个相同的字符串优于代码中的语言特定情况。
随着时间和经验,你会习惯这一点。我在以多种语言本地化的软件工作了 10 多年(我认为在 7 到 23 之间,不完全确定 23 ;)。您将了解问题出在哪里以及这些语言的一些细节。顺便说一句,没有那么多问题:复数、体裁、缩略词是最常见的。格式通常由系统语言环境 API 很好地处理。这很有趣!
我刚刚发布了JJPluralForm,它是 Mozilla 的 PluralForm 的改编版。
有了这个,你就不必担心在你的代码中做所有的if-else
,switch-case
代码来进行本地化,随着本地化数量的增加,这变得不可能维护(俄语有 3 个复数规则,阿拉伯语有 6 个,等等) .
可以处理类似于您给出的示例的内容:
[[JJPluralForm sharedManager] pluralStringForNumber:numberOfBananas
withPluralForms:NSLocalizedString(@"N_BANANAS_PLURAL_STRING", @"")
localizeNumeral:YES];
然后将每个 Localizable.strings 文件本地化N_BANANAS_PLURAL_STRING
为以分号分隔的复数形式列表。对于英语,那将是"%@ banana;%@ bananas"
.
查看该项目以获取更多详细信息。