使用 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
的值)。这还包括像拉脱维亚语这样的语言,它们将 20
、30
等值映射到 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
:
- Latvian: 1.3 million speakers 全球
- Prussian: dead language since the 18th century
- iOS 和 macOS 都没有拉脱维亚语版本,但它们支持区域设置(键盘和日期格式)
- 这意味着可能很少有应用程序支持拉脱维亚语,除非它们有手动方式来更改应用程序本身的语言(对于 iOS 这通常是尊重设备的设置)
结论
提示 #1:如果您需要使用拉脱维亚语,您应该避免使用 zero
作为否定形式,而是使用代码,使用 stringsdict
文件之外的字符串
提示 #2:确保您的翻译过程正确支持此行为!
我开始学习 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
的值)。这还包括像拉脱维亚语这样的语言,它们将20
、30
等值映射到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
:- Latvian: 1.3 million speakers 全球
- Prussian: dead language since the 18th century
- iOS 和 macOS 都没有拉脱维亚语版本,但它们支持区域设置(键盘和日期格式)
- 这意味着可能很少有应用程序支持拉脱维亚语,除非它们有手动方式来更改应用程序本身的语言(对于 iOS 这通常是尊重设备的设置)
结论
提示 #1:如果您需要使用拉脱维亚语,您应该避免使用 zero
作为否定形式,而是使用代码,使用 stringsdict
文件之外的字符串
提示 #2:确保您的翻译过程正确支持此行为!