Internationalization 将select与messageformat一起使用
我在PHP中使用(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}}}} 但是,由于某种原因,消息
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" ))