使用iOS Stringsdict文件的显式复数字符串



我开始学习iOS Stringsdict文件,并在一个使用以下语法的项目中发现了一些现有代码:

<key>zero</key>
<string>You no message.</string>

根据CLDR,zero在英语中是一个无效的复数,我们希望使用显式复数规则(使用ICU MessageFormat时为=0(

我试图找到如何在iOS Stringsdict文件中使用显式复数规则,但找不到任何方法来实现这一点。有人能确认这是否得到支持吗?


解决方案示例(我不能测试它们,但也许有人可以?(

<key>0</key>
<string>You no message.</string>

<key>=0</key>
<string>You no message.</string>

ICU消息格式的CLDR实现的显式多规则部分的额外引用:

https://formatjs.io/guides/message-syntax/#plural-格式化

=值它用于匹配特定的值,而不考虑当前区域设置的多个类别。

如果您只对zero规则感兴趣,那么它将在任何语言的.stringsdict文件中处理。

来源:OS X v10.9 基金会发行说明

如果存在"零",则无论CLDR规则为数值指定了什么,该值都将用于映射参数值零。

否则,这些是唯一处理的规则(取决于语言(:zero, one, two, few, many, others

简短回答

.stringsdict文件无法支持显式多规则(除了下面详细介绍的zero的自定义Apple实现(

详细答案

正常CLDR实现:

  • 所有不在给定语言的CLDR中的规则都将被忽略
  • 如果使用规则zero,它将使用CLDR值(大多数语言将0作为zero的值(。这也包括像拉脱维亚语这样的语言,它们具有映射到zero2030等值,并且苹果自己的文档相矛盾(此行为已得到验证(:

如果存在"零",则该值用于映射参数值零,而不管CLDR规则为数值指定了什么。

来源:OS X v10.9 基金会发行说明

自定义(苹果(CLDR实现:

  • 所有语言都可以使用CLDR中的zero类别,即使没有为此语言定义规则(请参阅此处(
  • 据推测,他们这样做是为了促进否定形式的句子,这是一个常见的用例(这甚至可以在他们的例子中找到(。例如,不要写:

您有0封电子邮件。

你可以写:

您没有电子邮件。

  • 这是一个非常常见的用例,但通常不包括在CLDR类别中,而是通过使用显式值来使用。例如,在ICU MessageFormat中,您可以使用=0而不是zero作为否定形式。
    • 虽然这看起来很方便,但它带来了一个大问题,如果你想使用zero类别对拉脱维亚语使用否定形式怎么办?你根本不能-基本上苹果通过覆盖CLDR违反了语言规则

免费详情:

  • CLDR中只有两种语言的zero不等于0
    • 拉脱维亚语:全球130万人
    • 普鲁士语:18世纪以来的死语
  • iOS和macOS都没有拉脱维亚语言版本,但它们支持区域设置(键盘和日期格式(
  • 这意味着可能很少有应用程序支持拉脱维亚语,除非它们可以手动更改应用程序内部的语言(这是iOS的一种不太常见的情况,通常会遵守设备的设置(

结论

提示#1:如果你需要使用拉脱维亚语,你可能应该避免对否定形式使用zero,而是使用代码,在stringsdict文件之外使用字符串

技巧2:确保您的翻译过程正确支持这种行为!

最新更新