使用select with messageformat

时间:2012-07-27 09:11:53

标签: internationalization icu messageformat

我在PHP中使用MessageFormatintl扩展名的一部分)。扩展使用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}}

2 个答案:

答案 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" ))