【问题标题】:Explicit Plural string using iOS Stringsdict files使用 iOS Stringsdict 文件的显式复数字符串
【发布时间】:2020-08-07 04:06:36
【问题描述】:

我开始学习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

=值 这用于匹配特定值,而与当前语言环境的复数类别无关。

【问题讨论】:

  • 你能解释一下这个问题中“无效的复数​​”是什么意思吗?这是我不熟悉的技术术语吗? (我同意零在英语中肯定是复数,而且这个字符串文件不正确。我只是想理解你在这里所说的“无效”是什么意思。)我不清楚这与 MessageFormat 有何关系。 ICU 将零归为英语中的“其他”(因此是复数):unicode-org.github.io/cldr-staging/charts/37/supplemental/…(这是一个非常有趣的问题;我只是想更好地理解它。你能链接你引用的 CLDR 的部分吗?)
  • 是的,CLDR 中的英语规则(您提供的相同链接)仅支持one 和other。从我的角度来看,Stringsdict 文件只是 Apple 的自定义实现,就复数规则而言是 ICU MessageFormat。在 MessageFormat 中,有一种方法可以用硬数字显式覆盖类别以提高流畅度(问题中的示例)。在此处查看另一个示例:formatjs.io/guides/message-syntax/#plural-format。我找不到它是否也支持像官方语法这样的显式复数规则,或者它是否只支持 CLDR 中定义的规则。
  • "Stringsdict 文件只是 Apple 的自定义实现,在复数规则方面是 ICU MessageFormat。"你为什么相信?我会说 Stringsdict 是 Apple 实现的翻译系统,MessageFormat 也是。这并不意味着它们具有相同的功能甚至目标。您在使用 Stringsdict 解决问题时遇到了哪些字符串翻译问题?
  • 在我看来,ICU MessageFormat 是 CLDR 的标准实现(它们都是 Unicode 标准)。如果 Apple 决定使用 CLDR 复数规则,我认为它们还将包含明确的复数规则以使复数语法更加流畅。但是,当然,我无法在任何地方确认这一点,这导致我认为他们的实施不支持这一点,
  • 我同意它几乎肯定不受支持。我想不出任何理由相信 Apple 基于 Unicode 标准的这种格式。几十年来,Apple 一直在进行与 ICU 无关的本地化(ICU 是为 C++ 和 Java 设计的)。您在 iOS 上是否遇到了特定的翻译问题?我确信我们可以帮助您解决这个问题。

标签: ios localization internationalization messageformat cldr


【解决方案1】:

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

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

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

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

【讨论】:

  • 哇,Apple 为什么要这样做?他们在 CLDR 之上构建了自己的逻辑?我们知道它们如何支持拉脱维亚语 (unicode-org.github.io/cldr-staging/charts/37/supplemental/…) 或普鲁士语 (unicode-org.github.io/cldr-staging/charts/37/supplemental/…) 中的复数,其中零可以有多个值吗?
  • @NicolasBouvrette 在这些语言中 zero 将匹配 CLDR 规则。这是英语,其中zero 是额外的。
  • 如何确认? iOS 和 macOS 均不支持拉脱维亚语,因此我怀疑这可能是他们实施您在文档中找到的 zero == 0 规则的原因。它确实说“无论 CLDR 规则指定什么”
  • 该文档行不准确。可以通过将AppleLanguages 设置为lv_LV 来启动应用程序来检查实际行为。
  • 所以你是说你测试了它并且它适用于拉脱维亚?
【解决方案2】:

简答

.stringsdict 文件无法支持显式复数规则(除了 Apple 对 zero 的自定义实现,详情如下)

详细解答

正常的 CLDR 实现:

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

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

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

自定义(Apple)CLDR 实施:

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

您有 0 封电子邮件。

你可以写:

您没有电子邮件。

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

免费详情:

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

结论

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

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

【讨论】:

  • 只是为了澄清对拉脱维亚语的支持:用户可以选择拉脱维亚语作为他们在 iOS 和 macOS 中的首选语言,虽然系统 UI 不会本地化为拉脱维亚语,但任何包含拉脱维亚语本地化的应用程序都可以使用它而无需包括手动更改应用程序语言的方法(这种方法在两个平台上的应用程序中都不常见)。我假设在拉脱维亚销售的设备会将拉脱维亚语指定为开箱即用的默认语言。但是,我也假设说拉脱维亚语的人通常以拉脱维亚语以外的语言使用他们的大部分软件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-23
  • 2014-11-16
  • 2014-09-05
  • 2014-05-20
  • 2011-04-12
  • 2015-02-15
相关资源
最近更新 更多