Symfony2: Как установить фильтр twig | date ( "d F, Y" ) для вывода месяцев на шведском языке?
У меня возникают проблемы с фильтром date ( "d F, Y" ) в моих шаблонах ветки.
Я хочу, чтобы месяцы выводились на шведском языке. Я попытался установить "locale: sv" в моих файлах parameters.yml, но я не получаю никакого эффекта.
Он работал до того, как я обновился с Symfony 2.1 до 2.3, поэтому я думаю, что это могло бы что-то с этим сделать.
Любые мысли о том, как это исправить?
Ответы
Ответ 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