使用带有消息格式的 select
-
12-12-2019 - |
题
我在用 消息格式 (的一部分 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" ))
不隶属于 StackOverflow