OctoberCMS. Локализация дат через twig фильтр
3 часа потрачено
Для базовой локализации в конфигурационном файле config\app.php
следует выставить локаль ru
.
/*
|--------------------------------------------------------------------------
| Application Locale Configuration
|--------------------------------------------------------------------------
|
| The application locale determines the default locale that will be used
| by the translation service provider. You are free to set this value
| to any of the locales which will be supported by the application.
|
*/
'locale' => 'ru',
После этого всё, что написали разработчики октября, выводится на русском, однако если ручками написать {{ '2018-03-15 00:00:00'|date('F Y') }}
, то вместо ожидаемого Март 2018
появится March 2018
. Как показали поиски, с таким поведением столкнулся не один я:
- https://octobercms.com/forum/post/print-date-in-a-localized-manner-without-using-setlocale
- https://octobercms.com/forum/post/twig-date-format-cant-localized
- https://octobercms.com/forum/post/current-date-in-russian
Дьявол кроется в деталях
В OctoberCMS используется Argon
вместо Carbon
. Аргон = Карбон + локализация на основе jenssegers/date. Если создавать объект даты как экземпляр Carbon\Carbon
или inline-даты, как в примере выше, то они не будут локализованы. А если пользоватся October\Rain\Argon\Argon
, то всё прекрасно локализуется.
Пример использования
В примере запрос возвращает такие данные.
"year" | "month" | "published" |
---|---|---|
"2018" | "3" | "4" |
"2018" | "2" | "13" |
"2018" | "1" | "12" |
"2017" | "12" | "24" |
"2017" | "11" | "14" |
Задача вывести:
- Март 2018
- Февраль 2018
- Январь 2018
- Декабрь 2017
- Ноябрь 2017
use RainLab\Blog\Models\Post;
use October\Rain\Argon\Argon;
function onStart()
{
$archives = Post::selectRaw('year(created_at) year, month(created_at) month, count(*) published' )
->isPublished()
->groupBy('year', 'month')
->orderByRaw('min(created_at) desc')
->get();
foreach ($archives as $archive) {
$archive->displayDate = Argon::createFromDate($archive->year, $archive->month);
}
$this['archives'] = $archives;
}
Пробегаемся по полученной коллекции и каждому члену добавляем свойство displayDate
, которое является объектом класса Argon
. В шаблонизаторе выводим полученное свойство с 2 фильтрами archive.displayDate|date('F Y')|capitalize
. Вывод даты в формате полный месяц и год, первая буква заглавная.
{% for archive in archives %}
<li>
<a href="{{ 'blog/archive'|page({ year: archive.year, month: archive.month }) }}">
{{ archive.displayDate|date('F Y')|capitalize }}
</a>
</li>
{% endfor %}
Вот и всё, результат получен.
После обновления до 436
После обновления OctoberCMS до версии 436 даты из твиг фильтра
|date('M')
стали выводится
{0}май|{1}мая
Как варинат решения использовать F
вместо M