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. Как показали поиски, с таким поведением столкнулся не один я:

Дьявол кроется в деталях

В 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

Похожие записи

OctoberCMS. Ошибка RelationController: "Не удалось найти шаблон (partial) ... traits\ViewMaker.php"

В контроллере поведения RelationController при нажатии на кнопке "Cоздание" вылетает ошибка с подобным содержаним

"Не удалось найти шаблон (partial) с именем _comments.htm." on line 91
of ...\modules\system\traits\ViewMaker.php

FrontEnd контроллеры в OctoberCMS

В OctoberCMS нет концепции frontEnd контроллеров. Иными словами, идеология этой CMS не подразумевает возможность просто создать некий ProductController с несколькими action для обслуживания маршрутов Route::method('product/{id}', 'ProductController@show'). Вместо этого предлагается использовать компоненты плагинов. Именно компоненты являются формой frontEnd контроллеров.