Skip to the content.

Русский язык

Склонение частей речи:

Трансформация в текст:

Дополнительно:

Internals:

Краткий обзор

Для русского языка доступны следующие классы и функции из пространства имён morphos\Russian\:

Классы:

Функции:

Склонение частей речи

Имена собственные

Чтобы просклонять все части имени можно использовать следующую функцию:

Аргументы:

Важно отметить, что определение пола по отчеству и фамилии почти всегда даёт правильный результат, но определение только лишь по имени может дать неверный результат, особенно если имя не русское. Так что если вы хотите просклонять только имя, то лучше будет указать пол при склонении.

Пример.

use function morphos\Russian\inflectName;

inflectName('Базанов Иосиф Валерьянович', 'родительный') => 'Базанова Иосифа Валерьяновича'
inflectName('Базанов Иосиф', 'дательный') => 'Базанову Иосифу'
inflectName('Иосиф', 'творительный') => 'Иосифом'

Чтобы получить сразу все склонения для имени, используйте другую функцию (либо вызов API без указания case):

array getNameCases($fullname, $gender = null)

Аргументы:

Возвращает массив, где ключи - константы класса Cases, а значения - имя в определенном падеже.

Пример.

use function morphos\Russian\getNameCases;

getNameCases('Базанов Иосиф Валерьянович') => array(6) {
  'nominative' => 'Базанов Иосиф Валерьянович',
  'genitive' => 'Базанова Иосифа Валерьяновича',
  'dative' => 'Базанову Иосифу Валерьяновичу',
  'accusative' => 'Базанова Иосифа Валерьяновича',
  'ablative' => 'Базановым Иосифом Валерьяновичем',
  'prepositional' => 'Базанове Иосифе Валерьяновиче'
}

Если есть необходимость определить пол по имени, воспользуйтесь функцией:

Географические названия

Вы можете склонять географические названия, такие как названия городов, стран, улиц и так далее. Класс для склонения GeographicalNamesInflection имеет похожие методы:

Что склоняется:

Пример.

use morphos\Russian\GeographicalNamesInflection;

echo 'Пора бы поехать в '.GeographicalNamesInflection::getCase('Москва', 'винительный'); // Москву
// If you need all forms, you can get all forms of a name:
GeographicalNamesInflection::getCases('Саратов') => array(6) {
    "nominative" => "Саратов",
    "genitive" => "Саратова",
    "dative" => "Саратову",
    "accusative" => "Саратов",
    "ablative" => "Саратовом",
    "prepositional" => "Саратове",
    "locative" => "Саратове",
}

Существительные

Для склонения существительных, используемых с количеством предметов/чего-либо предназначена функция pluralize:

Аргументы:

Пример.

use function morphos\Russian\pluralize;

echo pluralize(10, 'машина'); // => 10 машин
echo pluralize(10, 'новый и свободный дом', false, morphos\Russian\Cases::TVORIT); // => 10 новыми и свободными домами

Более подробное склонение существительных (по падежам и числам) описано в разделе Internals.

Трансформация в текст

Числа

Оба класса по генерации числительных (количественных и порядковых) из чисел имеют два похожих метода:

$gender может быть morphos\Gender::MALE (или просто m) или morphos\Gender::FEMALE (или просто f) or morphos\Gender::NEUTER (средний род; или просто n).

Количественные числительные

Генерация количественных числительных производится с помощью класса CardinalNumeralGenerator:

use morphos\Gender;
use morphos\Russian\CardinalNumeralGenerator;

$number = 4351;

CardinalNumeralGenerator::getCase($number, 'именительный') => 'четыре тысячи триста пятьдесят один'
CardinalNumeralGenerator::getCase($number, 'именительный', Gender::FEMALE) => 'четыре тысячи триста пятьдесят одна'
CardinalNumeralGenerator::getCases($number) => array(6) {
    "nominative" => "четыре тысячи триста пятьдесят один",
    "genitive" => "четырех тысяч трехсот пятидесяти одного",
    "dative" => "четырем тысячам тремстам пятидесяти одному",
    "accusative" => "четыре тысячи триста пятьдесят один",
    "ablative" => "четырьмя тысячами тремястами пятьюдесятью одним",
    "prepositional" => "четырех тысячах трехстах пятидесяти одном"
}

Порядковые числительные

Генерация порядковых числительных производится с помощью класса OrdinalNumeralGenerator:

use morphos\Gender;
use morphos\Russian\OrdinalNumeralGenerator;

$number = 67945;

OrdinalNumeralGenerator::getCase($number, 'именительный') => 'шестьдесят семь тысяч девятьсот сорок пятый'
OrdinalNumeralGenerator::getCase($number, 'именительный', Gender::FEMALE) => 'шестьдесят семь тысяч девятьсот сорок пятая'
OrdinalNumeralGenerator::getCases($number) => array(6) {
    "nominative" => "шестьдесят семь тысяч девятьсот сорок пятый",
    "genitive" => "шестьдесят семь тысяч девятьсот сорок пятого",
    "dative" => "шестьдесят семь тысяч девятьсот сорок пятому",
    "accusative" => "шестьдесят семь тысяч девятьсот сорок пятый",
    "ablative" => "шестьдесят семь тысяч девятьсот сорок пятым",
    "prepositional" => "шестьдесят семь тысяч девятьсот сорок пятом"
}

Валюты

Вы можете генерировать значения денежных сумм, записанных в виде текста с помощью класса MoneySpeller.

Пример.

use morphos\Russian\MoneySpeller;

MoneySpeller::spell(123.45, MoneySpeller::RUBLE) => 'сто двадцать три рубля сорок пять копеек'
MoneySpeller::spell(123.45, MoneySpeller::RUBLE, MoneySpeller::CLARIFICATION_FORMAT) => '123 (сто двадцать три) рубля 45 (сорок пять) копеек'

Все доступные форматы вывода:

Формат Формат вывода Пример
MoneySpeller::SHORT_FORMAT Сумма записывается цифрами, а валюта словами 1 рубль 50 копеек
MoneySpeller::NORMAL_FORMAT Сумма и валюта записываются словами один рубль пятьдесят копеек
MoneySpeller::DUPLICATION_FORMAT Сумма и валюта записываются словами. Сумма дублируется цифрами в скобках один (1) рубль пятьдесят (50) копеек
MoneySpeller::CLARIFICATION_FORMAT Сумма записывается словами и цифрами (в скобках), валюта - словами. 1 (один) рубль 50 (пятьдесят) копеек

При указании валюты используйте знак валюты (например, ₽) или трехзначный код валюты (\morphos\Currency::RUBLE).

Также можно указать падеж для склонения четвёртым параметром:

use morphos\Russian\MoneySpeller;

MoneySpeller::spell(123.45, MoneySpeller::RUBLE, MoneySpeller::NORMAL_FORMAT, 'родительный') => 'ста двадцати трех рублей сорока пяти копеек'

Доступные валюты:

Знак Идентификатор Валюта
$ \morphos\Currency::DOLLAR доллар
\morphos\Currency::EURO евро
¥ \morphos\Currency::YEN иена
£ \morphos\Currency::POUND фунт
Fr \morphos\Currency::FRANC франк
\morphos\Currency::YUAN юань
Kr \morphos\Currency::KRONA крона
MXN \morphos\Currency::PESO песо
\morphos\Currency::WON вон
\morphos\Currency::LIRA лира
\morphos\Currency::RUBLE рубль
\morphos\Currency::RUPEE рупия
R$ \morphos\Currency::REAL реал
R \morphos\Currency::RAND рэнд
\morphos\Currency::HRYVNIA гривна

Временные интервалы

Класс TimeSpeller позволяет генерировать временной интервал. В классе есть методы для генерации:

Пример.

use morphos\Russian\TimeSpeller;

TimeSpeller::spellDifference('+4 hours') => '4 часа'
TimeSpeller::spellDifference(time() + 14400) => '4 часа'
TimeSpeller::spellDifference('-2 minutes') => '2 минуты'
TimeSpeller::spellDifference(time() - 120) => '2 минуты'

Пример.

use morphos\Russian\TimeSpeller;

TimeSpeller::spellInterval(new DateInterval('P5YT2M')) => '5 лет 2 часа'

Также можно передать вторым аргументом в оба метода одну из следующих опций или их комбинацию (побитовое или |):

Третьим аргументом можно ограничить количество частей, которые будут сгенерированы.

TimeSpeller::spellDifference(time() - 120, TimeSpeller::DIRECTION) => '2 минуты назад'
TimeSpeller::spellInterval(new DateInterval('P5YT2M'), TimeSpeller::DIRECTION) => '5 лет 2 часа назад'
TimeSpeller::spellInterval(new DateInterval('P5YT2M'), TimeSpeller::SEPARATE) => '5 лет и 2 часа'
TimeSpeller::spellInterval(new DateInterval('P5YT2M'), TimeSpeller::DIRECTION | TimeSpeller::SEPARATE) => '5 лет и 2 часа назад'
TimeSpeller::spellInterval(new DateInterval('P5YT2M'), TimeSpeller::DIRECTION) => '5 лет 2 часа назад'
TimeSpeller::spellInterval(new DateInterval('P5Y1DT10H2M'), TimeSpeller::SEPARATE, 2) => '5 лет и 1 день'

Дополнительно

Предлоги и окончания

В классе morphos\Russian\RussianLanguage есть следующие методы для добавления предлогов или изменения окончаний разных слов:

Предлоги

Чтобы добавить предлог о или об в зависимости от того, с чего начинается следующее слово, используйте метод about():

use morphos\Russian\FirstNamesInflection;
use morphos\Russian\RussianLanguage;

RussianLanguage::about('Иване') => 'об Иване'
// или комбинируйте с другими функциями склонения
$name = 'Андрей';
RussianLanguage::about(FirstNamesInflection::getCase($name, 'п')) => 'об Андрее'

Окончания глаголов

Глаголы в прошедшем времени в русском языке имеют признак рода. Чтобы упростить подбор правильной формы глаголы используйте функцию:

string RussianLanguage::verb($verb, $gender)

Аргументы:

Пример.

use morphos\Russian\RussianLanguage;

$name = 'Анастасия';
$gender = morphos\Gender::FEMALE;

$name.' '.RussianLanguage::verb('добавил', $gender) => 'Анастасия добавила'
$name.' '.RussianLanguage::verb('поделился', $gender).' публикацией' => 'Анастасия поделилась публикацией'

Internals

Данная глава описывает ранее перечисленные функции и/или возможности более подробно.

Склонение отдельных частей имени

Для склонения отдельных частей имени есть три класса:

Все классы похожи друг на друга и имеют следующие методы:

Примеры.

FirstNamesInflection

use morphos\Russian\FirstNamesInflection;
// Возьмем имя Иван
$user_name = 'Иван';

FirstNamesInflection::getCase($user_name, 'родительный') => 'Ивана'

// получаем имя во всех падежах
FirstNamesInflection::getCases($user_name) => array(6) {
    "nominative" => "Иван",
    "genitive" => "Ивана",
    "dative" => "Ивану",
    "accusative" => "Ивана",
    "ablative" => "Иваном",
    "prepositional" => "Иване"
}

MiddleNamesInflection

use morphos\Russian\MiddleNamesInflection;
$user_name = 'Сергеевич';

MiddleNamesInflection::getCase($user_name, 'родительный') => 'Сергеевича'

MiddleNamesInflection::getCases($user_name) => array(6) {
    "nominative" => "Сергеевич",
    "genitive" => "Сергеевича",
    "dative" => "Сергеевичу",
    "accusative" => "Сергеевича",
    "ablative" => "Сергеевичем",
    "prepositional" => "Сергеевиче"
}

LastNamesInflection

use morphos\Russian\LastNamesInflection;
$user_last_name = 'Иванов';

$dative_last_name = LastNamesInflection::getCase($user_last_name, 'дательный'); // Иванову

echo 'Мы хотим подарить товарищу '.$dative_last_name.' небольшой презент.';

LastNamesInflection::getCases($user_last_name) => array(6) {
    "nominative" => "Иванов",
    "genitive" => "Иванова",
    "dative" => "Иванову",
    "accusative" => "Иванова",
    "ablative" => "Ивановым",
    "prepositional" => "Иванове"
}

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

Склонение в единственном числе

Функциональность по склонению имени существительных (а также существительных, перешедших из прилагательных/причастий) определена в классе NounDeclension:

Пример.

use morphos\Russian\NounDeclension;
// Following code will return original word if it's immutable:
NounDeclension::getCase('поле', 'родительный') => 'поля'

// Get all forms of a word at once:
NounDeclension::getCases('линейка') => array(6) {
    "nominative" => "линейка",
    "genitive" => "линейки",
    "dative" => "линейке",
    "accusative" => "линейку",
    "ablative" => "линейкой",
    "prepositional" => "линейке"
}

Склонение во множественном числе

Обеспечивается классом NounPluralization, который имеет похожие методы:

Пример.

use morphos\Russian\NounPluralization;

$word = 'дом';
echo 'Множественное число для '.$word.' - '.NounPluralization::getCase($word, 'именительный'); // дома

// Pluralize word and get all forms:
NounPluralization::getCases('поле') => array(6) {
    "nominative" => "поля",
    "genitive" => "полей",
    "dative" => "полям",
    "accusative" => "поля",
    "ablative" => "полями",
    "prepositional" => "полях"
}