-
-
Notifications
You must be signed in to change notification settings - Fork 0
Feature Number
Образование множественного и единственного числа по правилам каждого языка и согласование слова с числительным (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)"]
| Возможность | Inflector | doctrine | symfony | morphos | intl | 🏆 Победитель |
|---|---|---|---|---|---|---|
| pluralize / singularize | ✅ | ✅ | ✅ | ✅ | ❌ | Паритет |
| Счётная форма (1/2/5) | ✅ | ❌ | ❌ | ✅ | ❌ | Inflector, morphos |
| Пользовательские правила | ✅ | ❌ | ❌ | ❌ | Inflector | |
| Скорость RU-плюрализации | ✅ | — | — | — | Inflector |
CloudCastle Inflector · · PHP 8.1+
GitHub · Packagist · Releases · Discussions
Email · Telegram · VK · Сетка · 💜 Поддержать проект
Исходники Wiki — каталог wiki/ в репозитории (синхронизация через GitHub Actions)