Использование select с messageformat
-
12-12-2019 - |
Вопрос
Я использую Формат сообщения (часть intl
расширение) в PHP.Расширение использует ICU 4.6.1.
Однако проблема не в PHP.
Я хотел бы отформатировать фрагмент строки, приняв решение по первому токену {0}
:
- Когда
{0}
является0
, текст должен бытьa
- Когда это произойдет
1
, текст должен бытьb
- Во всех остальных случаях текст должен быть следующим
c
Я понимаю, что это можно было бы сделать с помощью plural
, =0
для 0
case, но, судя по моему тестированию, это, похоже, не работает, скорее всего, потому, что смещения и пользовательские множественное число были введены в версии 4.8.
Таким образом, я пытаюсь добиться этого, используя select
:
{0, select, 0 {a} other {{0,plural,one{b}other{c}}}}
Однако по какой-то причине программа форматирования сообщений не смогла отформатировать вышеуказанное и возвращает false
(не удалось отформатировать).
Почему это так происходит?Есть ли проблема с моим синтаксисом?
Быстрое обновление:После некоторого копания кажется, что я не могу использовать select для сопоставления значений, начинающихся с числа.Есть ли какие-нибудь способы обойти это?
Еще одно обновление:Обновлено до версии 49.1.2 отделения интенсивной терапии и intl
3.0.0a2.Теперь я могу использовать =0
, =1
, и т.д., но это перестало работать (работало ранее):
{0}{0, plural, one{a} other{b}}
где как это работает:
{0, plural, one{a} other{b}}
Решение
В итоге я обновился до последней версии intl
и ОИТ 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" ))