Все наверное замечали как на многих сайтах встречаются нелепые предложения в которых указывается число неких вещей. А нелепые потому что в них обычно не согласуется форма слова с их количеством. Пример:
- В вашей корзине 2 заказов. На сумму 121 рублей.
- Запись имеет 3 комментариев
- На сайте 32 человек
Вообщем «Кто стучится в дверь моя, видишь дома нет никто, приходи ко мне вчера, будем съели пирожки». Что же делать и как это исправить?
На самом деле ничего сложного нету, и можно научить наш сайт говорить на вполне русском языке.
Теория
Нашел не так давно в интернете вот такую интересную ссылку:
http://translate.sourceforge.net/wiki/l10n/pluralforms
Интересна она тем, что там собранны алгоритмы определения формы множественного числа для почти 120 языков мира. Причем эти алгоритмы представленны в виде формул. К примеру для русского языка:
Количетсво форм слова:
nplurals=3;
Форма слова для некоего числа n:
1 |
plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2) |
То есть для русского языка три множественные формы:
- Когда предмет один (одно окно, один стол)
- Когда предметов больше двух но меньше пяти (три окна, четыре стола)
- Когда предметов больше либо равно пяти (пять окон, шесть столов)
Ну и сответсвенно теже формы используются когда преметов к примеру двадцать один, сто тридцать два и тд.
Реализация
Вообщем вчера реализовал класс основанный на таблице указанной по ссылке, т.е. поддерживает все 120 языков. Данный класс имеет несколько методов:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
/** Получить правильную форму слова для дефолтового(!) языка в соответствии с числом определяющим количество. * Дефолтовый язык определяется константой 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){} |
Ну и собственно как использовать данный класс:
1 2 |
echo("В вашей корзине " . $count . StringPlural::Plural($count, array('заказ', 'заказа', 'заказов')) . "."); echo("На сумму " . $price . StringPlural::Plural($price, array('рубль', 'рубля', 'рублей')) . "."); |
Вообщем ничего сложного по сути нету. Осталось только добавить это в свои приложения.
Вообще на эту тему изобретенно очень много велосипедов. Да впринципе на мой взгляд любой мало-мальский программист пишет сам такую функцию)
Но ваш велосипед уникален поддержкой такого огромного количества различных языков! =)
Спасибо!
«Кто стучится в дверь моя, видишь дома нет никто, приходи ко мне вчера, будем съели пирожки»
Убило :D
Спасибо, друг.
Поддержка 120 языков это внушающе…)