Использование выбора с форматом сообщения

Я использую 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" ))
Другие вопросы по тегам