Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective-C的国际多元化Lib?_Objective C_Ios_Internationalization - Fatal编程技术网

Objective-C的国际多元化Lib?

Objective-C的国际多元化Lib?,objective-c,ios,internationalization,Objective C,Ios,Internationalization,我正在将我的应用程序国际化,并正在寻找如何处理复数形式的解决方案。我遇到了一个项目,它从本质上抽象出了复数的国际化问题。下面是它的工作原理: 语言可以遵循许多“复数规则”。每种语言都适用于多种复数规则中的一种(Mozilla的文档中有15种可能的复数规则)。例如,在规则为0的语言中(如中文),没有复数形式,因此只需要一种单词形式。在规则1的语言中(如德语),每个词有两种不同的复数形式。依此类推,取决于规则如何匹配 编写国际化字符串时,不仅要传递要国际化的字符串,还要传递要使名词复数的数字: pr

我正在将我的应用程序国际化,并正在寻找如何处理复数形式的解决方案。我遇到了一个项目,它从本质上抽象出了复数的国际化问题。下面是它的工作原理:

  • 语言可以遵循许多“复数规则”。每种语言都适用于多种复数规则中的一种(Mozilla的文档中有15种可能的复数规则)。例如,在规则为0的语言中(如中文),没有复数形式,因此只需要一种单词形式。在规则1的语言中(如德语),每个词有两种不同的复数形式。依此类推,取决于规则如何匹配

  • 编写国际化字符串时,不仅要传递要国际化的字符串,还要传递要使名词复数的数字:

    print(“您有“+num+”+PluralForm.get(num,downloads)+”)

    在Objective-C中,我们的做法会有很大不同:

    NSString*str=[NSString stringWithFormat:NSLocalizedStringFromTable(@“%d项”),myNumber]

    当然,上述Objective-C示例并不能解决复数形式的问题

  • 当PluralForm.get函数收到调用时,根据当前使用的语言,它将应用复数形式,并根据应遵循的特定子规则从字符串文件中提取适当的国际化字符串

  • PluralForm的优势很明显(至少对我来说)。它从编码者那里抽象出实际的语言规则,这样它们就不需要在需要处理复数形式的所有位置重复

    我希望在编写iPhone应用程序时使用类似的系统。是否有将Mozilla的PluralForm移植到objective-c的项目或代码?

    从Mozilla的角度来看,实现自己版本的PluralForm应该很容易。在objective-c中获取

    首先,从本地化中检索复数规则编号,并使用它选择实现该规则的适当getter。有16(1)个表达式返回用于给定数字的正确复数形式索引。幸运的是,它们似乎是用JavaScript子集编写的,这也是有效的C代码。。。混合了一些模运算的布尔表达式和三值表达式

    复数形式由翻译人员在给定单词的本地化字符串中以分号分隔列表的形式提供。表格的顺序如中所述。用分号将它们拆分,并使用getter中的索引选择匹配的表单

    从技术上讲,没问题。唯一的问题是,我不知道如何正确地派生您的代码并尊重代码

    (1) 实施包含Breton的第17条规则,但其形式尚未记录,因此…

    Smartling(翻译管理平台)发布了一个用于在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 элемента обработано";
    
    实际代码不需要根据语言进行更改。一个函数可以跨所有语言工作,并返回相应的翻译字符串


    请随意分享评论、改进等。

    我对问题稍加修改,使其更具一般性。希望你们不介意。这看起来和苹果的stringsdict文件的想法相似。请参阅本手册的“处理名词复数和度量单位”部分