Skip to content

Feature Languages

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

🌍 Языки и определение языка

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

Пять языков в одном пакете: русский, английский, немецкий, французский, испанский. Язык задаётся в конструкторе либо определяется автоматически по каждому слову.

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

Каждый язык — реализация контракта LanguageRulesInterface (число, склонение, спряжение, счётная форма) поверх базового движка AbstractRules: неисчисляемое слово → как есть; нерегулярная пара → по словарю; иначе — первое совпавшее регулярное правило. Автоопределение — каскад признаков: кириллица → русский; уникальная диакритика (ß/ä/ö/ü → немецкий, ñ/¿/á → испанский, ç/œ/à → французский); для чистой латиницы — частотные служебные слова; по умолчанию — английский.

use CloudCastle\Inflector\Inflector;
use CloudCastle\Inflector\Language;

// Авто-режим: язык определяется по каждому слову
$auto = new Inflector();
$auto->pluralize('стол');      // 'столы'   (русский)
$auto->pluralize('category');  // 'categories' (английский)
$auto->singularize('Bücher');  // 'Buch'    (немецкий — по умлауту)

// Фиксированный язык — быстрее (без детекта) и предсказуемее
$ru = new Inflector(Language::Russian);
$auto->detectLanguage('mañana'); // Language::Spanish

Плюсы

  • Один пакет и один API вместо пяти языковых библиотек.
  • Авто-режим удобен для смешанного контента (CMS, каталоги, UGC).
  • Фиксированный язык убирает детект с горячего пути (O(1) выбор правил).
  • Новый язык добавляется реализацией одного интерфейса.

Минусы

  • Детект по одному короткому слову без диакритики (латиница) возвращает английский — для точности задавайте язык явно.
  • Пять языков «из коробки»; другие языки — через собственную реализацию контракта.

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

  • Задавать язык в конструкторе везде, где он известен: new Inflector(Language::Russian).
  • Авто-режим — для потоков смешанного контента, где язык слова неизвестен заранее.

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

  • Детект языка по одиночным аббревиатурам/кодам («SKU», «ID») — латиница без контекста считается английской.
  • Создание нового инфлектора в цикле — кэши живут в экземпляре, переиспользуйте его.

Схема определения языка

flowchart TD
    T["текст"] --> C{"кириллица?"}
    C -->|да| RU[Russian]
    C -->|нет| D{"ß / ä / ö / ü?"}
    D -->|да| DE[German]
    D -->|нет| S{"ñ / ¿ / á / í / ó / ú?"}
    S -->|да| ES[Spanish]
    S -->|нет| F{"ç / œ / à / ê …?"}
    F -->|да| FR[French]
    F -->|нет| W{"стоп-слова?"}
    W -->|большинство голосов| LANG["язык большинства"]
    W -->|нет| EN[English]
Loading

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

Возможность Inflector doctrine symfony morphos intl 🏆 Победитель
Языков поддерживается 5 1 2 2 Inflector
Авто-определение языка Inflector
Контракт для новых языков ⚠️ ⚠️ Inflector

Clone this wiki locally