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: 28

Dependents: 1

Suggesters: 0

Stars: 0

Open Issues: 1

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

This package is auto-updated.

Last update: 2026-07-15 23:09:17 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 wapmorgan/morphos ext-intl (ICU)
EN плюрализация (category → categories) 14958288 ops/s 12127523 ops/s 313425 ops/s
RU плюрализация (стол → столы) 15445789 ops/s 90813 ops/s
RU родительный падеж (стол → стола) 1099396 ops/s 92191 ops/s
RU счётная форма (5 → товаров) 875702 ops/s 83637 ops/s
FR плюрализация (journal → journaux) 14868146 ops/s 839062 ops/s
Имя таблицы (FooBar → foo_bars) 14926349 ops/s 2715111 ops/s
Имя класса (foo_bars → FooBar) 15152832 ops/s 5347831 ops/s
Транслитерация RU → латиница 2318063 ops/s 8571 ops/s
Определение языка (кириллица) 5467384 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