Forums / National / Russian / Зоопарк с окончаниями

<<<123456>>>

Sergey
#31 2009-02-09 16:39
почему я остановился на том варианте с предопределенными окончаниями? функция допускает, не только складывать слово, но просто выводить соответствующее числу слово.
Да очень просто. Правила,то правила, но зоопарк в окончаниях привносят исключения.

0 файлов, 1 файл, 3 файла..
$L['File_s'] = "Файл,ов,,а,ов";

нет файлов, 1 файл, 3 файла..
$L['File_s'] = ",нет файлов,файл,файла,файлов";

0 пальто == нет польт (?), 1 пальто, 2 пальто...
$L['File_s'] = ",нет польт,пальто,пальто,пальто";

проще в отдельных случая не самими окончаниями манипулировать, а вариантами слова
Это касаемо и других языков.
И соответственно легко осуществляется языковая локализация - вставляй свое правило
фрагмент $ew=explode(",",$word); подготовит набор удобных вариантов.
www.cotonti.mobi
Trustmaster
#32 2009-02-09 16:43
Неплохой анализ проблемы проведен. Но надо это как-то бы изящнее оформить. А то класс со единственным статическим методом - это никуда не годится.
May the Source be with you!
Ratibor
#33 2009-02-09 16:54
# Trustmaster : Неплохой анализ проблемы проведен. Но надо это как-то бы изящнее оформить. А то класс со единственным статическим методом - это никуда не годится.
В предыдущем посте я привел class Plural,
остается его немного допилить и объеденить с поправленной function declension,
то все будет прекрасно. И получится что в зависимости от вписанного в config.php языка, будет использоваться конкретное правило.

Правила для ланг файлов останутся прежние:
кому нужны склонения, вписывают из в array, кому не нужны, оставляют единственное значение.
Не задавай глупых вопросов, не услышишь вранья.
This post was edited by Ratibor (2009-02-09 17:10, 15 years ago)
dervan
#34 2009-02-09 17:19
# Trustmaster : А то класс со единственным статическим методом - это никуда не годится.

Раз прозвучала эта тема, вопрос: а как в Cotonti планируется оформлять библиотеки и разделять пространство имён?

Один из способов как раз такой: класс, члены которого являются статическими (const, static), т.е. класс здесь - это не ООП, а просто контейнер. Либо делать без классов - обычные константы, глобальные переменные и функцищи с префиксами в именах.
Trustmaster
#35 2009-02-09 17:44
В PHP нет namespace? Ай-ай-ай :-)

Нет, статические классы использовать не будем. У нас в основе старый добрый процедурный стиль и префиксы. Классы для компонентов.
May the Source be with you!
dervan
#36 2009-02-09 17:48
> Классы для компонентов.
Понятно.

Ай-ай-ай - это про что? :)
Ratibor
#37 2009-02-09 19:26
Что не правильно тут:

function declension($digit,$expr,$onlyword=false) {
    function getPlural($plural, $locale) {

        switch($locale) {
            case 'bo':
            case 'dz':
            case 'id':
            case 'ja':
            case 'jv':
            case 'ka':
            case 'km':
            case 'kn':
            case 'ko':
            case 'ms':
            case 'th':
            case 'tr':
            case 'vi':
                return 0;
                break;

            case 'af':
            case 'az':
            case 'bn':
            case 'bg':
            case 'ca':
            case 'da':
            case 'de':
            case 'el':
            case 'en':
            case 'eo':
            case 'es':
            case 'et':
            case 'eu':
            case 'fa':
            case 'fi':
            case 'fo':
            case 'fur':
            case 'fy':
            case 'gl':
            case 'gu':
            case 'ha':
            case 'he':
            case 'hu':
            case 'is':
            case 'it':
            case 'ku':
            case 'lb':
            case 'ml':
            case 'mn':
            case 'mr':
            case 'nah':
            case 'nb':
            case 'ne':
            case 'nl':
            case 'nn':
            case 'no':
            case 'om':
            case 'or':
            case 'pa':
            case 'pap':
            case 'ps':
            case 'pt':
            case 'so':
            case 'sq':
            case 'sv':
            case 'sw':
            case 'ta':
            case 'te':
            case 'tk':
            case 'ur':
            case 'zh':
            case 'zu':
                return ($plural == 1) ? 1 : 0;

            case 'am':
            case 'bh':
            case 'fil':
            case 'fr':
            case 'gun':
            case 'hi':
            case 'ln':
            case 'mg':
            case 'nso':
            case 'xbr':
            case 'ti':
            case 'wa':
                return (($plural == 0) || ($plural == 1)) ? 1 : 0;

            case 'be':
            case 'bs':
            case 'hr':
            case 'ru':
            case 'sr':
            case 'uk':
                return (($plural % 10 == 1) && ($plural % 100 != 11)) ? 1 : (($plural % 10 >= 2) && ($plural % 10 <= 4) && (($plural % 100 < 10) || ($plural % 100 >= 20))) ? 2 : 0;

            case 'cs':
            case 'sk':
                return ($plural == 1) ? 1 : (($plural >= 2) && ($plural <= 4)) ? 2 : 0;

            case 'ga':
                return ($plural == 1) ? 1 : ($plural == 2) ? 2 : 0;

            case 'lt':
                return (($plural % 10 == 1) && ($plural % 100 != 11)) ? 1 : (($plural % 10 >= 2) && (($plural % 100 < 10) || ($plural % 100 >= 20))) ? 2 : 0;

            case 'sl':
                return ($plural % 100 == 1) ? 1 : ($plural % 100 == 2) ? 2 : (($plural % 100 == 3) || ($plural % 100 == 4)) ? 3 : 0;

            case 'mk':
                return ($plural % 10 == 1) ? 1 : 0;

            case 'mt':
                return ($plural == 1) ? 1 : (($plural == 0) || (($plural % 100 > 1) && ($plural % 100 < 11))) ? 2 : (($plural % 100 > 10) && ($plural % 100 < 20)) ? 3 : 0;

            case 'lv':
                return ($plural == 0) ? 1 : (($plural % 10 == 1) && ($plural % 100 != 11)) ? 2 : 0;

            case 'pl':
                return ($plural == 1) ? 1 : (($plural % 10 >= 2) && ($plural % 10 <= 4) && (($plural % 100 < 10) || ($plural % 100 > 29))) ? 2 : 0;

            case 'cy':
                return ($plural == 1) ? 1 : ($plural == 2) ? 2 : (($plural == 8) || ($plural == 11)) ? 3 : 0;

            case 'ro':
                return ($plural == 1) ? 1 : (($plural == 0) || (($plural % 100 > 0) && ($plural % 100 < 20))) ? 2 : 0;

            case 'ar':
                return ($plural == 0) ? 1 : ($plural == 1) ? 2 : ($plural == 2) ? 3 : (($plural >= 3) && ($plural <= 10)) ? 4 : (($plural >= 11) && ($plural <= 99)) ? 5 : 0;

            default:
                return null;
        }
    }
    if(is_array($expr))
    {
            $i=preg_replace('/[^0-9]+/s','',$digit)%100; //intval не всегда корректно работает
            if($onlyword) $digit='';

	$locale= 'ru';
    $plural= getPlural ($i, $locale);
    switch ($plural) {
        case 0:
            $res=$digit.' '.$expr[0];
            break;
        case 1:
            $res=$digit.' '.$expr[1];
            break;
        case 2:
            $res=$digit.' '.$expr[2];
            break;
        case 3:
            $res=$digit.' '.$expr[3];
            break;
        case 4:
            $res=$digit.' '.$expr[4];
            break;

			default: $res=$digit.' '.$expr[5];
    }
	}
    else
    {
    $res = $digit.' '.$expr;
    }
 
        return trim($res);

}
Не задавай глупых вопросов, не услышишь вранья.
McDuck
#38 2009-02-09 19:56
# Ratibor : Что не правильно тут:
очепятка в строке 94
            case 'uk':
нужно
            case 'ua':
Ratibor
#39 2009-02-09 20:07
McDuck
Спасибо, но в данном случае это не важно.
Важно найти ошибки в самом коде, а не в название стран, т.к. все равно там жестко ru прописано.
Не задавай глупых вопросов, не услышишь вранья.
dervan
#40 2009-02-09 20:26
Ratibor, а зачем getPlural() по default'у возвращает NULL, который потом идёт аргументом в switch ($plural)?

И ещё - про встроенные функцищи.
При 2-м вызове declension() будет ошибка:
Fatal error: Cannot redeclare getPlural()
Sergey
#41 2009-02-09 21:38
Мой вариант просто работает уже несколько лет. Единственное, что требует, добавить ввода самой цифры в вывод, но можно и так.
www.cotonti.mobi
Ratibor
#42 2009-02-09 22:14
Sergey
Твой вариант работает абсолютно для всех языков ?
То что ты написал на предыдущей странице, только для русского и английского = в морг.

dervan
Те замечания что ты описал, сейас тоже не важны,
выжно то что при $locale= 'ru'; на выходе getPlural() не могу получить 1, 0 и 2 без проблемм, а вот 1 не получается.
Не задавай глупых вопросов, не услышишь вранья.
This post was edited by Ratibor (2009-02-09 22:25, 15 years ago)
Sergey
#43 2009-02-09 22:43
Ratibor
Зато правильно. У вас там делится на 100 до остатка, а в русском фокусы зоопарка от 0 до 2 десятков и моя функция понимает множественные исключения. В котонти и так мало локализаций - можно и добавить, я например турецкого не знаю, тот кто знает тот и добавит, для остальной сотни просто ничего не делается т.е. и не портится. Кстати о морге:
Пожарник докладывает пострадавшему главврачу: В результате наших действий, пожар потушен, из 7 пациентов 5 откачаны и живы. Врач, а вы знаете, что горел морг? :-))
www.cotonti.mobi
Ratibor
#44 2009-02-09 22:58
# Sergey : У вас там делится на 100 до остатка, а в русском фокусы зоопарка от 0 до 2 десятков и моя функция понимает множественные исключения.
Назови хотябы одно исключение с которм мой вариант не справится ?


# Sergey : 0 пальто == нет польт (?), 1 пальто, 2 пальто...
$L['File_s'] = ",нет польт,пальто,пальто,пальто";
Учи русский, слово пальто не склоняется.
нет польт - такого выражения в русском языке впринципе нет :-)
Не задавай глупых вопросов, не услышишь вранья.
dervan
#45 2009-02-09 23:15
Ratibor, для русского языка получается так:
return (5 <= $plural && $plural <= 20) ? 2 : ((1 == ($plural %= 10)) ? 0 : ((2 <= $plural && $plural <= 4) ? 1 : 2));

Слушай, а может не вгонять всё в одну строку? Так хоть и короче, но зато несколько нечитабельно - IMHO конечно. Можно же сделать аналогично тому, как у тебя было здесь.

<<<123456>>>