Objective-C的国际多元化图书馆?

我正在国际化我的应用程序,并正在寻找解决scheme来处理复数forms。 我遇到了Mozilla的PluralForm项目,该项目基本上将国际化的复数问题抽象出来。 这是如何工作的:

  1. 语言可以遵循一些“复数规则”。 每种语言都符合许多复数规则中的一个(Mozilla的文档有15个可能的复数规则)。 例如,在规则0(如中文)的语言中,没有复数forms,所以只有一个需要的单词forms。 在规则1(如德语)的语言中,每个单词都有两个不同的复数forms。 等等,这取决于规则如何匹配。

  2. 当你编写一个国际化的string,你不仅要传递string国际化,但你想复数名词的数字:

    print("You have " + num + " " + PluralForm.get(num, downloads) + ".");

    在Objective-C中,人们会做的更加不同:

    NSString *str = [NSString stringWithFormat:NSLocalizedStringFromTable(@"%d Items"), myNumber];

    当然,上面这个Objective-C例子并没有解决复数forms的问题。

  3. 当PluralForm.get函数调用时,根据当前正在使用的语言,它将应用复数forms,并根据应遵循的特定子规则从string文件中提取正确的国际化string。

PluralForm的优点很明显(至less对我来说)。 它从编码器中抽象出实际的语言规则,以便它们不需要在所有必须处理复数forms的位置复制。

我想使用像编程我的iPhone应用程序时的系统。 有没有项目或代码可用端口Mozilla的PluralForm目标C?

Smartling(翻译pipe理平台)已经发布了一个用于pipe理iOS复数的开源库 。 在处理了众多有iOS复数问题的客户之后,并没有find能解决我们和客户需要的解决scheme之后,我们决定build立自己的解决scheme。

该库为复数string提供密钥,并根据CLDR复数规则扩展它们以包含复数forms。 该库为NSLocalizedString提供了一个名为SLPluralizedString的替代函数来执行查找。

英文源代码文件如下所示:

 "%d Items Processed##{one}" = "1 Item Processed"; "%d Items Processed##{other}" = "%d Items Processed"; 

你可以使用SLPluralizedString函数来查找string:

 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 элемента обработано"; 

实际的代码不需要根据语言改变。 一个函数可以跨所有语言使用,并返回相应的翻译string。

随意分享评论,改进等

从查看Mozilla的PluralForm.jsm实现,在Objective-C中实现自己的PluralForm.get版本应该是相当容易的。

首先,从您的本地化中检索复数规则编号,然后使用它来select适当的获取方,即实现该规则。 有16 (1)expression式返回适当的复数forms的索引用于给定的数字。 幸运的是,它们似乎是用JavaScript子集写的,这也是有效的C代码…布尔和三元expression式与一些模操作混合在一起。

您的翻译人员以给定单词的本地化string中的分号分隔列表forms提供多个表单 。 表格的顺序在多个规则的列表中描述。 你用分号分开它们,并使用getter中的索引select匹配的表单。

从技术上讲,没有问题。 唯一的问题是,我不知道如何正确派生你的代码,并尊重MPL许可证 。

(1)实施包含第17条规则布列塔尼,但其forms尚未logging,所以…