5

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

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

根据 CLDR,zero在英语中是无效的复数​​,我们希望使用明确的复数规则(=0使用 ICU MessageFormat 时)

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


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

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

或者

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

关于 ICU MessageFormat 的 CLDR 实现的显式复数规则部分的额外参考:

https://formatjs.io/guides/message-syntax/#plural-format

=value 这用于匹配特定值,而不考虑当前语言环境的多个类别。

4

2 回答 2

3

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

来源:OS X v10.9 的 Foundation 发行说明

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

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

于 2020-04-23T21:06:40.220 回答
2

简答

.stringsdict文件无法支持明确的复数规则(除了zero下面详述的自定义 Apple 实现)

详细解答

正常的 CLDR 实现:

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

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

来源:OS X v10.9 的 Foundation 发行说明

自定义(Apple)CLDR 实施:

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

您有 0 封电子邮件。

你可以写:

您没有电子邮件。

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

免费详情:

  • CLDR 中只有两种语言zero不等于0
  • iOS 和 macOS 均不支持拉脱维亚语,但它们支持区域设置(键盘和日期格式)
  • 这意味着可能很少有应用程序会支持拉脱维亚语,除非他们有手动方式来更改应用程序本身的语言(这对于通常尊重设备设置的 iOS 来说是一种不太常见的情况)

结论

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

提示 #2:确保您的翻译过程正确支持此行为!

于 2020-04-25T13:55:47.990 回答