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

Nic*_*tte 5 localization internationalization messageformat ios cldr

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

<key>zero</key>
<string>You no message.</string>
Run Code Online (Sandbox Code Playgroud)

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

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


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

<key>0</key>
<string>You no message.</string>
Run Code Online (Sandbox Code Playgroud)

或者

<key>=0</key>
<string>You no message.</string>
Run Code Online (Sandbox Code Playgroud)

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

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

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

Nic*_*tte 2

简答

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

详细解答

正常的 CLDR 实现:

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

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

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

自定义(Apple)CLDR 实现:

您有 0 封电子邮件。

你可以写:

您没有电子邮件。

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

免费详情:

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

结论

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

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