使用Symfony 2在树枝中本地化日期

时间:2012-02-28 10:34:39

标签: php localization symfony twig

要在树枝上格式化日期,通常使用以下内容:

{{ meeting.date|date("m/d/Y") }}

现在,我必须将此日期本地化(美国m / d / y,NL d / m / y)。在树枝上做这件事的最佳做法是什么?我确实使用Symfony 2,解决方法是在控制器中进行翻译,但我想在树枝上做这个。

3 个答案:

答案 0 :(得分:40)

the Intl Twig extension怎么办?

在树枝模板中使用:

{{ my_date | localizeddate('full', 'none', locale) }}

答案 1 :(得分:7)

我不想为这些东西安装一个完整的扩展,并且需要自动执行一些操作:也可以在Bundle / Twig中编写辅助类(或扩展现有的帮助程序) /扩展例如:

public function foo(\Datetime $datetime, $lang = 'de_DE', $pattern = 'd. MMMM Y')
{
    $formatter = new \IntlDateFormatter($lang, \IntlDateFormatter::LONG, \IntlDateFormatter::LONG);
    $formatter->setPattern($pattern);
    return $formatter->format($datetime);
}

枝-模板:

{{ yourDateTimeObject|foo('en_US', 'd. MMMM Y') }}

结果是" 12。 2014年2月" (或" 12. 2014年2月和#34; de_DE等)

答案 2 :(得分:0)

我真的只想要这一天&要根据区域设置翻译的月份名称并写下此枝条扩展名。它接受正常DateTime->format()参数并转换日期和时间。如果需要,使用strftime()的月份名称。

<?php

namespace AppBundle\Twig\Extension;

use Twig_Extension;
use Twig_SimpleFilter;
use DateTimeZone;
use DateTime;

class LocalizedDateExtension extends Twig_Extension
{
    protected static $conversionMap = [
        'D' => 'a',
        'l' => 'A',
        'M' => 'b',
        'F' => 'B',
    ];

    public function getFilters()
    {
        return [
            new Twig_SimpleFilter('localizeddate', [$this, 'localizeDate']),
        ];
    }

    protected static function createLocalizableTodo(&$formatString)
    {
        $newFormatString = '';
        $todo = [];

        $formatLength = mb_strlen($formatString);
        for ($i = 0; $i < $formatLength; $i++) {
            $char = $formatString[$i];
            if ('\'' === $char) {
                $newFormatString = $formatString[++$i]; //advance and add new character
            }
            if (array_key_exists($char, static::$conversionMap)) {
                $newFormatString.= '\!\L\O\C\A\L\I\Z\E\D\\'; //prefix char
                $todo[$char] = static::$conversionMap[$char];
            }
            $newFormatString.= $char;
        }
        $formatString = $newFormatString;
        return $todo;
    }

    public function localizeDate(DateTime $dateTime, $format, $timezone = null, $locale = null)
    {
        if (null !== $timezone && $dateTime->getTimezone()->getName() !== $timezone) {
            $dateTime = clone $dateTime;
            $dateTime->setTimezone(new DateTimeZone($timezone));
        }

        $todo = static::createLocalizableTodo($format);
        $output = $dateTime->format($format);

        //no localizeable parameters?
        if (0 === count($todo)) {
            return $output;
        }

        if ($locale !== null) {
            $currentLocale = setlocale(LC_TIME, '0');
            setlocale(LC_TIME, $locale);
        }
        if ($timezone !== null) {
            $currentTimezone = date_default_timezone_get();
            date_default_timezone_set($timezone);
        }

        //replace special parameters
        foreach ($todo as $placeholder => $parameter) {
            $output = str_replace('!LOCALIZED'.$placeholder, strftime('%'.$parameter, $dateTime->getTimestamp()), $output);
        }
        unset($parameter);

        if (isset($currentLocale)) {
            setlocale(LC_TIME, $currentLocale);
        }
        if (isset($currentTimezone)) {
            date_default_timezone_set($currentTimezone);
        }

        return $output;
    }
}