Symfony2:如何设置twig | date(" d F,Y")过滤器以瑞典语输出月份?

时间:2013-06-28 11:57:18

标签: php date datetime symfony twig

我的twig模板中的| date(“d F,Y”)过滤器出现问题。

我希望用瑞典语输出月份。我试过在我的parameters.yml文件中设置“locale:sv”,但是没有效果。

在我从Symfony 2.1升级到2.3之前它正在工作,所以我认为这可能与它有关。

有关如何解决这个问题的想法吗?

4 个答案:

答案 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函数来转换日期。

在使用此方法之前,应在此处考虑以下几点:

  • 我们的应用程序使用一种语言(在本例中为荷兰语)
  • 我们在应用程序中的任何地方都使用扩展的DateTime对象
  • 扩展DateTime类 会导致其他问题,例如,在Doctrine中,您将必须实现自定义Type来处理扩展的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