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

ErsteVorherige12345678NächsteLetzte

Antar
#61 10. Februar 2009, 02:57
Ни у кого не возникает мысли, что этот функционал излишен?
Ratibor
#62 10. Februar 2009, 02:59
# dervan : а для case 'xbr': - другое
            return (($plural == 0) || ($plural == 1)) ? 1 : 0;
Да зоопарк с этими языками :-)
Для en и многих друих будет так:
0 matches
1 match
2 matches
3 matches
etc.....

А для uk, fr и других:
0 match
1 match
2 matches
3 matches
etc.....

en - читай американский(международный английский)
uk - читай английский(Великобритания)
Не задавай глупых вопросов, не услышишь вранья.
dervan
#63 10. Februar 2009, 03:07
Тогда ещё неприкаянными остались 'au', 'us' - это навскидку, может ещё что есть. Выходит, их тоже надо приткнуть в одну из этих 2-х веток.
Ratibor
#64 10. Februar 2009, 03:10
# dervan : Тогда ещё неприкаянными остались 'au', 'us' - это навскидку, может ещё что есть. Выходит, их тоже надо приткнуть в одну из этих 2-х веток.
Вот пусть они сами и решают в какую им ветку входить :-)

Может вообще оставим только языки, для которых есть ланг файлы в транке,
а остальные сами пусть добавляют вместе с локализацией ?

Главное основу зделали и добавить новый язык теперь не составит труда.

Тогда бы получилось так:
function declension($digit, $expr, $onlyword = false)
{
    if (!is_array($expr))
    {
        return trim(($onlyword ? '' : "$digit ") . $expr);
    }
 
    global $lang;
 
    $i = preg_replace('#[^0-9]+#', '', $digit);
    $plural = get_plural($i, $lang);
    $cnt = count($expr);
    return trim(($onlyword ? '' : "$digit ") . (($cnt > 0 && $plural < $cnt) ? $expr[$plural] : ''));
}

function get_plural($plural, $locale)
{
    switch ($locale)
    {
        case 'en':
        case 'de':
        case 'nl':
        case 'se':
            return ($plural == 1) ? 1 : 0;
 
        case 'fr':
        case 'uk':
            return (($plural == 0) || ($plural == 1)) ? 1 : 0;
 
        case 'ru':
        case 'ua':
            $plural %= 100;
            return (5 <= $plural && $plural <= 20) ? 2 : ((1 == ($plural %= 10)) ? 0 : ((2 <= $plural && $plural <= 4) ? 1 : 2));

        default:
            return 0;
    }
}
Не задавай глупых вопросов, не услышишь вранья.

Dieser Beitrag wurde von Ratibor (am 10. Februar 2009, 03:55, vor 15 Jahre) bearbeitet
dervan
#65 10. Februar 2009, 03:20
# Ratibor : Может вообще оставим только языки, для которых есть ланг файлы в транке,
а остальные сами пусть добавляют вместе с локализацией ?
Правильное решениееееее... (c)

# Ratibor : Главное основу зделали и добавить новый язык теперь не составит труда.
Ага, спасибо тебе большое. :) Мне тоже не нравятся корявые фразы.
Ratibor
#66 10. Februar 2009, 03:28
Trustmaster тебя ждем :-)

Выскажи свое весткое мнение ?
Будем менять функцию на новую и если да, то на какой вариант ?
Под все языки или под те, для которых есть ланг файлы в транке ?
Не задавай глупых вопросов, не услышишь вранья.
medar
#67 10. Februar 2009, 04:01
Сделайте голосование в Ideas.

Поясните только, если эта фича будет внедрена - надо лэнги обязательно переписывать или можно юзать старые (без склонения в этом случае)?
rangjungyeshe.ru
Trustmaster
#68 10. Februar 2009, 04:12
Если честно, пребываю практически в таком же неведении о сути этих дебатов, как и все остальные, поэтому согласен с постом medar'а, о том, что неплохо бы хорошенько объяснить, что это такое, с чем едят и как дополнять локализации.

С точки зрения дизайна замечания:
[list=1]
  • Именование функций не соотвествует принятому именованию с префиксом sed.
  • Огромный свитч в get_plural не есть гут. Мне кажется, логичнее переопределение get_plural в ленгфайлах, либо использование группировки правил по языковым группам.
  • May the Source be with you!
    Sergey
    #69 10. Februar 2009, 04:29
    Что тут объяснять:
    вот свеженькое: 12 пользователь(ей), 7 гость(ей) :
    а хочется: 12 пользователей и 7 гостей :-*
    www.cotonti.mobi
    Ratibor
    #70 10. Februar 2009, 04:29
    # medar : Поясните только, если эта фича будет внедрена - надо лэнги обязательно переписывать или можно юзать старые (без склонения в этом случае)?
    Объясняю на пальцах.
    Тем кто не уважает свой язык, или язык не поддерживающий склонения, ничего в ланг файлах переделывать не надо.
    А для тех людей, кто уважает свой язык, переделка сводится к следующему(на примере плагина search):
    для русского языка

    ищем в ланг файле строку:

    $L['plu_match'] = "совпадений";

    и меняем ее на:

    $L['plu_match'] = array('совпадение','совпадения','совпадений');

    т.е. создаем массив array для трех склонений, первое это для значения 1, второе для значения 2 и третье для значения 5 и 0.

    Все на этом переделка русского ланг файла закончена.

    для английского языка

    ищем в ланг файле строку:

    $L['plu_match'] = "match(es)";

    и меняем ее на:

    $L['plu_match'] = array('matches','match');

    т.е. создаем массив array для двух склонений, первое это для значений 0, 2 и т.д., второе для значения 1 .

    Все на этом переделка английского ланг файла закончена.

    Теперь переходим к самому плагину:
    Ищем где в нем вызывается эта фраза, в данном случае в search.php ищем:
    ".$items." ".$L['plu_match']."

    она там находится в 4 местах.
    Меняем ее на :
    ".declension($items,$L['plu_match'])."

    Все.

    Повторю еще раз для любителей крупной бронитехники.
    Эта переделка никак не влияет на другие языковые файлы.
    Если к примеру к переделанному плагину вы добавите другой языковой файл, без доработки,
    то он будет работать как и раньше.

    # Trustmaster : Мне кажется, логичнее переопределение get_plural в ленгфайлах, либо использование группировки правил по языковым группам.
    Дак и так зделана группировка по языковым группам.
    Длинный свитч получился из-за того что туда практически были включены все языки.
    Но мы маленько урезали и включили, только те, на которые есть ланг файлы в репозитарии(см. вариант чуть выше, там всего 38 строк).
    Правила для других языков можно посмотреть к примеру тут:
    http://translate.sourceforge.net/wiki/l10n/pluralforms

    P.S. Надеюсь теперь все доступно объяснил ?
    Не задавай глупых вопросов, не услышишь вранья.

    Dieser Beitrag wurde von Ratibor (am 10. Februar 2009, 05:02, vor 15 Jahre) bearbeitet
    Trustmaster
    #71 10. Februar 2009, 04:45
    Звучит неплохо, очень даже. Теперь найти бы кого-то кто это переведет на английский и выставит на обсуждение в Идеи (я пока пас, над нововведениями некогда работать).
    May the Source be with you!
    Ratibor
    #72 10. Februar 2009, 04:50
    # Trustmaster : Звучит неплохо, очень даже. Теперь найти бы кого-то кто это переведет на английский и выставит на обсуждение в Идеи (я пока пас, над нововведениями некогда работать).
    А кроме тебя некому :-)
    Мне тут на русском-то пришлось пол года объяснять :-)

    Да и смысла то в голосовании по данному вопросу нет.
    Мы всеголишь исправляем ошибки в языковых файлах.

    Просто некоторые наслушались на неокроме.ру флудера Antony.
    Вместо того чтобы помочь, он там флуд развел.

    Предлагаю включить следуюющую функцию(поправь если не нравятся какие то названия функций):

    function declension($digit, $expr, $onlyword = false)
    {
        if (!is_array($expr))
        {
            return trim(($onlyword ? '' : "$digit ") . $expr);
        }
     
        global $lang;
     
        $i = preg_replace('#[^0-9]+#', '', $digit);
        $plural = get_plural($i, $lang);
        $cnt = count($expr);
        return trim(($onlyword ? '' : "$digit ") . (($cnt > 0 && $plural < $cnt) ? $expr[$plural] : ''));
    }
    
    function get_plural($plural, $locale)
    {
        switch ($locale)
        {
            case 'en':
            case 'de':
            case 'nl':
            case 'se':
                return ($plural == 1) ? 1 : 0;
     
            case 'fr':
            case 'uk':
                return (($plural == 0) || ($plural == 1)) ? 1 : 0;
     
            case 'ru':
            case 'ua':
                $plural %= 100;
                return (5 <= $plural && $plural <= 20) ? 2 : ((1 == ($plural %= 10)) ? 0 : ((2 <= $plural && $plural <= 4) ? 1 : 2));
    
            default:
                return 0;
        }
    }
    Не задавай глупых вопросов, не услышишь вранья.
    Trustmaster
    #73 10. Februar 2009, 05:06
    Обсуждение на 3 страницы не надо переводить, достаточно перевести твой предыдущий пост, чтобы народ знал, что это такое и как это использовать. Документация нужна в первую очередь!

    После этого можно будет этот код включить в trunk для тестирования. Функции желательно все-таки назвать sed_declension и sed_get_plural, дополнив их также в коде комментарием PHPDoc.
    May the Source be with you!
    dervan
    #74 10. Februar 2009, 05:11
    Ratibor, и ещё может есть смысл в функцище sed_get_plural() поменять имя параметра $locale на что-то более подходящее - на $lang, например? А то $locale немного сбивает с толку.
    Ratibor
    #75 10. Februar 2009, 05:18
    Насчет комментариев, не знаю что даже и писать, скажите напишу :-)


    А остальное поправил:

    function sed_declension($digit, $expr, $onlyword = false)
    {
        if (!is_array($expr))
        {
            return trim(($onlyword ? '' : "$digit ") . $expr);
        }
     
        global $lang;
     
        $i = preg_replace('#[^0-9]+#', '', $digit);
        $plural = sed_get_plural($i, $lang);
        $cnt = count($expr);
        return trim(($onlyword ? '' : "$digit ") . (($cnt > 0 && $plural < $cnt) ? $expr[$plural] : ''));
    }
    
    function sed_get_plural($plural, $lang)
    {
        switch ($lang)
        {
            case 'en':
            case 'de':
            case 'nl':
            case 'se':
                return ($plural == 1) ? 1 : 0;
     
            case 'fr':
            case 'uk':
                return (($plural == 0) || ($plural == 1)) ? 1 : 0;
     
            case 'ru':
            case 'ua':
                $plural %= 100;
                return (5 <= $plural && $plural <= 20) ? 2 : ((1 == ($plural %= 10)) ? 0 : ((2 <= $plural && $plural <= 4) ? 1 : 2));
    
            default:
                return 0;
        }
    }
    Не задавай глупых вопросов, не услышишь вранья.

    ErsteVorherige12345678NächsteLetzte