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

Explicit Plural string using iOS Stringsdict files

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

<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 This is used to match a specific value regardless of the plural categories of the current locale.

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

来源:Foundation Release Notes for OS X v10.9

If "zero" is present, the value is used for mapping the argument value zero regardless of what CLDR rule specifies for the numeric value.

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

简答

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

详细解答

正常的 CLDR 实现:

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

If "zero" is present, the value is used for mapping the argument value zero regardless of what CLDR rule specifies for the numeric value.

来源:Foundation Release Notes for OS X v10.9

自定义 (Apple) CLDR 实现:

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

You have 0 emails.

你可以这样写:

You have no emails.

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

补充资料:

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

结论

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

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