Все наверное замечали как на многих сайтах встречаются нелепые предложения в которых указывается число неких вещей. А нелепые потому что в них обычно не согласуется форма слова с их количеством. Пример:
- В вашей корзине 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('рубль', 'рубля', 'рублей')) . ".");
Вообщем ничего сложного по сути нету. Осталось только добавить это в свои приложения.
Вообще на эту тему изобретенно очень много велосипедов. Да впринципе на мой взгляд любой мало-мальский программист пишет сам такую функцию)
Но ваш велосипед уникален поддержкой такого огромного количества различных языков! =)
Спасибо!
«Кто стучится в дверь моя, видишь дома нет никто, приходи ко мне вчера, будем съели пирожки»
Убило :D
Спасибо, друг.
Поддержка 120 языков это внушающе…)