diff --git a/src/Russian/GeneralDeclension.php b/src/Russian/GeneralDeclension.php index e2607da..8d3a374 100644 --- a/src/Russian/GeneralDeclension.php +++ b/src/Russian/GeneralDeclension.php @@ -53,9 +53,13 @@ class GeneralDeclension extends \morphos\GeneralDeclension implements Cases { 'рубль', ); + static protected $immutableWords = array( + 'евро', + ); + public function hasForms($word, $animateness = false) { $word = lower($word); - if (in_array(slice($word, -1), array('у', 'и', 'е', 'о', 'ю'))) + if (in_array(slice($word, -1), array('у', 'и', 'е', 'о', 'ю')) || in_array($word, self::$immutableWords)) return false; return true; } @@ -75,7 +79,16 @@ static public function getDeclension($word) { public function getForms($word, $animateness = false) { $word = lower($word); - if (isset($this->abnormalExceptions[$word])) { + if (in_array($word, self::$immutableWords)) { + return array( + self::IMENIT => $word, + self::RODIT => $word, + self::DAT => $word, + self::VINIT => $word, + self::TVORIT => $word, + self::PREDLOJ => $this->choosePrepositionByFirstLetter($word, 'об', 'о').' '.$word, + ); + } else if (isset($this->abnormalExceptions[$word])) { $prefix = slice($word, -1); return array( self::IMENIT => $word, diff --git a/src/Russian/Plurality.php b/src/Russian/Plurality.php index 9e9b6db..df3dd4f 100644 --- a/src/Russian/Plurality.php +++ b/src/Russian/Plurality.php @@ -16,6 +16,10 @@ class Plurality extends \morphos\Plurality implements Cases { 'море', ); + static protected $immutableWords = array( + 'евро', + ); + static public function pluralize($word, $count, $animateness = false) { static $dec, $plu; if ($dec === null) $dec = new GeneralDeclension(); @@ -52,6 +56,17 @@ public function getForms($word, $animateness = false) { $prefix = slice($word, 0, -1); $last = slice($word, -1); + if (in_array($word, self::$immutableWords)) { + return array( + self::IMENIT => $word, + self::RODIT => $word, + self::DAT => $word, + self::VINIT => $word, + self::TVORIT => $word, + self::PREDLOJ => $this->choosePrepositionByFirstLetter($word, 'об', 'о').' '.$word, + ); + } + if (($declension = GeneralDeclension::getDeclension($word)) == GeneralDeclension::FIRST_DECLENSION) { $soft_last = $last == 'й' || (in_array($last, ['ь', 'е', 'ё', 'ю', 'я']) && (self::isConsonant(slice($word, -2, -1)) || slice($word, -2, -1) == 'и')); $prefix = GeneralDeclension::getPrefixOfFirstDeclension($word, $last); diff --git a/tests/Russian/GeneralDeclensionTest.php b/tests/Russian/GeneralDeclensionTest.php index 481a9f1..13218f1 100644 --- a/tests/Russian/GeneralDeclensionTest.php +++ b/tests/Russian/GeneralDeclensionTest.php @@ -27,6 +27,10 @@ public function testDeclenation($word, $animateness, $declension, $declenated) { public function wordsProvider() { return array( + // 1 - Мужской рода с нулевым или окончанием [о, е], + // 1 - Среднего рода с окончанием [о, е]. + // 2 - Женский, мужской род с окончанием [а, я]. + // 3 - Женский род на мягкий и щипящий согласный. array('дом', false, 1, array('дом', 'дома', 'дому', 'дом', 'домом', 'о доме')), array('поле', false, 1, array('поле', 'поля', 'полю', 'поле', 'полем', 'о поле')), array('кирпич', false, 1, array('кирпич', 'кирпича', 'кирпичу', 'кирпич', 'кирпичем', 'о кирпиче')), @@ -38,6 +42,11 @@ public function wordsProvider() { array('сообщение', false, 1, array('сообщение', 'сообщения', 'сообщению', 'сообщение', 'сообщением', 'о сообщение')), array('общение', false, 1, array('общение', 'общения', 'общению', 'общение', 'общением', 'об общение')), array('воскрешение', false, 1, array('воскрешение', 'воскрешения', 'воскрешению', 'воскрешение', 'воскрешением', 'о воскрешение')), + array('рубль', false, 1, array('рубль', 'рубля', 'рублю', 'рубль', 'рублем', 'о рубле')), + array('доллар', false, 1, array('доллар', 'доллара', 'доллару', 'доллар', 'долларом', 'о долларе')), + array('евро', false, 1, array('евро', 'евро', 'евро', 'евро', 'евро', 'о евро')), + array('фунт', false, 1, array('фунт', 'фунта', 'фунту', 'фунт', 'фунтом', 'о фунте')), + array('молния', false, 2, array('молния', 'молнии', 'молние', 'молнию', 'молнией', 'о молние')), array('папа', true, 2, array('папа', 'папы', 'папе', 'папу', 'папой', 'о папе')), array('слава', false, 2, array('слава', 'славы', 'славе', 'славу', 'славой', 'о славе')), @@ -46,6 +55,8 @@ public function wordsProvider() { array('тысяча', false, 2, array('тысяча', 'тысячи', 'тысяче', 'тысячу', 'тысячей', 'о тысяче')), array('копейка', false, 2, array('копейка', 'копейки', 'копейке', 'копейку', 'копейкой', 'о копейке')), array('батарейка', false, 2, array('батарейка', 'батарейки', 'батарейке', 'батарейку', 'батарейкой', 'о батарейке')), + array('гривна', false, 2, array('гривна', 'гривны', 'гривне', 'гривну', 'гривной', 'о гривне')), + array('ночь', false, 3, array('ночь', 'ночи', 'ночи', 'ночь', 'ночью', 'о ночи')), array('новость', false, 3, array('новость', 'новости', 'новости', 'новость', 'новостью', 'о новости')), );