2012-07-27 65 views
1

我在PHP中使用MessageFormatintl擴展的一部分)。該擴展使用ICU 4.6.1。使用select with messageformat

但是,問題不在於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}} 

回答

1

我最終升級到intl最新版本和ICU 49.1.2。

然而,這項工作完成,這是行不通的:

{0}{0, plural, one{a} other{b}} 

但是這工作:

{0, plural, =0{a} one{# b} other {# c}} 
+0

這是正確的做法 – 2012-07-28 04:52:32

+0

雖然這聽起來像濫用複數。翻譯者不會想知道地球上究竟發生了什麼嗎? – Trejkaz 2014-07-15 04:18:16

0

select參數類型是一種精確的字符串匹配。你需要確保你傳遞了一個字符串參數值,然後有匹配的子句。避免使用複數來進行準確的大小寫匹配,因爲每個語言環境對於one的含義都有其自己的規則。

以下應該給你你想要的,但我比PHP實現知道更多的格式。

MessageFormatter::formatMessage($locale, 
    '{0, select, _0 {a} _1 {b} other {c}}', 
    array("_$value"))