Internationalization 将select与messageformat一起使用

Internationalization 将select与messageformat一起使用,internationalization,icu,messageformat,Internationalization,Icu,Messageformat,我在PHP中使用(intl扩展的一部分)。扩展使用ICU4.6.1 然而,问题不在于PHP 我想通过决定第一个标记{0}来格式化一段字符串: 当{0}为0时,文本应为a 当它是1时,文本应该是b 对于所有其他情况,文本应为c 我知道这可以通过复数,=0来实现,但是通过我的测试,它似乎不起作用,很可能是因为4.8中引入了偏移量和自定义复数 因此,我尝试使用选择: {0, select, 0 {a} other {{0,plural,one{b}other{c}}}} 但是,由于某种原因,消息

我在PHP中使用(
intl
扩展的一部分)。扩展使用ICU4.6.1

然而,问题不在于PHP

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

  • {0}
    0
    时,文本应为
    a
  • 当它是
    1
    时,文本应该是
    b
  • 对于所有其他情况,文本应为
    c
我知道这可以通过
复数
=0
来实现,但是通过我的测试,它似乎不起作用,很可能是因为4.8中引入了偏移量和自定义复数

因此,我尝试使用
选择

{0, select, 0 {a} other {{0,plural,one{b}other{c}}}}
但是,由于某种原因,消息格式化程序无法格式化上述内容,并返回
false
(无法格式化)

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


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

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

如果这样做有效:

{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" ))

这闻起来像是滥用复数。译者难道不想知道到底发生了什么事吗?
MessageFormatter::formatMessage($locale,
  '{0, select, _0 {a} _1 {b} other {c}}',
  array( "_$value" ))