我的树枝模板中的 |date("d F, Y") 过滤器有问题。
我希望以瑞典语输出月份。我尝试在我的 parameters.yml 文件中设置“语言环境:sv”,但没有任何效果。
在我从 Symfony 2.1 升级到 2.3 之前它一直在工作,所以我认为这可能与它有关。
关于如何解决这个问题的任何想法?
树枝国际扩展
您可以使用在fabpot的官方 Twig 扩展存储库中找到的Twig Intl Extension。
它提供了一个本地化的日期过滤器,可以这样使用:
{{ date | localizeddate('full', 'none', app.request.locale ) }}
用作app.request.locale
当前语言环境的第三个参数或仅用作'sv'
.
集成到您的项目中
将官方扩展添加到您的composer.json
使用中:
composer require twig/extensions:1.0.*@dev
composer update twig/extensions
配置.yml
#enable intl extensions
services:
twig.extension.intl:
class: Twig_Extensions_Extension_Intl
tags:
- { name: twig.extension }
小建议:
另一个方便的扩展是提供截断,...等过滤器的文本扩展
services:
twig.extension.text:
class: Twig_Extensions_Extension_Text
tags:
- { name: twig.extension }
我将对@nifr 发布的解决方案进行补充。
为了使用您的日期格式,请安装 Twig Intl Extension,然后您可以使用:
{{ date|localizeddate('none', 'none', app.request.locale, null, 'dd MMMM, yyyy') }}
我的示例中的最后一个参数是日期格式 - 这是一个文档:http ://userguide.icu-project.org/formatparse/datetime
这是 Twig Intl Extension 文档:https ://twig-extensions.readthedocs.io/en/latest/intl.html
|date
过滤器使用DateTime::format
不支持语言环境的功能。看到这个问题并编写你自己的树枝扩展。
我不是很喜欢 Twig Intl 扩展,我的用例感觉有点臃肿,因此我采用了不同的方法。在我们的应用程序中,我们扩展了 DateTime 对象并重载了format
使用 PHP 函数转换日期的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