28

我的树枝模板中的 |date("d F, Y") 过滤器有问题。

我希望以瑞典语输出月份。我尝试在我的 parameters.yml 文件中设置“语言环境:sv”,但没有任何效果。

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

关于如何解决这个问题的任何想法?

4

4 回答 4

55

树枝国际扩展

您可以使用在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 }
于 2013-06-28T12:18:28.930 回答
3

我将对@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

于 2018-12-14T14:18:24.897 回答
2

|date过滤器使用DateTime::format不支持语言环境的功能。看到这个问题并编写你自己的树枝扩展。

于 2013-06-28T12:23:15.517 回答
-1

我不是很喜欢 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 
于 2018-12-06T11:15:13.207 回答