Точные совпадения через =

В системе сообщений ICU MessageFormat, которую использует FormatJS, механизм выбора вариантов не ограничивается диапазонами (one, few, other) или условными селекторами (select). Одним из наиболее строгих и при этом часто недооценённых инструментов являются точные совпадения через оператор =.

Они позволяют привязывать конкретное значение переменной напрямую к строке перевода, минуя любые правила множественных форм или классификации.


Синтаксическая основа точных совпадений

Формат ICU MessageFormat допускает использование конструкции:

{variable, plural,
  =0 {...}
  =1 {...}
  other {...}
}

или в более общем виде:

{variable, select,
  =value {...}
  other {...}
}

Ключевой элемент — запись =n, где n представляет конкретное числовое значение.

Это не диапазон, не категория и не правило языка. Это строгое сравнение.


Механика работы =n в plural-правилах

При использовании plural система обычно опирается на CLDR-правила языка, которые определяют формы вроде one, few, many, other.

Однако =n имеет приоритет выше любых категорий.

Пример:

{count, plural,
  =0 {Нет элементов}
  =1 {Один элемент}
  one {# элемент}
  other {# элементов}
}

Если count === 1, будет выбрано именно =1 {Один элемент}, а не one.

Это критично для случаев, где бизнес-логика требует полного контроля над отдельными значениями.


Приоритетность правил выбора

Система выбора в ICU MessageFormat работает по строгой иерархии:

  1. Точное совпадение =n
  2. Языковые категории (one, few, many, other)
  3. other как универсальный fallback

Таким образом, даже если языковая модель предлагает альтернативу, точное совпадение всегда выигрывает.


Практическое применение в plural-формах

Случай с нулевым значением

{messages, plural,
  =0 {Нет новых сообщений}
  =1 {Одно новое сообщение}
  =2 {Два сообщения}
  few {Несколько сообщений}
  other {# сообщений}
}

Здесь явно задаются отдельные строки для 0, 1 и 2, несмотря на то что язык может уже иметь свои правила для этих значений.


Использование в select-конструкциях

Оператор = работает не только с числовыми plural-формами, но и в select, где сравниваются строки.

Пример:

{status, select,
  =draft {Черновик}
  =published {Опубликовано}
  =archived {Архивировано}
  other {Неизвестный статус}
}

Здесь status сравнивается буквально, без преобразований и без языковой логики.


Отличие от обычного select без =

Без точного совпадения запись выглядела бы так:

{status, select,
  draft {Черновик}
  published {Опубликовано}
  archived {Архивировано}
  other {Неизвестный статус}
}

Однако добавление = усиливает семантику: значение воспринимается как строгое равенство, а не как ключ категории.

В большинстве реализаций ICU это избыточно для строковых ключей, но полезно для унификации стиля и предотвращения неоднозначности при динамической генерации шаблонов.


Числовые крайние случаи и защита логики

Точные совпадения часто применяются для защиты от неожиданных значений.

Пример:

{count, plural,
  =0 {Пусто}
  =100 {Ровно сто элементов}
  other {# элементов}
}

Даже если языковая система считает 100 обычным other, разработчик может выделить его отдельно.


Поведение при отсутствии совпадения

Если ни одно =n не совпало, система продолжает стандартный путь:

  • проверка категорий plural/select
  • fallback на other

Это делает использование = безопасным: отсутствие совпадения не ломает шаблон, а лишь переключает на стандартное поведение.


Взаимодействие с форматированием и вложенными выражениями

Точные совпадения можно комбинировать с интерполяцией:

{count, plural,
  =0 {Нет элементов}
  =1 {Один элемент}
  =2 {Два элемента}
  other {Всего {count} элементов}
}

Здесь важно, что внутри блоков =n допустимы любые вложенные выражения ICU, включая форматирование чисел, дат и других параметров.


Типичные ошибки при использовании =

1. Перекрытие логики категорий

{count, plural,
  =1 {Один}
  one {Один (по правилам языка)}
}

Вторая ветка фактически становится недостижимой при count === 1.


2. Чрезмерное дробление условий

=1, =2, =3, =4, =5 ...

Такой подход превращает plural-логику в ручной switch-case, нарушая идею ICU и усложняя поддержку.


3. Использование = без необходимости

Во многих случаях достаточно категорий one/few/many. = оправдан только при необходимости строгого контроля отдельных значений.


Семантическая роль точных совпадений

Конструкция =n фактически вводит уровень детерминированной логики в декларативную систему форматирования.

Она переводит часть ответственности с языковых правил на бизнес-логику, позволяя:

  • фиксировать исключения
  • выделять критические значения
  • обходить ограничения CLDR

Применение в локализационных системах

В связке с FormatJS точные совпадения особенно полезны в интерфейсах, где важны:

  • статусы с фиксированными кодами
  • административные состояния
  • системные уведомления
  • числовые пороговые значения

Поведение при динамических значениях

Если значение переменной вычисляется во время выполнения:

const count = getCount();

то ICU сравнивает его строго:

  • count === 0=0
  • count === 1=1
  • иначе → other или категория plural

Важно учитывать типизацию: строка "1" не всегда равна числу 1 в зависимости от реализации парсинга.


Совместимость с интернационализацией

Хотя = даёт полный контроль, он может снижать переносимость переводов:

  • переводчик не меняет логику =n
  • добавление новых языков не влияет на эти ветки
  • структура сообщений становится более фиксированной

Поэтому такие конструкции обычно используются точечно, а не повсеместно.


Архитектурная роль в шаблонах сообщений

В крупных приложениях ICU-шаблоны часто делятся на уровни:

  • базовые категории (one, other)
  • расширенные языковые правила
  • точечные исключения через =n

=n занимает верхний слой этой иерархии, задавая жёсткие поведенческие якоря внутри гибкой системы локализации.