【发布时间】: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