Skip to content

Feature Number

github-actions[bot] edited this page Jul 16, 2026 · 1 revision

🔢 Число существительных и счётная форма

← Возможности · Главная · Сравнение

Образование множественного и единственного числа по правилам каждого языка и согласование слова с числительным (1 товар / 2 товара / 5 товаров).

Принцип работы

Число строится каскадом: неисчисляемые слова (sheep, кофе, Wasser) не меняются; нерегулярные пары берутся из словаря (person → people, человек → люди, Mann → Männer, œil → yeux); остальное — по упорядоченным регулярным правилам с учётом орфографии языка (русские чередования после шипящих, испанское z → ces, французские -eau → -eaux). Счётная форма для русского опирается на падежи: 1 → именительный ед., 2–4 → родительный ед., 5+ и 11–14 → родительный мн.

$ru = new Inflector(Language::Russian);
$ru->pluralize('книга');            // 'книги'  (и после «г»)
$ru->singularize('люди');           // 'человек' (нерегулярное)
$ru->pluralizeByCount('товар', 21); // 'товар'  (21 → им. ед.)
$ru->pluralizeByCount('товар', 22); // 'товара' (22 → род. ед.)
$ru->pluralizeByCount('товар', 25); // 'товаров' (25 → род. мн.)

$es = new Inflector(Language::Spanish);
$es->pluralize('luz');              // 'luces'
$es->pluralize('lunes');            // 'lunes' (не меняется)

// Пользовательские правила (per-язык)
$ru->addIrregular('кот', 'котики')
   ->addUncountable('сакэ')
   ->addPluralRule('/(тест)$/u', '$1ы');

Плюсы

  • Пять языков с нерегулярными парами и неисчисляемыми словами каждого.
  • Счётная форма — готовое решение для интерфейсов («5 товаров», «21 комментарий»).
  • Кастомизация не трогает глобальное состояние — правила живут в экземпляре.
  • Bounded-кэш: повторные вызовы O(1), уникальный поток слов не раздувает память.

Минусы

  • Русская сингуляризация по окончаниям неоднозначна («-ы» может быть от «мама» и «стол») — выбраны частотные правила, остальное решается addIrregular.
  • Полного словаря нет: редкие исключения требуют явной регистрации.

✅ Рекомендуется

  • Счётчики в UI: pluralizeByCount($noun, $count) вместо ручных if.
  • Регистрация доменных слов проекта одним местом инициализации инфлектора.

❌ Антипаттерны

  • Конкатенация «5 » . pluralize(...) для русского — используйте pluralizeByCount (форма зависит от числа, а не просто «множественное»).

Схема каскада числа

flowchart TD
    W["слово"] --> U{"неисчисляемое?"}
    U -->|да| AS["как есть"]
    U -->|нет| I{"нерегулярная пара?"}
    I -->|да| MAP["по словарю + регистр"]
    I -->|нет| R{"первое совпавшее правило"}
    R -->|есть| RE["regex-замена"]
    R -->|нет| AS2["как есть (fail-safe)"]
Loading

Сравнение с аналогами

Возможность Inflector doctrine symfony morphos intl 🏆 Победитель
pluralize / singularize Паритет
Счётная форма (1/2/5) Inflector, morphos
Пользовательские правила ⚠️ Inflector
Скорость RU-плюрализации ⚠️ (~170× медленнее) Inflector

Clone this wiki locally