我在用 消息格式 (的一部分 intl PHP 中的扩展名)。该扩展使用 ICU 4.6.1。

然而,问题不在于 PHP。

我想通过对第一个标记做出决定来格式化一段字符串 {0}:

  • 什么时候 {0}0, ,文本应该是 a
  • 几时 1, ,文本应该是 b
  • 对于所有其他情况,文本应为 c

我知道这可以通过 plural, =0 为了 0 情况,但通过我的测试,它似乎不起作用,很可能是因为 4.8 中引入了偏移量和自定义复数。

因此,我试图使用来实现这一点 select:

{0, select, 0 {a} other {{0,plural,one{b}other{c}}}}

然而,由于某种原因,消息格式化程序无法格式化上述内容并返回 false (无法格式化)。

为什么会这样呢?我的语法有问题吗?


快速更新:经过一番挖掘,我似乎无法使用 select 来匹配以数字开头的值。有什么办法可以解决这个问题吗?

另一个更新:更新至 ICU 49.1.2 和 intl 3.0.0a2。我现在可以使用 =0, =1, 等等,但这已经停止工作(以前工作过):

{0}{0, plural, one{a} other{b}}

这是在哪里工作的:

{0, plural, one{a} other{b}}
有帮助吗?

解决方案

我最终升级到了最新版本 intl 和 ICU 49.1.2。

然而,一旦完成,这将不起作用:

{0}{0, plural, one{a} other{b}}

但这有效:

{0, plural, =0{a} one{# b} other {# c}}

其他提示

select 参数类型是精确的字符串匹配。您需要确保传递字符串参数值,然后有匹配的子句。避免使用复数来精确匹配大小写,因为每个语言环境都有自己的规则 one 方法。

下列 应该 给你你想要的,但我对格式的了解比对 PHP 实现的了解要多得多。

MessageFormatter::formatMessage($locale,
  '{0, select, _0 {a} _1 {b} other {c}}',
  array( "_$value" ))
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top