我在PHP中使用MessageFormat(intl
扩展名的一部分)。扩展使用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}}
答案 0 :(得分:1)
我最终升级到最新版本的intl
和ICU 49.1.2。
然而,一旦完成,这将无效:
{0}{0, plural, one{a} other{b}}
但这有效:
{0, plural, =0{a} one{# b} other {# c}}
答案 1 :(得分:0)
select
参数类型是精确的字符串匹配。您需要确保传递字符串参数值,然后使用匹配的子句。避免使用复数来进行精确的大小写匹配,因为每个语言环境都有自己的one
含义规则。
以下应该为您提供您想要的内容,但我对PHP格式的了解要多得多。
MessageFormatter::formatMessage($locale,
'{0, select, _0 {a} _1 {b} other {c}}',
array( "_$value" ))