我正在使我的应用程序国际化,并且正在寻找一种解决复数形式的方法。我遇到了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?

    最佳答案

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

    实际的代码无需根据语言进行更改。一个函数可以在所有语言中工作,并返回适当的翻译后的字符串。

    随时分享评论,改进等。

    关于objective-c - 用于Objective-C的国际多元化图书馆?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5130844/

    10-12 19:42