1

我在 PHP 中使用MessageFormatintl扩展的一部分)。该扩展使用 ICU 4.6.1。

但是,问题不在于 PHP。

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

  • 什么时候,文本应该{0}0a
  • 如果是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 和intl3.0.0a2。我现在可以使用=0,=1等,但这已停止工作(以前工作过):

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

这在哪里起作用:

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

2 回答 2

2

我最终升级到最新版本的intlICU 49.1.2。

但是,一旦完成,这将不起作用:

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

但这有效:

{0, plural, =0{a} one{# b} other {# c}}
于 2012-07-27T12:29:55.443 回答
1

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

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

MessageFormatter::formatMessage($locale,
  '{0, select, _0 {a} _1 {b} other {c}}',
  array( "_$value" ))
于 2015-03-26T21:19:31.677 回答