Долгое время на месте дат постов здесь выводились фразы, лишь временами верные грамматически, типа «5 недель назад», «1 недель назад», a то и вовсе «2 дней назад». Джанговский фильтр timesince лишь берёт перевод английских «weeks» или «days» из локали системы, где не предусмотрена поддержка падежей.
Органично также смотрятся даты вроде «2 марта» или «15 мая», но
фильтр
date
при передаче F в составе форматирующей строки возвращает имя
месяца в именительном падеже без возможности склонения. С днями
недели то же самое.
Можно переделать перевод Django на свой лад (там используется gettext), однако есть весьма приятный пакет PyTils для Python, который встраивается в том числе и в Django, предоставляя функции для работы с русским языком.
После установки в Django становится возможным использовать
вкусные плюшки. Во-первых, russian-aware фильтры форматирования
даты — ru_strftime и ru_strftime_inflected. Такой код:
{{ entry.add_date|ru_strftime:"%d %B" }}
выведет дату в виде «19 марта».
На замену встроенному в Django фильтру timesince приходит distance_of_time:
{{ entry.add_date|distance_of_time }}
выведет дату в виде «5 дней назад».
Есть также славная работа с числами. choose_plural выбирает правильное окончание в зависимости от числа (варианты передаются как для чисел 1, 2, 5):
Всего {{ hits }} запис{{ hits|choose_plural:"ь,и,ей" }}
выведет текст «Всего 5 записей» или «Всего 121 запись».
Есть и несколько других приятных возможностей.
Комментарии:
А как pytils в джангу подключить?
Вася, там же в дистре есть инструкция.
Сначала пользовался pytils-ами, потом нужно стало сделать полную интернационализацию, перелез на gettext. Всё отлично, кроме дат. В моём случае нужно делать свой фильтр и завязывать его на gettext, в .po-файлах отдельно будут лежать названия месяцев и дней недели во всех нужных падежах. Иначе никак.
Подскажите, пожалуйста, как вывести даты в джанге вот в таком формате:
Сегодня Вчера 4 июля 2009
То есть использовать и naturalday, и strftime.
Наверное, использовать условный оператор. То есть, проверять, попадает ли дата в небольшую окрестность «сегодня» или нет.