PyTils

Долгое время на месте дат постов здесь выводились фразы, лишь временами верные грамматически, типа «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 запись».

Есть и несколько других приятных возможностей.

git.md