Symfony2 → Twig, интернационализация даты

Иногда возникает потребность выводить дату в таком формате, когда месяц написан текстом, но при этом сайт многоязычный. Месяц, естественно, тоже должен соответствовать выбранной локали. Вот тут и возникает загвоздка, поскольку php-шная функция date выведет месяца на английском. Какой-нибудь крутокодер Вова Теплов создал бы массивчик с переведёнными месяцами и прошёлся бы простой заменой, поскольку некогда разбираться, надо делать тикеты. Но это не наш путь. Языков на сайте может оказаться пять штук, один из которых, допустим, арабский/корейский. Да и сами языки могут добавляться на сайт в будущем.

twig localized date

В общем, задача эта типовая и не надо ничего придумывать. Решение имеется уже готовое → IntlDateFormatter. Но решать эту задачу я буду в контексте Symfony 2.

Минута поиска в вендорских файлах и необходимое расширение twig-а обнаружено. Осталось его только подключить. Как это сделать через основной файл конфигурации, и можно ли это сделать вообще - этого мне найти не удалось. Подключим его так, будто это расширение самодельное:

1
2
3
4
5
6
7
# Hypersoft/UltraBundle/Resources/config/services.yml
services:
  twig_intl_extension:
    class: Twig_Extensions_Extension_Intl
    tags:
      twig.extension:
        name: twig.extension

После чего выводим дату в том виде, что нам надо. Результат выше на картинке.

1
2
3
<div class="date">
    {{ item.date|localizeddate('none', 'none', null, null, 'dd. LLLL YYYY') }}
</div>

Вот, собственно, и всё.

Комментарии

avatar
morontt
avatar
Тест SMTP
ответить
avatar
Valeriy
avatar
Заметку можно дополнить ссылкой на таблицу форматов, к примеру http://userguide.icu-project.org/formatparse/datetime
а то Вова Теплов может не сразу врубиться, что значат LLLL и чем они отличаются от LLL :)
ответить
avatar
morontt
avatar
О, спасибо. Я и сам такой таблички не видел, за Вову не знаю :) Табличка обязательно будет задействована в какой-нибудь новой записи.
ответить
3 комментария Написать что-нибудь
Адрес электронной почты нигде не отображается, необходим только для обратной связи.