cloudcastle/inflector

Production-ready PHP 8.1+ package (CloudCastle Inflector).

Maintainers

Package info

github.com/cloudcastle-apps/inflector

Homepage

Documentation

pkg:composer/cloudcastle/inflector

Transparency log

Statistics

Installs: 103

Dependents: 1

Suggesters: 0

Stars: 1

Open Issues: 3

v1.0.0 2026-07-15 23:04 UTC

README

Version PHP Version License Total Downloads Monthly Downloads Packagist Stars Dependents Suggesters Security Advisories

Quality CodeQL GitHub Stars GitHub Forks GitHub Issues Latest Release Last Commit Contributors

Coverage Mutation MSI OpenSSF Scorecard

PHPStan Psalm Code Style

Мультиязычный инфлектор для PHP 8.1+ без зависимостей: пять языков (русский, английский, немецкий, французский, испанский), склонение по падежам и числам, спряжение глаголов по временам, счётная форма, транслитерация кириллица ↔ латиница и автоматическое определение языка.

Установка

composer require cloudcastle/inflector

Требуется PHP 8.1+. Runtime-зависимостей нет (zero-dependency).

Быстрый старт

<?php

use CloudCastle\Inflector\Inflector;
use CloudCastle\Inflector\Language;
use CloudCastle\Inflector\GrammaticalCase;
use CloudCastle\Inflector\GrammaticalNumber;
use CloudCastle\Inflector\Tense;
use CloudCastle\Inflector\Person;

// Авто-определение языка по каждому слову (язык не задан)
$inflector = new Inflector();
$inflector->pluralize('стол');       // 'столы'
$inflector->pluralize('category');   // 'categories'
$inflector->singularize('châteaux'); // 'château'

// Фиксированный язык (быстрее: без детекта)
$ru = new Inflector(Language::Russian);

// Склонение по падежам и числам
$ru->decline('стол', GrammaticalCase::Genitive);                            // 'стола'
$ru->decline('стол', GrammaticalCase::Dative, GrammaticalNumber::Plural);   // 'столам'

// Счётная форма: 1 товар / 2 товара / 5 товаров
$ru->pluralizeByCount('товар', 1);   // 'товар'
$ru->pluralizeByCount('товар', 2);   // 'товара'
$ru->pluralizeByCount('товар', 5);   // 'товаров'

// Спряжение по временам, лицам и числам
$ru->conjugate('работать', Tense::Past);                  // 'работал'
$ru->conjugate('работать', Tense::Present, Person::First); // 'работаю'
$ru->conjugate('работать', Tense::Future);                // 'будет работать'

// Транслитерация и слаги
$inflector->toLatin('щука');            // 'shchuka'
$inflector->toCyrillic('privet');       // 'привет'
$inflector->transliterate('привет');    // 'privet' (направление — автоматически)
$inflector->slugify('Привет мир');      // 'privet-mir'

// Определение языка
$inflector->detectLanguage('mañana');   // Language::Spanish

// Форматы имён для ORM/API
$inflector->tableize('UserAccount');    // 'user_accounts'
$inflector->classify('user_accounts'); // 'UserAccount'
$inflector->camelize('foo_bar');        // 'fooBar'

Возможности

  • Пять языков — русский, английский, немецкий, французский, испанский; единый API и контракт правил (LanguageRulesInterface) для добавления новых языков.
  • Число существительныхpluralize/singularize с нерегулярными парами и неисчисляемыми словами каждого языка; счётная форма pluralizeByCount (1 товар / 2 товара / 5 товаров).
  • Склонение — 6 русских падежей в обоих числах (регулярные парадигмы 1/2/3 склонения и среднего рода), немецкие Genitiv и Dativ Plural.
  • Спряжение — прошедшее, настоящее и будущее время по лицам и числам: регулярные парадигмы всех пяти языков + частотные нерегулярные английские глаголы.
  • Транслитерация — кириллица → латиница и латиница → кириллица (практическая схема, многобуквенные сочетания shch/zh/yo), автонаправление по алфавиту.
  • Определение языка — по алфавиту, диакритике (ß/ü, ñ, ç/œ) и частотным служебным словам; опция конструктора: авто-режим или фиксированный язык.
  • Форматы имёнcamelize/pascalize/underscore/tableize/classify/ dasherize/titleize/humanize, слаги с транслитерацией, порядковые числительные по правилам языка (1-й, 1st, 1., 1er, 1.º).
  • Расширяемость — пользовательские нерегулярные пары, неисчисляемые слова и regex-правила per-язык.
  • Производительность — ограниченные (bounded) кэши всех горячих путей: O(1) на повторяющемся вводе без неограниченного роста памяти.

Функционально пакет покрывает возможности сравниваемых аналогов вместе взятых: doctrine/inflector, symfony/string (инфлекторы), wapmorgan/morphos, ext-intl.

Возможности против аналогов

Сводная таблица (генерируется автоматически из tools/features-data.php; значения выверены по коду и документации аналогов). Легенда: ✅ полностью · ⚠️ частично · 🔌 адаптер · ❌ нет · — неприменимо.

Сгенерировано из tools/features-data.php (факты о поддержке). Легенда: ✅ полностью · ⚠️ частично · 🔌 адаптер · ❌ нет · — неприменимо.

Языки

Функция Inflector doctrine symfony morphos intl 🏆 Победитель
Английский ⚠️ Паритет
Русский Inflector, morphos
Немецкий Inflector
Французский Inflector, symfony
Испанский Inflector
Авто-определение языка Inflector

Число существительных

Функция Inflector doctrine symfony morphos intl 🏆 Победитель
pluralize / singularize Паритет
Счётная форма (1 товар / 2 товара / 5 товаров) Inflector, morphos
Нерегулярные и неисчисляемые слова ⚠️ Паритет

Склонение и спряжение

Функция Inflector doctrine symfony morphos intl 🏆 Победитель
6 русских падежей (ед. и мн. число) Inflector, morphos
Немецкие падежи (Genitiv, Dativ Pl.) Inflector
Спряжение глаголов (3 времени × лица × числа) ⚠️ Inflector
Спряжение на 5 языках Inflector

Транслитерация

Функция Inflector doctrine symfony morphos intl 🏆 Победитель
Кириллица → латиница ⚠️ Паритет
Латиница → кириллица Inflector, intl
Автонаправление по алфавиту Inflector
Без расширений PHP (zero-dependency) ⚠️ Inflector, doctrine, morphos

Форматы имён (ORM/API)

Функция Inflector doctrine symfony morphos intl 🏆 Победитель
camelize / pascalize / underscore 🔌 Inflector, doctrine
tableize / classify Inflector, doctrine
Слаги с транслитерацией кириллицы ⚠️ 🔌 Inflector
Порядковые числительные по языкам ⚠️ 🔌 Inflector

Расширяемость

Функция Inflector doctrine symfony morphos intl 🏆 Победитель
Пользовательские нерегулярные пары ⚠️ Inflector
Пользовательские regex-правила ⚠️ Inflector
Единый интерфейс правил для новых языков ⚠️ ⚠️ Inflector

Производительность и нагрузка

Функция Inflector doctrine symfony morphos intl 🏆 Победитель
Ограниченный кэш (нет утечки на уникальном вводе) Inflector
O(1) на повторяющемся вводе Inflector, doctrine
Стабильная память при 100k+ уникальных слов Inflector, symfony, morphos

Безопасность и качество

Функция Inflector doctrine symfony morphos intl 🏆 Победитель
Fail-safe: неизвестный ввод не бросает исключений ⚠️ ⚠️ Паритет
Ввод — данные, не код (без eval/интерполяции) Паритет
Мутационное тестирование MSI 100% Inflector
Fuzzing-инфраструктура (ClusterFuzzLite) Inflector

Производительность

Изолированные замеры без Xdebug (composer compare), эквивалентные операции. Метрика — ops/sec (больше — лучше); «—» — операция не поддерживается.

Сгенерировано из composer compare (PHP 8.1.34). Правки в блоке будут перезаписаны.

Сценарий cloudcastle/inflector doctrine/inflector symfony/string icanboogie/inflector wapmorgan/morphos ext-intl (ICU)
EN плюрализация (category → categories) 15514348 ops/s 12383537 ops/s 317435 ops/s 237035 ops/s
RU плюрализация (стол → столы) 13467022 ops/s 88530 ops/s
RU родительный падеж (стол → стола) 1127713 ops/s 91358 ops/s
RU счётная форма (5 → товаров) 914120 ops/s 82788 ops/s
FR плюрализация (journal → journaux) 15662076 ops/s 833858 ops/s 548021 ops/s
Имя таблицы (FooBar → foo_bars) 15302094 ops/s 2663811 ops/s 144376 ops/s
Имя класса (foo_bars → FooBar) 15397592 ops/s 5379037 ops/s 115743 ops/s
Транслитерация RU → латиница 2353772 ops/s 8396 ops/s
Определение языка (кириллица) 5177514 ops/s

Полное сравнение по каждой возможности — в Wiki: Сравнение.

Заключение: когда что выбирать

Сильные стороны cloudcastle/inflector — единственный PHP-пакет, объединяющий инфлексию пяти языков, склонение по падежам, спряжение по временам, счётную форму, транслитерацию и автоопределение языка — при нуле runtime-зависимостей. Все горячие пути работают с ограниченной памятью (bounded-кэши со сбросом), любой «грязный» ввод обрабатывается fail-safe (данные, не код), мутационное покрытие — Infection MSI 100 %.

Производительность: победитель во всех девяти сценариях сравнения — от английской плюрализации (быстрее doctrine/inflector в ~1.2×) до русской морфологии (быстрее wapmorgan/morphos в ~10–170×) и транслитерации (быстрее ext-intl ICU в ~270×). Замеры изолированные, без Xdebug (composer compare).

Слабые стороны — морфология построена на регулярных парадигмах без полного словаря: одушевлённость русских существительных не определяется (винительный падеж неодушевлённый), слова на «-ь» склоняются по женскому 3-му склонению, нерегулярные глаголы (кроме частотных английских) спрягаются только по регулярным схемам. Для задач, где нужна словарная точность каждой формы, используйте морфологический анализатор с полным словарём.

Честные рекомендации:

  • Мультиязычное приложение (интерфейсы, счётчики, URL, ORM) — cloudcastle/inflector.
  • Только английская инфлексия в Doctrine-проектеdoctrine/inflector уже в зависимостях ORM.
  • Только английское/французское число в Symfonysymfony/string уже в фреймворке.
  • Русская морфология со словарной точностью (имена, отчества, географические названия) — wapmorgan/morphos.
  • Транслитерация экзотических письменностей (не кириллица) — ext-intl (ICU).

Документация

Качество

Пакет придерживается production-стандартов: строгая типизация, полный статический анализ (PHPStan max, Psalm level 1, PHPMD, Deptrac, Rector), покрытие тестами 100 % на каждый файл и мутационное тестирование (Infection MSI 100 %). Матрица CI — PHP 8.1–8.5.

composer ci        # полный пайплайн качества
composer check     # быстрые проверки перед коммитом
composer test      # тесты (unit + integration + security + load + performance)
composer compare   # сравнение производительности с аналогами

Контакты

Поддержать проект

Реквизиты для поддержки автора — в DONATE.md.

Contributors

Спасибо всем, кто вносит вклад в проект:

Список ведётся по спецификации all-contributors.

Лицензия

MIT © CloudCastle