Множественные формы слов (PHP Класс)

5 комментариев

Все наверное замечали как на многих сайтах встречаются нелепые предложения в которых указывается число неких вещей. А нелепые потому что в них обычно не согласуется форма слова с их количеством. Пример:

  • В вашей корзине 2 заказов. На сумму 121 рублей.
  • Запись имеет 3 комментариев
  • На сайте 32 человек

Вообщем «Кто стучится в дверь моя, видишь дома нет никто, приходи ко мне вчера, будем съели пирожки». Что же делать и как это исправить?

На самом деле ничего сложного нету, и можно научить наш сайт говорить на вполне русском языке.

Теория

Нашел не так давно в интернете вот такую интересную ссылку:
http://translate.sourceforge.net/wiki/l10n/pluralforms
Интересна она тем, что там собранны алгоритмы определения формы множественного числа для почти 120 языков мира. Причем эти алгоритмы представленны в виде формул. К примеру для русского языка:

Количетсво форм слова:
nplurals=3;

Форма слова для некоего числа n:

plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)

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

  • Когда предмет один (одно окно, один стол)
  • Когда предметов больше двух но меньше пяти (три окна, четыре стола)
  • Когда предметов больше либо равно пяти (пять окон, шесть столов)

Ну и сответсвенно теже формы используются когда преметов к примеру двадцать один, сто тридцать два и тд.

Реализация

Вообщем вчера реализовал класс основанный на таблице указанной по ссылке, т.е. поддерживает все 120 языков. Данный класс имеет несколько методов:

/** Получить правильную форму слова для дефолтового(!) языка в соответствии с числом определяющим количество.
* Дефолтовый язык определяется константой PLURAL_DEFAULT_LANG (по дефолту "ru") в данном классе.
*
* @param integer $amount число определяющее количетсво "предметов" слова
* @param mixed $_
*
* @example self::Plural(1, array('стул', 'стула', 'стульев')); //стул
* @example self::Plural(2, 'стул', 'стула', 'стульев'); //стула
* @example self::Plural(5, 'стул', 'стула', 'стульев'); //стульев
*
* @return string
*/
static function Plural($amount, $_){}


/** Получить правильную форму слова для английского языка в соответствии с числом определяющим количество
 *
 * @param integer $amount число определяющее количетсво "предметов" слова
 * @param mixed $_
 *
 * @example self::PluralEn(1, array('window', 'windows')); //window
 * @example self::PluralEn(2, 'window', 'windows'); //windows
 *
 * @return string
 */
static function PluralEn($amount, $_){}


/** Получить правильную форму слова для нужного языка в соответствии с числом определяющим количество
 *
 * @param string $lang индетификатор языка для которого нужно возвращать форму слова
 * @param integer $amount число определяющее количетсво "предметов" слова
 * @param mixed $_
 *
 * @example self::PluralLang('en', 1, array('window', 'windows')); //window
 * @example self::PluralLang('en', 2, 'window', 'windows'); //windows
 *
 * @return string
 */
static function PluralLang($lang, $amount, $_){}


/** Получить количество словоформ множественного числа для данного языка
 *
 * @param string $lang индетификатор языка
 * @return integer количество словоформ
 */
static function PluralLangGetCount($lang){}

Ну и собственно как использовать данный класс:

echo("В вашей корзине " . $count . StringPlural::Plural($count, array('заказ', 'заказа', 'заказов')) . ".");
echo("На сумму " . $price . StringPlural::Plural($price, array('рубль', 'рубля', 'рублей')) . ".");

Вообщем ничего сложного по сути нету. Осталось только добавить это в свои приложения.

Скачать

StringPlural.php

  1. Василий

    Вообще на эту тему изобретенно очень много велосипедов. Да впринципе на мой взгляд любой мало-мальский программист пишет сам такую функцию)

    Но ваш велосипед уникален поддержкой такого огромного количества различных языков! =)

  2. Артем

    «Кто стучится в дверь моя, видишь дома нет никто, приходи ко мне вчера, будем съели пирожки»
    Убило :D

Добавить комментарий

Прочли запись? Понравилась? Не стесняйтесь, оставьте, пожалуйста, свой комментарий. Мне очень интересно, что вы думаете об этом. Кстати в комментарии вы можете задать мне любой вопрос. Я обязательно отвечу.

Вы можете оставить коментарий анонимно, для этого можно не указывать Имя и email. Все комментарии проходят модерацию, поэтому ваш комментарий появится не сразу.