樹枝日期格式化樹枝的日期,你通常使用這樣的:本地化使用的Symfony 2
{{ meeting.date|date("m/d/Y") }}
現在,我必須本地化此日期(美國M/d/Y,NL d/M/Y)。在樹枝上做這件事最好的做法是什麼?我確實使用Symfony 2,解決方法是在控制器中進行翻譯,但我想在樹枝中做這個。
樹枝日期格式化樹枝的日期,你通常使用這樣的:本地化使用的Symfony 2
{{ meeting.date|date("m/d/Y") }}
現在,我必須本地化此日期(美國M/d/Y,NL d/M/Y)。在樹枝上做這件事最好的做法是什麼?我確實使用Symfony 2,解決方法是在控制器中進行翻譯,但我想在樹枝中做這個。
偉大的建議。請不要忘記註冊Intl擴展,如下所述:http://nerdpress.org/2011/10/19/symfony-2-twig-enabling-native-twig-extensions/(該頁面說明如何安裝調試擴展,但安裝Intl發生類似) – Martijn 2013-05-20 19:11:53
這應該是公認的答案。有關如何使用Intl擴展的更多信息,請參閱[我的另一個問題的答案](http://stackoverflow.com/a/23424315/1001110)。 – 2014-05-07 07:06:01
有一個很大的問題,在關於此過濾器的樹枝文檔中,沒有提及如何安裝它! – SaidbakR 2014-07-10 23:19:03
我不想安裝一個整體的擴展只是這個東西,需要自動做幾件事情:它也可以寫一個助手類(或擴大現有的輔助)的捆綁/枝條/擴展例如是這樣的:
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 Februar 2014’在de_DE這個等)
我真的在尋找應用程序範圍內的東西,不僅Twig,這有幫助,謝謝! – 2017-02-06 18:28:42
不客氣!感謝您的積極反饋:) – Franziska 2017-02-07 20:05:11
我真的只是想一天&月份名稱根據語言進行翻譯,寫了這枝的延伸。它接受正常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;
}
}
的【如何呈現一根樹枝模板DateTime對象]
可能重複(http://stackoverflow.com/questions/8318914/how-to-render- a-datetime-object-in-a-twig-template) – 2014-05-07 07:04:37
要用sf2做到這一點,有一個包:https://github.com/sonata-project/SonataIntlBundle – 2012-02-28 13:12:05
@YohanG。,提供的包不會改變'| date'過濾器的行爲。它定義了新的過濾器,這是不需要的行爲關於OP問題 – Trix 2017-03-13 08:56:06