Помогите перевести плугинчик!

Разработка своих веб-приложений и страничек

Помогите перевести плугинчик!

Сообщение NowhereMan » 24 фев 2009, 20:11

Я не великий спец в php, посему обращаюсь к подкованному сообществу:
Есть необходимость перевести на русский язык небольшой плугинчик к вордпрессу. Код таков:
Код: Выделить всёРазвернуть
function time_since($older_date, $newer_date = false)
        {
        // array of time period chunks
        $chunks = array(
        array(60 * 60 * 24 * 365 , 'year'),
        array(60 * 60 * 24 * 30 , 'month'),
        array(60 * 60 * 24 * 7, 'week'),
        array(60 * 60 * 24 , 'day'),
        array(60 * 60 , 'hour'),
        array(60 , 'minute'),
        );

        // $newer_date will equal false if we want to know the time elapsed between a date and the current time
        // $newer_date will have a value if we want to work out time elapsed between two known dates
        $newer_date = ($newer_date == false) ? (time()+(60*60*get_settings("gmt_offset"))) : $newer_date;

        // difference in seconds
        $since = $newer_date - $older_date;

        // we only want to output two chunks of time here, eg:
        // x years, xx months
        // x days, xx hours
        // so there's only two bits of calculation below:

        // step one: the first chunk
        for ($i = 0, $j = count($chunks); $i < $j; $i++)
                {
                $seconds = $chunks[$i][0];
                $name = $chunks[$i][1];

                // finding the biggest chunk (if the chunk fits, break)
                if (($count = floor($since / $seconds)) != 0)
                        {
                        break;
                        }
                }

        // set output var
        $output = ($count == 1) ? '1 '.$name : "$count {$name}s";

        // step two: the second chunk
        if ($i + 1 < $j)
                {
                $seconds2 = $chunks[$i + 1][0];
                $name2 = $chunks[$i + 1][1];

                if (($count2 = floor(($since - ($seconds * $count)) / $seconds2)) != 0)
                        {
                        // add to output var
                        $output .= ($count2 == 1) ? ', 1 '.$name2 : ", $count2 {$name2}s";
                        }
                }

        return $output;
        }
?>

Код должен возвращать разницу между $older_date и $newer_date в текстовом виде. Сейчас он прекрасно делает это на аглицком, но мы живем в другой стране с другим государственным языком, в котором правила образования множественного числа числительных разительно отличаются от аглицких. Именно эта задача и встала передо мной: адаптировать скрипт, дабы он выдавал "год", "месяц", "день", "час", "минута" и "секунда" в случае, если младший разряд цифры равен 1; "года", "месяца", "дня", "часа", "минуты" и "секунды" если младший разряд равен 2, 3 или 4; и "лет", "месяцев", "дней", "часов", "минут" и "секунд" во всех остальных случаях.
Я знаю решение этой задачи на других языках программирования, но с php не знаком до нужной степени, поэтому и обращаюсь к сообществу. Надеюсь на помощь.
Аватара пользователя
NowhereMan
Активный участник
 
Сообщения: 73
Зарегистрирован: 12 апр 2008, 00:29
Домен: linuxdoc.vfose.ru

Re: Помогите перевести плугинчик!

Сообщение doliar » 24 фев 2009, 20:27

Найти :
Код: Выделить всёРазвернуть
// array of time period chunks
        $chunks = array(
        array(60 * 60 * 24 * 365 , 'year'),
        array(60 * 60 * 24 * 30 , 'month'),
        array(60 * 60 * 24 * 7, 'week'),
        array(60 * 60 * 24 , 'day'),
        array(60 * 60 , 'hour'),
        array(60 , 'minute'),
        );

Заменить:
Код: Выделить всёРазвернуть
 // array of time period chunks
  $chunks = array(
  array(60 * 60 * 24 * 365 , 'год'),
  array(60 * 60 * 24 * 30 , 'месяц'),
  array(60 * 60 * 24 * 7, 'неделя'),
  array(60 * 60 * 24 , 'день'),
  array(60 * 60 , 'час'),
  array(60 , 'минута'),
  );


По логике должно получиться )
Изображение

Консультаций по TBDev через icq неосуществляю!
Аватара пользователя
doliar
Автор
 
Сообщения: 732
Зарегистрирован: 16 янв 2008, 15:05
Откуда: Саратов, Волжский р-он
Домен: tbdev-info.vfose.ru

Re: Помогите перевести плугинчик!

Сообщение NowhereMan » 24 фев 2009, 20:52

Не-а. Не получится. Будет "2 минутаs 5 секундаs назад"... Я про это и писал - в русском языке _три_ варианта. Я не умею выразить это в php, почему сюда и обратился.
Аватара пользователя
NowhereMan
Активный участник
 
Сообщения: 73
Зарегистрирован: 12 апр 2008, 00:29
Домен: linuxdoc.vfose.ru

Re: Помогите перевести плугинчик!

Сообщение Кадет » 24 фев 2009, 20:58

NowhereMan писал(а):Не-а. Не получится. Будет "2 минутаs 5 секундаs назад"... Я про это и писал - в русском языке _три_ варианта. Я не умею выразить это в php, почему сюда и обратился.

Попробуй убрать "s":
Код: Выделить всёРазвернуть
                        {
                        // add to output var
                        $output .= ($count2 == 1) ? ', 1 '.$name2 : ", $count2 {$name2}s";
                        }

Замени на:
Код: Выделить всёРазвернуть
                        {
                        // add to output var
                        $output .= ($count2 == 1) ? ', 1 '.$name2 : ", $count2 {$name2}";
                        }


З.Ы. как вариант. Ну или попробывать "s" заменить на "ы"
Кадет
Активный участник
 
Сообщения: 1497
Зарегистрирован: 23 апр 2008, 21:08

Re: Помогите перевести плугинчик!

Сообщение doliar » 24 фев 2009, 21:01

Ещё тогда :
Код: Выделить всёРазвернуть
// set output var
        $output = ($count == 1) ? '1 '.$name : "$count {$name}s";


Код: Выделить всёРазвернуть
// set output var
        $output = ($count == 1) ? '1 '.$name : "$count {$name}";

Это чучуть повыше ))

или же целеком:
Код: Выделить всёРазвернуть
function time_since($older_date, $newer_date = false)
        {
        // array of time period chunks
        $chunks = array(
        array(60 * 60 * 24 * 365 , 'год'),
        array(60 * 60 * 24 * 30 , 'месяц'),
        array(60 * 60 * 24 * 7, 'неделя'),
        array(60 * 60 * 24 , 'день'),
        array(60 * 60 , 'час'),
        array(60 , 'минут'),
        );

        // $newer_date will equal false if we want to know the time elapsed between a date and the current time
        // $newer_date will have a value if we want to work out time elapsed between two known dates
        $newer_date = ($newer_date == false) ? (time()+(60*60*get_settings("gmt_offset"))) : $newer_date;

        // difference in seconds
        $since = $newer_date - $older_date;

        // we only want to output two chunks of time here, eg:
        // x years, xx months
        // x days, xx hours
        // so there's only two bits of calculation below:

        // step one: the first chunk
        for ($i = 0, $j = count($chunks); $i < $j; $i++)
                {
                $seconds = $chunks[$i][0];
                $name = $chunks[$i][1];

                // finding the biggest chunk (if the chunk fits, break)
                if (($count = floor($since / $seconds)) != 0)
                        {
                        break;
                        }
                }

        // set output var
        $output = ($count == 1) ? '1 '.$name : "$count {$name}";

        // step two: the second chunk
        if ($i + 1 < $j)
                {
                $seconds2 = $chunks[$i + 1][0];
                $name2 = $chunks[$i + 1][1];

                if (($count2 = floor(($since - ($seconds * $count)) / $seconds2)) != 0)
                        {
                        // add to output var
                        $output .= ($count2 == 1) ? ', 1 '.$name2 : ", $count2 {$name2}";
                        }
                }

        return $output;
        }
Изображение

Консультаций по TBDev через icq неосуществляю!
Аватара пользователя
doliar
Автор
 
Сообщения: 732
Зарегистрирован: 16 янв 2008, 15:05
Откуда: Саратов, Волжский р-он
Домен: tbdev-info.vfose.ru

Re: Помогите перевести плугинчик!

Сообщение NowhereMan » 24 фев 2009, 21:06

Это не поможет. Будет либо "минут", либо "минута", но "минуты" - не будет, что нарушает грамматику русского языка.
В данном случае надо выяснять, равен последний разряд числа 1, или от 2 до 4, либо 5 и больше, и в соответствии с этим подставлять соответственно "минута", "минуты" или "минут". Идея ясна? Опять же, я не знаю, как это закодить в php.
Аватара пользователя
NowhereMan
Активный участник
 
Сообщения: 73
Зарегистрирован: 12 апр 2008, 00:29
Домен: linuxdoc.vfose.ru

Re: Помогите перевести плугинчик!

Сообщение Rostov114 » 24 фев 2009, 22:08

Чет попахивает переписыванием плугина (по грамматике правильно плагина)...
Некоммерческий проект «HSDN»
Аватара пользователя
Rostov114
Автор
 
Сообщения: 3198
Зарегистрирован: 18 окт 2007, 02:21

Re: Помогите перевести плугинчик!

Сообщение Костик » 24 фев 2009, 22:44

никакой не плагин а простая функция правильного написания отсчета времени :)
FreeBSD 9.2 and Fedora 18 user
Аватара пользователя
Костик
Активный участник
 
Сообщения: 1944
Зарегистрирован: 03 сен 2007, 02:15

Re: Помогите перевести плугинчик!

Сообщение NowhereMan » 24 фев 2009, 22:45

Rostov114 писал(а):Чет попахивает переписыванием плугина (по грамматике правильно плагина)...

По сути - надо просто сделать пару проверок, которые будут определять значение младшего знака числа и выбирать нужное значение из массива, собственно, как и сделано в оригинальном коде, только массив будет на пару размерностей больше. Все остальное дело техники.
Аватара пользователя
NowhereMan
Активный участник
 
Сообщения: 73
Зарегистрирован: 12 апр 2008, 00:29
Домен: linuxdoc.vfose.ru

Re: Помогите перевести плугинчик!

Сообщение NowhereMan » 24 фев 2009, 22:47

Костик писал(а):никакой не плагин а простая функция правильного написания отсчета времени :)

Да. На _русском_ языке. Если есть примеры реализации - подкиньте, я сам разберусь...
Аватара пользователя
NowhereMan
Активный участник
 
Сообщения: 73
Зарегистрирован: 12 апр 2008, 00:29
Домен: linuxdoc.vfose.ru

След.

Вернуться в PHP, HTML, CSS...

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 152