Morphos

A morphological solution written completely in the PHP language. Supports Russian and English. Provides classes to decline personal names, decline and pluralize nouns and generate cardinal and ordinal numerals.

Morphos

A morphological solution written completely in PHP.

Composer package Latest Stable Version License Total Downloads Latest Unstable Version

Tests & Quality: Build Status Scrutinizer Code Quality

  1. Installation
  2. Quick start
  3. Russian
    1. Personal names
    2. Geographical names
    3. Nouns
    4. Numerals
      1. Cardinal
      2. Ordinal
    5. Cases
  4. English
    1. Nouns
    2. Numerals
      1. Cardinal
  5. Contibuting

Installation

Adapters:

Quick Start

Russian

Russian morphology shortcuts:

Russian class hierarchy:

morphos\
        Russian\
                CardinalNumeral
                Cases
                GeneralDeclension
                FirstNamesDeclension
                LastNamesDeclension
                MiddleNamesDeclension
                OrdinalNumeral
                Plurality

Personal names

To compound all declension functionality in one call there is name function:

string|array name($name, $case = null, $gender = null)

Arguments:

There is three declension classes:

All declension classes are similar and have four common methods:

$gender is morphos\Gender::MALE (or "m") or morphos\Gender::FEMALE (or "f") or null for autodetection. Note that detection of middle name and last name can make right decision, but first names sometimes can not be used to determine gender of it’s owner. Especially if name is not native Russian name. So better to specify gender if you want to declinate first names.

Cases in russian language:

Examples:

FirstNamesDeclension

use morphos\Russian\FirstNamesDeclension;
// Get any form of a name:
// for example, let it be Иван
$user_name = 'Иван';

$name = FirstNamesDeclension::getCase($user_name, 'родительный'); // Ивана

// If you need all forms, you can get all forms of a name:
var_dump(FirstNamesDeclension::getCases($user_name));
/* Will produce something like
  array(6) {
    ["nominative"]=>
    string(8) "Иван"
    ["genitive"]=>
    string(10) "Ивана"
    ["dative"]=>
    string(10) "Ивану"
    ["accusative"]=>
    string(10) "Ивана"
    ["ablative"]=>
    string(12) "Иваном"
    ["prepositional"]=>
    string(15) "об Иване"
  }
*/

MiddleNamesDeclension

use morphos\Russian\MiddleNamesDeclension;
// Get any form of a name:
// for example, let it be Сергеевич
$user_name = 'Сергеевич';

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

// If you need all forms, you can get all forms of a name:
var_dump(MiddleNamesDeclension::getCases($user_name));
/* Will produce something like
  array(6) {
    ["nominative"]=>
    string(18) "Сергеевич"
    ["genitive"]=>
    string(20) "Сергеевича"
    ["dative"]=>
    string(20) "Сергеевичу"
    ["accusative"]=>
    string(20) "Сергеевича"
    ["ablative"]=>
    string(22) "Сергеевичем"
    ["prepositional"]=>
    string(23) "о Сергеевиче"
  }
*/

LastNamesDeclension

use morphos\Russian\LastNamesDeclension;
// Get any case of a last name
$user_last_name = 'Иванов';

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

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

// If you need all forms, you can get all forms of a name:
var_dump(LastNamesDeclension::getCases($user_last_name));
/* Will produce something like
  array(6) {
    ["nominative"]=>
    string(12) "Иванов"
    ["genitive"]=>
    string(14) "Иванова"
    ["dative"]=>
    string(14) "Иванову"
    ["accusative"]=>
    string(14) "Иванова"
    ["ablative"]=>
    string(16) "Ивановым"
    ["prepositional"]=>
    string(19) "об Иванове"
  }
*/

Geographical names

You can decline geographical names like cities, countries, streets and so on. It has similar methods:

Example:

use morphos\Russian\GeographicalNamesDeclension;

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

Nouns

Nouns declension

Nouns declension class also have few similar methods but arguments are different:

Usage:

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

// Get all forms of a word at once:
var_dump(GeneralDeclension::getCases('линейка'));
/* Will produce something like
  array(6) {
    ["nominative"]=>
    string(14) "линейка"
    ["genitive"]=>
    string(14) "линейки"
    ["dative"]=>
    string(14) "линейке"
    ["accusative"]=>
    string(14) "линейку"
    ["ablative"]=>
    string(16) "линейкой"
    ["prepositional"]=>
    string(17) "о линейке"
  }
*/

Nouns pluralization

Plurality class have similar methods but not only:

Usage:

use morphos\Russian\Plurality;

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

// Pluralize word and get all forms:
var_dump(Plurality::getCases('поле'));
/* Result will be like
  array(6) {
    ["nominative"]=>
    string(8) "поля"
    ["genitive"]=>
    string(10) "полей"
    ["dative"]=>
    string(10) "полям"
    ["accusative"]=>
    string(8) "поля"
    ["ablative"]=>
    string(12) "полями"
    ["prepositional"]=>
    string(13) "о полях"
  }
*/

// Also you can use shortcut
// Pluralize noun to use it with numeral

$count = 10;

echo $count.' '.morphos\Russian\pluralize('дом', $count, false); // result: 10 домов

Numerals

All number creation classes are similar and have three common methods:

$gender is one of morphos\Gender constants: MALE or FEMALE or NEUTER.

Cardinal (CardinalNumeral)

Creation of cardinal numerals in russian language.

Create generation class object:

use morphos\Gender;
use morphos\Russian\CardinalNumeral;

// Get text representation of a number:
$number = 4351;

$numeral = CardinalNumeral::getCase($number, 'именительный'); // четыре тысячи триста пятьдесят один
$numeral = CardinalNumeral::getCase($number, 'именительный', Gender::FEMALE); // четыре тысячи триста пятьдесят одна

If you need all forms, you can get all cases of a numeral:

var_dump(CardinalNumeral::getCases($number));
/* Will produce something like
  array(6) {
    ["nominative"]=>
    string(66) "четыре тысячи триста пятьдесят один"
    ["genitive"]=>
    string(74) "четырех тысяч трехсот пятидесяти одного"
    ["dative"]=>
    string(80) "четырем тысячам тремстам пятидесяти одному"
    ["accusative"]=>
    string(66) "четыре тысячи триста пятьдесят один"
    ["ablative"]=>
    string(90) "четырьмя тысячами тремястами пятьюдесятью одним"
    ["prepositional"]=>
    string(81) "о четырех тысячах трехстах пятидесяти одном"
  }
*/

Ordinal (OrdinalNumeral)

Creation of ordinal numerals in russian language.

Create generation class object:

use morphos\Gender;
use morphos\Russian\OrdinalNumeral;

// Get text representation of a number:
$number = 67945;

$numeral = OrdinalNumeral::getCase($number, 'именительный'); // шестьдесят семь тысяч девятьсот сорок пятый
$numeral = OrdinalNumeral::getCase($number, 'именительный', Gender::FEMALE); // шестьдесят семь тысяч девятьсот сорок пятая

If you need all forms, you can get all cases of a numeral:

var_dump(OrdinalNumeral::getCases($number));
/* Will produce something like
  array(6) {
      ["nominative"]=>
      string(81) "шестьдесят семь тысяч девятьсот сорок пятый"
      ["genitive"]=>
      string(83) "шестьдесят семь тысяч девятьсот сорок пятого"
      ["dative"]=>
      string(83) "шестьдесят семь тысяч девятьсот сорок пятому"
      ["accusative"]=>
      string(81) "шестьдесят семь тысяч девятьсот сорок пятый"
      ["ablative"]=>
      string(81) "шестьдесят семь тысяч девятьсот сорок пятым"
      ["prepositional"]=>
      string(84) "о шестьдесят семь тысяч девятьсот сорок пятом"
    }
*/

English

English morphology shortcuts:

English class hierarchy:

morphos\
        English\
                CardinalNumeral
                Plurality

Pluralization (Plurality)

Pluralization a word in English:

use morphos\English\Plurality;

echo '10 '.Plurality::pluralize('foot');
// result: 10 feet

Numerals

All number creation classes are similar and have one common methods:

Cardinal (CardinalNumeral)

Creation of cardinal numerals in english language.

Create declension class object:

use morphos\English\CardinalNumeral;

Get text representation of a number:

$number = 4351;

$numeral = CardinalNumeral::generate($number); // four thousand, three hundred fifty-one

Contibuting

See CONTRIBUTING.md for this.