我的twig模板中的| date(“d F,Y”)过滤器出现问题。
我希望用瑞典语输出月份。我试过在我的parameters.yml文件中设置“locale:sv”,但是没有效果。
在我从Symfony 2.1升级到2.3之前它正在工作,所以我认为这可能与它有关。
有关如何解决这个问题的想法吗?
答案 0 :(得分:49)
Twig Intl Extension
您可以使用 fabpot 的官方Twig扩展Twig Intl Extension中找到的repository。
它提供了一个本地化的日期过滤器,可以像这样使用:
{{ 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 ,...等过滤器的文本扩展名
services:
twig.extension.text:
class: Twig_Extensions_Extension_Text
tags:
- { name: twig.extension }
答案 1 :(得分:2)
|date
过滤器使用DateTime::format
函数,它不支持区域设置。请参阅this question并编写您自己的树枝扩展名。
答案 2 :(得分:1)
我将对@nifr发布的解决方案进行补充。
要使用日期格式,请安装Twig Intl Extension,然后可以使用:
{{ 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
答案 3 :(得分:0)
我不太喜欢Twig Intl扩展,对于我的用例来说有点膨胀,因此我采用了另一种方法。在我们的应用程序中,我们扩展了DateTime对象,并使用PHP的format
函数重载了strftime
函数来转换日期。
在使用此方法之前,应在此处考虑以下几点:
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