1

Тема: Как сделать локализ. вывод даты?

Пытался поиском, но как-то я не могу пока с ним подружиться sad.

Задачка такая: хочу, чтобы у меня в форуме все даты выводились в виде "5 Дек 2006 г.". Мануал говорит, что вместо date() нужно использовать strftime(). ОК, поправил несколько файлов (functions.php, viewtopic.php, admin_options.php, extern.php), залил на сервер, сменил в админке формат даты на "%e %b %Y г.". Все пучком, но вместо "Дек" кракозябры. Я в недоумении, что делать?

PunBB 1.2.14
Linux (Fedora)
Apache 2.0.51
PHP 4.3.10
MySQL 3.23.58

Поделиться

2

Re: Как сделать локализ. вывод даты?

Up.

Ни у кого никаких мыслей не появилось на этот счет? Хотя бы в какую сторону рыть?

Поделиться

3

Re: Как сделать локализ. вывод даты?

В lang/Russian/common.php
после блока (он может немного отличаться)

switch (PHP_OS)
{
    case 'WINNT':
    case 'WIN32':
        $locale = 'russian';
        break;

    case 'FreeBSD':
    case 'NetBSD':
    case 'OpenBSD':
        $locale = 'ru_RU.utf-8';
        break;

    default:
        $locale = 'ru_RU';
        break;
}

поставь

setlocale(LC_TIME, $locale);
Захочешь — найдешь время, не захочешь — найдешь причину.

Поделиться

4

Re: Как сделать локализ. вывод даты?

Все в точности так и есть, за исключением двух моментов:
1. Вместо ru_RU.utf-8 у меня стоит ru_RU.CP1251, но, поскольку мой хостинг выдает в качестве PHP_OS 'Linux' (проверял), то это не имеет значения. Переменной $locale присваивается 'ru_RU', это я тоже проверял.
2. Перед

setlocale(LC_TIME, $locale);

у меня еще стоит

setlocale(LC_CTYPE, $locale);

Поделиться

5

Re: Как сделать локализ. вывод даты?

Может стоит добавить перед strftime

setlocale (LC_ALL, 'ru_RU');

Или поищи что еще можно вместо ru_RU написать.

Сайт Slavik

Поделиться

6

Re: Как сделать локализ. вывод даты?

Попробую. А где вообще можно посмотреть про эти идентификаторы локалей, не от балды же вписывать?

Поделиться

7

Re: Как сделать локализ. вывод даты?

А х его з. На http://php.net/ ничего толком не нашел, тольво вот такие упоминания:

$locale = array ('ru_RU.CP1251', 'rus_RUS.1251');
setlocale (LC_TIME, $locale)
. . .
setlocale(LC_CTYPE,"ru_RU.KOI8-R");

Сайт Slavik

Поделиться

8

Re: Как сделать локализ. вывод даты?

Не помогает. Однако обнаружил оччень интересную фишку. Согласно задумке (и мануалам), Дек в 1251 кодировке должен выводиться как C4 E5 EA (hex). А выводится как B4 D5 DA (hex) !! Ау, мегаперцы, это что за кодировка такая получается?

Поделиться

9

Re: Как сделать локализ. вывод даты?

smile Остается написать маленькую функцию, которая будет конвертировать название месяца из неизвестной кодировки в известную smile Или брать числовой вариант даты и подставлять свои значения вместо цифр.

Захочешь — найдешь время, не захочешь — найдешь причину.

Поделиться

10

Re: Как сделать локализ. вывод даты?

А может проще выводить в английской локали, а затем при помощи массива соответсвий конвертнуть в русский?

Сайт Slavik

Поделиться

11

Re: Как сделать локализ. вывод даты?

Внимание, вопрос! А зачем тогда нужна strftime()?
lol
Вопросы риторические, конечно же.

Видимо придется написать функцию, тем более, что это позволит мне выводить дату в виде "5 декабря 2006 г.".

Всем спасибо за участие! wink

P.S. 2Slavik - вроде на твоем сайте есть дни рождения - это что-то самописное или такой мод существует? Я на панресе ничего, откликающегося на birthday, не обнаружил.

Поделиться

12

Re: Как сделать локализ. вывод даты?

Costa пишет:

Дек в 1251 кодировке должен выводиться как C4 E5 EA (hex). А выводится как B4 D5 DA (hex)

Я нашел закономерность! Надо из каждого октета (вроде так по-умному) прибавить смещение (C4-B4=10), тогда получим нормальный Дек в хексе!

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

Сайт Slavik

Поделиться

13

Re: Как сделать локализ. вывод даты?

Slavik пишет:

Я нашел закономерность! Надо из каждого октета (вроде так по-умному) прибавить смещение (C4-B4=10), тогда получим нормальный Дек в хексе!

Это я тоже понял. У меня два объяснения: либо в strftime() есть ошибка, либо результат выдается в некоей кодировке, в которой символу Д соответствует 0xB4, а не 0xC4, как должно быть для 1251.
Делать после strftime() еще и перекодировку/вычитание, не очень красиво, лучше уж тогда вернуть date() взад и конвертить через массив соответствий.

Поделиться

14

Re: Как сделать локализ. вывод даты?

В общем только что проверил у себя, все замечательно показывает. Поставил setlocale(LC_ALL, $locale), на локалхосте. Правда выдает почемуто без числа, ну да ладно, главное никакой проблемы с кодировкой нету.

Сайт Slavik

Поделиться