【问题标题】:Symfony 2 setlocale (LC_ALL, 'de_DE')Symfony 2 setlocale (LC_ALL, 'de_DE')
【发布时间】:2016-06-23 21:44:15
【问题描述】:

我想用德语在 TWIG 中显示日期。

{{ event.beginnAt |date('l d.m.Y')}}

但输出是“Friday 28.06.2013”​​。

我应该在哪里使用以德语显示日期的 setlocale 函数?

【问题讨论】:

标签: php symfony twig setlocale


【解决方案1】:

你需要启用twig intl extension(它需要在php中启用intl functions)然后你只需使用:

{{ event.beginAt | localizeddate('full', 'none', locale) }}

已编辑
如果您只想本地化日期名称,可以创建自己的 Twig 扩展:

src/Acme/Bundle/DemoBundle/Twig/DateExtension.php

namespace Acme\Bundle\DemoBundle\Twig;

class DateExtension extends \Twig_Extension
{

    public function getFilters()
    {
        return array(
            new \Twig_SimpleFilter('intl_day', array($this, 'intlDay')),
        );
    }

    public function intlDay($date, $locale = "de_DE")
    {

        $fmt = new \IntlDateFormatter( $locale, \IntlDateFormatter::FULL, \IntlDateFormatter::FULL, 'Europe/Berlin', \IntlDateFormatter::GREGORIAN, 'EEEE');
        return $fmt->format($date);
    }

    public function getName()
    {
        return 'date_extension';
    }
}

然后在services.yml中注册

src/Acme/Bundle/DemoBundle/Resources/config/services.yml

parameters:
    acme_demo.date_extension.class: Acme\Bundle\DemoBundle\Twig\DateExtension

services:
    acme_demo.twig.date_extension:
        class: %acme_demo.date_extension.class%
        tags:
            - { name: twig.extension }

在您的 Twig 模板中,您可以只使用:

{{ event.beginAt|intl_day }} {{ event.beginAt|date('d.m.Y') }}

【讨论】:

  • 非常感谢你!但现在我有另一个问题。 event.beginnAt | Localizeddate('full', 'none', 'de') 给出了 Freitag,2013 年 6 月 28 日。但我只想要 Freitag,28.06.2013
  • 模板文件中不存在过滤器“intl_day”。
  • 好的。我没有在 PageExtension 中注册 yml。现在它起作用了。但我得到另一个错误:“对象“Event\PageBundle\Entity\Event”的方法“beginAt”
  • 打错字了——我写的是beginAt,但你用的是beginnAt
【解决方案2】:

为了实现这一点,我使用了SonataIntlBundle,它公开了一些用 intl 格式化的 twig 函数。

例子:

 {{ date_time_object | format_datetime(null, 'fr', 'Europe/Paris',
constant('IntlDateFormatter::LONG'), constant('IntlDateFormatter::SHORT')) }}

会输出

 '1 février 2011 19:55'

我使用了一种更简单的方法,因为我强制了 php 执行上下文的本地化,然后将 date 函数替换为 format_datetime。请记住查看支持的模式,因为它们与 strftime 不同。您在 SonataIntlBundle 上有一个链接。

【讨论】:

    【解决方案3】:

    您可以使用setlocale()strftime(),使用特定于 Symfony 的东西可能会产生开销。

    【讨论】:

      猜你喜欢
      • 2012-03-18
      • 1970-01-01
      • 2014-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-28
      • 1970-01-01
      • 2011-02-17
      相关资源
      最近更新 更多