Использование выбора с форматом сообщения
Я использую MessageFormat (часть 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}}
2 ответа
Я закончил обновление до последней версии 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" ))