国际化数量和数量

时间:2012-06-30 03:41:00

标签: objective-c cocoa internationalization nsnumberformatter

我不确定如何在以下情况下正确使用NSNumberFormatter并正确保持本地化/国际化。

英文输出:

0 bananas
1 banana
5 bananas

如何正确保持国际化/本地化?

3 个答案:

答案 0 :(得分:4)

复数的国际化是一个难题。我不是专家,但是除了英语之外,各种语言都有多种复数形式,简单的“1是单数,其他都是复数”。某些语言具有0,1,2,3和> 3的不同形式。鉴于语言的复杂性,可能还有更复杂的方案。

除了NSNumberFormatter和朋友的正常字符串本地化之外,Cocoa中的任何内容(包括NSLocalizedString)都不提供任何帮助。因此,您可以使用NSLocalizedString键,例如“0香蕉”,“1香蕉”,“2香蕉”,“3香蕉”和“%d香蕉”。然后,使用开关加载一个用于您希望格式化的实际香蕉数量。

另一种方法是使用像“香蕉:%d”这样的字符串。

或者您可以通过提供0,1和> 1的本地化字符串来组合技术,并向翻译人员建议,如果这些表单不足以支持他们的语言,他们会切换到平底船样式。

答案 1 :(得分:1)

肯回答得很好。

我会加上这个。

在第一次近似中,最好给译者提供完整的短语,因为语法之间的语法差异很大。但这还不够。您必须准备好处理翻译团队的一些请求。根据法语的例子,这艘船被翻译成le bateau,飞机变成了l'avion(而不是le avion)。很多时候,翻译人员会使用技巧来避免这种情况,引入特殊情况,但这并不总是可行也不可取。

与翻译团队合作,找到最佳解决方案,并将具体案例概括为所有语言(如果可以的话),使代码保持语言中立。几个相同的字符串比代码中的语言特定情况更好。

有了时间和经验,你会习惯这个。我在使用多种语言本地化的软件上工作了10多年(我认为7到23之间,不完全确定23 tho;)。您将了解出现问题的地方以及有关这些语言的一些细节。顺便说一下,没有那么多问题:复数,流派,收缩是最常见的。格式通常由系统区域设置API很好地处理。这很有意思!

答案 2 :(得分:0)

我刚刚发布了JJPluralForm,改编自Mozilla的PluralForm。

有了这个,您就不必担心执行所有if-elseswitch-case代码来进行代码本地化,随着您的本地化数量的增长而无法维护(俄语已经3个复数规则,阿拉伯语有6个等等。)。

您提供的示例之类的内容可以通过以下方式处理:

[[JJPluralForm sharedManager] pluralStringForNumber:numberOfBananas
                                    withPluralForms:NSLocalizedString(@"N_BANANAS_PLURAL_STRING", @"")
                                    localizeNumeral:YES];

然后,每个Localizable.strings文件将N_BANANAS_PLURAL_STRING本地化为以分号分隔的复数形式列表。对于英语,那将是"%@ banana;%@ bananas"

查看项目了解更多详情。