Как стать автором
Обновить

Патч к Drupal-модулю Date — показываем месяцы в родительном падеже

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

НЕправильные даты в выводе ноды

Понятно, что через какое-то время привыкаешь и просто не замечаешь, но есть ведь настойчивые заказчики, которые тыкают носом разработчика в эти «ляпы» и требующие исправления ошибок (по их мнению). Спасибо им за это. Это нужно, хотя и раздражает.


Вывод блока с кастомным обработчиком дат.



Итак, по требованию заказчика вывести в блоке нормальные даты я написал модуль. Модуль выводит блок, где определённым образом форматируется вывод анонсов и собственно исправляются даты. Точно такой же блок можно сделать во Views, если бы не кривые даты…

Короче говоря код модуля я приводить не буду, а только функцию, которая исправляет даты. Этот код может очень пригодится тем, кто не сможет дочитать пост до конца.

Ок. Код всего модуля приложен к статье, чтобы уменьшить соотношение код/текст, чтобы не объяснять как делается вызов фунции и в каком формате должна быть дата — изучайте сами, если это вам нужно. Даты начала события и конца хранятся в одном ССК-поле, которое называется field_event_date и имеет тип Date.

Но этот модуль можно не использовать, а применить патч для модуля Date, но об этом ниже.

  1. // Функция преобразует даты в "правильные", то есть в родительном падеже и ещё разные штучки делает.
  2. function _calendar_list_conv_date($a, $format='front') {
  3.   global $language;
  4.   $date = strtotime($a);
  5.   switch($format) {
  6.     case 'front':
  7.       $monthes = array (
  8.         'en' => array('January','February','March','April','May','June','July','August','September','October','November','December'),
  9.         'ru' => array('января','февраля','марта','апреля','мая','июня','июля','августа','сентября','октября','ноября','декабря'),
  10.         'uk' => array('січня','лютого','березня','квітня','травня','червня','липня','серпня','вересня','жовтня','листопада','грудня'),
  11.       );
  12.       $weekday = array (
  13.         'en' => array('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'),
  14.         'ru' => array('Понедельник','Вторник','Среда','Четверг','Пятница','Суббота','Воскресенье'),
  15.         'uk' => array('Понеділок','Вівторок','Середа','Четвер','П’ятниця','Субота','Неділя'),
  16.       );
  17.       switch ($language->language) {
  18.         case 'ru':
  19.         case 'uk':
  20.             $output = date("j",$date) .' '. $monthes[$language->language][date("n",$date)-1] .', '. $weekday[$language->language][date("N",$date)-1];
  21.             break;
  22.         case 'en':
  23.         default:
  24.             $output = $monthes[$language->language][date("n",$date)-1] .' '. date("j",$date) .', '. $weekday[$language->language][date("N",$date)-1];
  25.             break;
  26.       }
  27.  
  28.       break;
  29.     case 'short':
  30.       $output = date('d.m.Y', $date); //20.02.2010
  31.       break;
  32.     default:
  33.       $output = date("j",$date).' '.$monthes[date("n",$date)-1].' '.date("Y",$date).' '.date("H",$date).':'.date("i",$date);
  34.       break;
  35.   }
  36.   return $output;
  37. }


После созерцания блока с «хорошими» датами заказчик успокоился и потребовал сделать «правильно» в остальных местах сайта…

Я понял, что нужно кардинально другое решение — универсальное и системное. Очень много времени ушло на то, чтобы понять какой именно модуль и как меняет даты — возможно сказалось то, что температура была большая.
Сам код решения был написан и оттестирован где-то за полдня.

Исправленные даты - месяц в родительном падеже

Патч модуля Date, чтобы получить корректную обработку дат для всего сайта



Изменяются только 3 функции в файле date_api.module модуля Date:
  • date_t
  • date_t_strings
  • date_format_date


Идея в том, что название месяца в родительном падеже должно выводиться только, если выводится рядом с числом месяца. Во всех остальных случаях — именительный падеж.

Пример:


23 февраля 2010, а не 23 февраль 2010.
Но март 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

Скачать:
  1. Модуль Calendar List — выводит блоки со списками событий и правильной датой
  2. Патч для модуля Date
Теги:
Хабы:
Всего голосов 63: ↑45 и ↓18+27
Комментарии31

Публикации