我正在国际化我的应用程序,并正在寻找如何处理复数形式的解决方案。我遇到了Mozilla's PluralForm项目,它基本上将复数问题抽象为国际化。以下是它的工作原理:
语言可以遵循许多“复数规则”。每种语言都适用于众多复数规则中的一种,而且只有一种(Mozilla的文档有15种可能的复数规则)。例如,在具有规则0的语言(例如中文)中,没有复数形式,因此只有一个所需的单词形式。在具有规则1(例如德语)的语言中,每个单词具有两个不同的复数形式。依此类推,取决于规则如何匹配。
当您编写国际化字符串时,您不仅要传递要国际化的字符串,还要传递您想要将名词复数化的数字:
print("You have " + num + " " + PluralForm.get(num, downloads) + ".");
在Objective-C中,人们可能会采用不同的方式:
NSString *str = [NSString stringWithFormat:NSLocalizedStringFromTable(@"%d Items"), myNumber];
当然,上面的Objective-C示例并未解决复数形式的问题。
当PluralForm.get函数接到一个调用时,根据当前使用的语言,它应用复数形式,并从字符串文件中提取适当的国际化字符串,具体取决于它应该使用哪个特定的子规则跟随。
PluralForm的优势很明显(至少对我而言)。它从编码器中抽象出实际的语言规则,因此在您必须处理复数形式的所有位置都不需要复制它们。
我想使用像编写iPhone应用程序时那样的系统。是否有可以将Mozilla的PluralForm移植到objective-c的项目或代码?
答案 0 :(得分:4)
Smartling(翻译管理平台)发布了open source library用于管理iOS中的复数形式。在处理了许多具有iOS复数问题的客户并且找不到能够满足我们和客户需求的解决方案之后,我们决定建立自己的。
库获取多个字符串的键,并将它们扩展为包含基于CLDR复数规则的复数形式。该库为NSLocalizedString提供了一个名为SLPluralizedString的替代函数来进行查找。
英文源文件如下:
"%d Items Processed##{one}" = "1 Item Processed";
"%d Items Processed##{other}" = "%d Items Processed";
您可以使用SLPluralizedString函数查找字符串:
SLPluralizedString(@”%d Items Processed”, numItems, @”Number of items processed”);
翻译的俄语文件将具有适当数量的语言键/值:
"%d Items Processed##{one}" = "%d элемент обработан";
"%d Items Processed##{few}" = "%d элемента обработано";
"%d Items Processed##{many}" = "%d элементов обработано";
"%d Items Processed##{other}" = "%d элемента обработано";
实际代码不需要根据语言而改变。一个函数适用于所有语言并返回相应的翻译字符串。
随意分享评论,改进等。
答案 1 :(得分:0)
通过查看Mozilla的implementation of PluralForm.jsm,在Objective-C中实现自己的PluralForm.get
版本应该很容易。
首先从本地化中检索复数规则编号,然后使用它来选择实施规则的相应getter。有16个(1)表达式返回用于给定数字的正确复数形式的索引。幸运的是,它们似乎是用JavaScript子集编写的,它也是有效的C代码...混合了一些模运算的布尔和三元表达式。
您的译员在给定单词的本地化字符串中以分号分隔列表的形式提供了多种表单。表格的顺序在list of plural rules中描述。您可以用分号分隔它们,并使用getter中的索引选择匹配的表单。
从技术上讲,没问题。唯一的问题是我不知道如何正确派生您的代码并尊重MPL license。
(1)实施包含布列塔尼的第17条规则,但其形式尚未记录,因此......