Подтвердить что ты не робот

Symfony2: Как установить фильтр twig | date ( "d F, Y" ) для вывода месяцев на шведском языке?

У меня возникают проблемы с фильтром date ( "d F, Y" ) в моих шаблонах ветки.

Я хочу, чтобы месяцы выводились на шведском языке. Я попытался установить "locale: sv" в моих файлах parameters.yml, но я не получаю никакого эффекта.

Он работал до того, как я обновился с Symfony 2.1 до 2.3, поэтому я думаю, что это могло бы что-то с этим сделать.

Любые мысли о том, как это исправить?

4b9b3361

Ответ 1

Расширение Twig Intl

Вы можете использовать Twig Intl Extension, который находится в официальном расширении официального сайта Twip.

Он предоставляет локализованный фильтр даты, который можно использовать следующим образом:

{{ date | localizeddate('full', 'none', app.request.locale ) }}

используйте app.request.locale в качестве третьего параметра для текущей локали или просто 'sv'.

Интеграция в ваш проект

добавьте официальные расширения в свой composer.json, используя:

composer require twig/extensions:1.0.*@dev
composer update twig/extensions

config.yml

#enable intl extensions
services:
    twig.extension.intl:
        class: Twig_Extensions_Extension_Intl
        tags:
            - { name: twig.extension }

быстрый совет:

другое удобное расширение - это расширение текста, предоставляющее фильтры truncate,... etc

services:
    twig.extension.text:
        class: Twig_Extensions_Extension_Text
        tags:
            - { name: twig.extension }

Ответ 2

|date Использовать фильтр DateTime::format, который не поддерживает локали. См. этот вопрос и напишите собственное расширение ветки.

Ответ 3

Мне не очень понравилось расширение Twig Intl, оно немного раздулось для моего использования, поэтому я пошел с другим подходом. В нашем приложении мы расширили объект DateTime и перегрузили функцию format для перевода даты с помощью функции PHP strftime.

Перед использованием этого подхода следует рассмотреть несколько вещей:

  • В нашем приложении используется один язык (например, голландский)
  • Мы используем наш расширенный объект DateTime везде в приложении
  • Расширение класса DateTime вызовет другие проблемы, например, в Doctrine вам понадобится реализовать собственный тип для обработки расширенного DateTime, но не все библиотеки правильно используют DateTimeInterface но ожидают \DateTime объекты

Здесь класс DateTime:

YourNameSpace;

class DateTime extends \DateTime {

    public static function createFromFormat($format, $time, $timezone = null) {
        $dateTime = parent::createFromFormat($format, $time, $timezone);
        // we want to return a <YourNameSpace>\DateTime instead of a 'normal' DateTime, thus we have to instantiate one
        // note that this returns 'null' instead of 'false' so you can use nullable return types '?DateTime' and the '??' operator
        return $dateTime && $dateTime->format($format) == $time ? (new DateTime())->setTimestamp($dateTime->getTimestamp()) : null;
    }

    const FORMAT_LOCALE_MAP = [
        'F' => '%B', // full textual representation of a month, such as January or March
        'M' => '%b', // short textual representation of a month, three letters
        'l' => '%A', // full textual representation of the day of the week
        'D' => '%a'  // short textual representation of a day, three letters

        // add any other if your application needs it
    ];

    public function format($format): string {
        $formattedDate = parent::format($format);
        // localize string
        foreach(self::FORMAT_LOCALE_MAP as $dateFormat => $strftimeFormat) {
            if(strpos($format, $dateFormat) !== false) {
                $formattedDate = str_replace(parent::format($dateFormat), strftime($strftimeFormat, $this->getTimestamp()), $formattedDate);
            }
        }
        return $formattedDate;
    }

}

Затем в вашем переднем контроллере (т.е. public/index.php) установите свой язык:

setlocale(LC_ALL, 'nl_NL');

Теперь в вашем шаблоне Twig, где угодно, форматируется DateTime:

// start is an instance of your extended DateTime object
{{ start.format('D d M')|capitalize }}
// Do 06 dec 

Ответ 4

Я сделаю дополнение к решению, опубликованному @nifr.

Чтобы использовать ваш формат даты, установите расширение Twig Intl, а затем вы можете использовать:

{{ date|localizeddate('none', 'none', app.request.locale, null, 'dd MMMM, yyyy') }}

Последний аргумент в моем примере - это формат даты - вот документация: http://userguide.icu-project.org/formatparse/datetime

Вот документация по расширению Twig Intl: https://twig-extensions.readthedocs.io/en/latest/intl.html