我开始学习iOS Stringsdict文件,并在一个使用以下语法的项目中发现了一些现有代码:
<key>zero</key>
<string>You no message.</string>
根据CLDR,zero
在英语中是一个无效的复数,我们希望使用显式复数规则(使用ICU MessageFormat时为=0
(
我试图找到如何在iOS Stringsdict文件中使用显式复数规则,但找不到任何方法来实现这一点。有人能确认这是否得到支持吗?
解决方案示例(我不能测试它们,但也许有人可以?(
<key>0</key>
<string>You no message.</string>
或
<key>=0</key>
<string>You no message.</string>
ICU消息格式的CLDR实现的显式多规则部分的额外引用:
https://formatjs.io/guides/message-syntax/#plural-格式化
=值它用于匹配特定的值,而不考虑当前区域设置的多个类别。
如果您只对zero
规则感兴趣,那么它将在任何语言的.stringsdict
文件中处理。
来源:OS X v10.9 基金会发行说明
如果存在"零",则无论CLDR规则为数值指定了什么,该值都将用于映射参数值零。
否则,这些是唯一处理的规则(取决于语言(:zero, one, two, few, many, others
简短回答
.stringsdict
文件无法支持显式多规则(除了下面详细介绍的zero
的自定义Apple实现(
详细答案
正常CLDR实现:
- 所有不在给定语言的CLDR中的规则都将被忽略
- 如果使用规则
zero
,它将使用CLDR值(大多数语言将0
作为zero
的值(。这也包括像拉脱维亚语这样的语言,它们具有映射到zero
的20
、30
等值,并且与苹果自己的文档相矛盾(此行为已得到验证(:
如果存在"零",则该值用于映射参数值零,而不管CLDR规则为数值指定了什么。
来源:OS X v10.9 基金会发行说明
自定义(苹果(CLDR实现:
- 所有语言都可以使用CLDR中的
zero
类别,即使没有为此语言定义规则(请参阅此处( - 据推测,他们这样做是为了促进否定形式的句子,这是一个常见的用例(这甚至可以在他们的例子中找到(。例如,不要写:
您有0封电子邮件。
你可以写:
您没有电子邮件。
- 这是一个非常常见的用例,但通常不包括在CLDR类别中,而是通过使用显式值来使用。例如,在ICU MessageFormat中,您可以使用
=0
而不是zero
作为否定形式。- 虽然这看起来很方便,但它带来了一个大问题,如果你想使用
zero
类别对拉脱维亚语使用否定形式怎么办?你根本不能-基本上苹果通过覆盖CLDR违反了语言规则
- 虽然这看起来很方便,但它带来了一个大问题,如果你想使用
免费详情:
- CLDR中只有两种语言的
zero
不等于0
:- 拉脱维亚语:全球130万人
- 普鲁士语:18世纪以来的死语
- iOS和macOS都没有拉脱维亚语言版本,但它们支持区域设置(键盘和日期格式(
- 这意味着可能很少有应用程序支持拉脱维亚语,除非它们可以手动更改应用程序内部的语言(这是iOS的一种不太常见的情况,通常会遵守设备的设置(
结论
提示#1:如果你需要使用拉脱维亚语,你可能应该避免对否定形式使用zero
,而是使用代码,在stringsdict
文件之外使用字符串
技巧2:确保您的翻译过程正确支持这种行为!