Вывод даты в виде "27 февраль 2010" это уродливо. Ни в русском, ни в украинском, ни в польском — и, я думаю, что это касается большинства других славянских языков — так не говорят и не пишут.

Понятно, что через какое-то время привыкаешь и просто не замечаешь, но есть ведь настойчивые заказчики, которые тыкают носом разработчика в эти «ляпы» и требующие исправления ошибок (по их мнению). Спасибо им за это. Это нужно, хотя и раздражает.
Итак, по требованию заказчика вывести в блоке нормальные даты я написал модуль. Модуль выводит блок, где определённым образом форматируется вывод анонсов и собственно исправляются даты. Точно такой же блок можно сделать во Views, если бы не кривые даты…
Короче говоря код модуля я приводить не буду, а только функцию, которая исправляет даты. Этот код может очень пригодится тем, кто не сможет дочитать пост до конца.
Ок. Код всего модуля приложен к статье, чтобы уменьшить соотношение код/текст, чтобы не объяснять как делается вызов фунции и в каком формате должна быть дата — изучайте сами, если это вам нужно. Даты начала события и конца хранятся в одном ССК-поле, которое называется field_event_date и имеет тип Date.
Но этот модуль можно не использовать, а применить патч для модуля Date, но об этом ниже.
После созерцания блока с «хорошими» датами заказчик успокоился и потребовал сделать «правильно» в остальных местах сайта…
Я понял, что нужно кардинально другое решение — универсальное и системное. Очень много времени ушло на то, чтобы понять какой именно модуль и как меняет даты — возможно сказалось то, что температура была большая.
Сам код решения был написан и оттестирован где-то за полдня.

Изменяются только 3 функции в файле date_api.module модуля Date:
Идея в том, что название месяца в родительном падеже должно выводиться только, если выводится рядом с числом месяца. Во всех остальных случаях — именительный падеж.
23 февраля 2010, а не23 февраль 2010.
Но март 2010, а немарта 2010
Все эти манипуляции (применение патча и перевод вручную строк) нужно делать только пока патч не будет принят разработчиками модуля Date и не выпущен релиз с этими изменениями.
Пока я не вижу причин, которые могут припятствовать, но всякое бывает и, даже, если патч будет принят, то дата выхода релиза может отодвигаться по другим причинам.
Англоязычным товарищам этот патч не нужен, потому что в английском языке этой проблемы с датами нет и они могут счесть его не важным, поэтому я попробую опубликовать эту же статью на хабре и прошу поддержать также issue с патчем на drupal.org:
drupal.org/node/728350 — Multilanguage month support
Скачать:

Понятно, что через какое-то время привыкаешь и просто не замечаешь, но есть ведь настойчивые заказчики, которые тыкают носом разработчика в эти «ляпы» и требующие исправления ошибок (по их мнению). Спасибо им за это. Это нужно, хотя и раздражает.
Вывод блока с кастомным обработчиком дат.
Итак, по требованию заказчика вывести в блоке нормальные даты я написал модуль. Модуль выводит блок, где определённым образом форматируется вывод анонсов и собственно исправляются даты. Точно такой же блок можно сделать во Views, если бы не кривые даты…
Короче говоря код модуля я приводить не буду, а только функцию, которая исправляет даты. Этот код может очень пригодится тем, кто не сможет дочитать пост до конца.
Ок. Код всего модуля приложен к статье, чтобы уменьшить соотношение код/текст, чтобы не объяснять как делается вызов фунции и в каком формате должна быть дата — изучайте сами, если это вам нужно. Даты начала события и конца хранятся в одном ССК-поле, которое называется field_event_date и имеет тип Date.
Но этот модуль можно не использовать, а применить патч для модуля Date, но об этом ниже.
- // Функция преобразует даты в "правильные", то есть в родительном падеже и ещё разные штучки делает.
- function _calendar_list_conv_date($a, $format='front') {
- global $language;
- $date = strtotime($a);
- switch($format) {
- case 'front':
- $monthes = array (
- 'en' => array('January','February','March','April','May','June','July','August','September','October','November','December'),
- 'ru' => array('января','февраля','марта','апреля','мая','июня','июля','августа','сентября','октября','ноября','декабря'),
- 'uk' => array('січня','лютого','березня','квітня','травня','червня','липня','серпня','вересня','жовтня','листопада','грудня'),
- );
- $weekday = array (
- 'en' => array('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'),
- 'ru' => array('Понедельник','Вторник','Среда','Четверг','Пятница','Суббота','Воскресенье'),
- 'uk' => array('Понеділок','Вівторок','Середа','Четвер','П’ятниця','Субота','Неділя'),
- );
- switch ($language->language) {
- case 'ru':
- case 'uk':
- $output = date("j",$date) .' '. $monthes[$language->language][date("n",$date)-1] .', '. $weekday[$language->language][date("N",$date)-1];
- break;
- case 'en':
- default:
- $output = $monthes[$language->language][date("n",$date)-1] .' '. date("j",$date) .', '. $weekday[$language->language][date("N",$date)-1];
- break;
- }
-
- break;
- case 'short':
- $output = date('d.m.Y', $date); //20.02.2010
- break;
- default:
- $output = date("j",$date).' '.$monthes[date("n",$date)-1].' '.date("Y",$date).' '.date("H",$date).':'.date("i",$date);
- break;
- }
- return $output;
- }
После созерцания блока с «хорошими» датами заказчик успокоился и потребовал сделать «правильно» в остальных местах сайта…
Я понял, что нужно кардинально другое решение — универсальное и системное. Очень много времени ушло на то, чтобы понять какой именно модуль и как меняет даты — возможно сказалось то, что температура была большая.
Сам код решения был написан и оттестирован где-то за полдня.

Патч модуля Date, чтобы получить корректную обработку дат для всего сайта
Изменяются только 3 функции в файле date_api.module модуля Date:
- date_t
- date_t_strings
- date_format_date
Идея в том, что название месяца в родительном падеже должно выводиться только, если выводится рядом с числом месяца. Во всех остальных случаях — именительный падеж.
Пример:
23 февраля 2010, а не
Но март 2010, а не
Как заставить все это работать?
- Применить патч, который приложен к статье или скопировать уже изменённые функции вместо старых. Рецепт о том, как применить патч (есть варианты для Линукс, и для Винды): Применение заплат (patch)
- Открыть страницу "Перевод интерфейса" (admin/build/translate/search) и найти строку:
!month-genitive |January|February|March|April|May|June|July|August|September|October|November|December
- Сделать её перевод на нужный язык. Учтите, что для английского названия месяцев обычно пишутся с заглавной, а у нас — нет. Названия
месяцев должны быть в родильном падеже. Для русского и украинского языков это выглядит так:
- Русский:
!month-genitive |января|февраля|марта|апреля|мая|июня|июля|августа|сентября|октября|ноября|декабря
- Украинский:
!month-genitive |січня|лютого|березня|квітня|травня|червня|липня|серпня|вересня|жовтня|листопада|грудня
- Русский:
- Сохранить переводы и проверить отображение дат.
Будущее патча
Все эти манипуляции (применение патча и перевод вручную строк) нужно делать только пока патч не будет принят разработчиками модуля Date и не выпущен релиз с этими изменениями.
Пока я не вижу причин, которые могут припятствовать, но всякое бывает и, даже, если патч будет принят, то дата выхода релиза может отодвигаться по другим причинам.
Англоязычным товарищам этот патч не нужен, потому что в английском языке этой проблемы с датами нет и они могут счесть его не важным, поэтому я попробую опубликовать эту же статью на хабре и прошу поддержать также issue с патчем на drupal.org:
drupal.org/node/728350 — Multilanguage month support
Скачать:
- Модуль Calendar List — выводит блоки со списками событий и правильной датой
- Патч для модуля Date