2012-02-13 2 views
7

Может ли кто-нибудь сказать мне, как изменить формат даты в Symfony2?переключение даты локализации

независимо от того, что я установить в конфигурации (framework.session.default_locale), это всегда возвращается дни недели на английском языке (я должен был бы день недели на немецком языке):

$start->format("D d.m.Y"); 

когда выходной язык по умолчанию он всегда returnes «де» BTW, независимо от того, что я настройки в config.yml

echo \Locale::getDefault() 

ДОПОЛНИТЕЛЬНО:

Я хочу, чтобы иметь возможность форматировать дату таким образом, что это выводится правильно (что означает правильные выходные дни в Германии) в моей локальной системе И на реальном сервере. Пробовал это с помощью strftime, который использует установленные локали системы и имел с ней реальные проблемы, поскольку в пакетах локали есть разные схемы именования на живых и dev машинах. Существует еще один вопрос по этому вопросу: PHP: why is my date formated on the server differently?

+0

См http://stackoverflow.com/a/23424315/1001110 –

ответ

3

Я использовал такой код для форматирования даты в моем проекте (Вам нужно будет включить intl extension for php):

<?php 
    class DefaultController extends Controller { 
     public function indexAction() { 
      $date = new \DateTime("now"); 
      $formatter = new \IntlDateFormatter(\Locale::getDefault(), \IntlDateFormatter::NONE, \IntlDateFormatter::NONE); 
      $formatter->setPattern("EEEE Y-M-d"); 
      return array('locale' => \Locale::getDefault(), "intl" => $formatter->format($date)); 
    } 

И он отлично работает для меня. Как создать форматирование скороговорки вы можете найти на http://userguide.icu-project.org/formatparse/datetime

Но я не нашел помощник для веточки, так что вы можете создать свой собственный

8

Symfony2 не содержит форматов даты в своем ядре.

Все, что он делает, это сконфигурировать значение \Locale::getDefault(), используя sniffing session и request.

Вы должны предоставить некоторые дополнительные услуги для обработки форматирования по языку, например, SonataIntlBundle.

Этот комплект добавляет некоторые фильтры ветви в расширение и предоставляет некоторые помощники, которые можно использовать в любом месте.

После активации, вы можете использовать их в шаблонах, например:

{{ my_date|format_datetime }} 

Больше информации здесь: https://github.com/sonata-project/SonataIntlBundle/blob/master/Resources/doc/reference/datetime.rst

+2

Спасибо за не отметить, что не существует Функциональность Symfony-out-of-box для этого. Но должен быть какой-то способ добиться этого, используя Intl. Я посмотрел на код SonataIntlBundle, но я этого не понимаю. Я чувствую себя на Марсе, я действительно единственный человек, у которого эта проблема? – stoefln

+0

Многие вещи из сонаты могут заставить вас думать, что вы на Марсе :) Но многие части кода, связанного с symfony, похожи на это :) Конечно, вы могли бы просто напрямую использовать классы Intl * и настроить их с помощью $ session-> getLocale() или что угодно. – Florian

+0

Теперь я понял, что для меня была какая-то полезная информация: локали пользователей устанавливаются при входе в систему, поэтому изменение конфигурации не имеет никакого эффекта до тех пор, пока пользователь не выйдет из системы и не зайдет снова. Благодаря! – stoefln

1

Более простой способ для хранения форматов в файлах перевод, как это:

В файле "сообщения ан .yml.":.

date.format: m/d/Y 
time.format: g:i A 

В «сообщениях фр .yml»Файл:

date.format: d/m/Y 
time.format: H:i 

Затем в файле веточку, вы можете сделать это:

{{ my_date|date('date.format'|trans) }} 

Так дата будет автоматически в нужном формате, используя текущую локаль.

+0

Это самый простой способ ИМО. И это дает вам возможность определять форматы, такие как long, short и т. Д. И просто использовать их без каких-либо дополнительных пакетов. –

+0

Единственная проблема заключается в том, что имена дней и месяцев не переводятся. –

2

просто добавить расширение прут в вашем config.yml

services: 
    twig.extension.intl: 
     class: Twig_Extensions_Extension_Intl 
     tags: 
      - { name: twig.extension } 

В шаблоне прут Syntaxe: {{MyDate | localizeddate ('sizeDate', 'sizeHour', 'locale'}} myDate: должен быть объект DateTime sizeDate: может быть none/short/medium/long/full sizeHour: может быть none/short/medium/long/полный локали: опционально, по умолчанию язык сессия будет использовать, но вы можете заставить одну diffrent значение локали

{{ myDate | localizeddate('full', 'none') }} ({{ myDate | localizeddate('none', 'short') }}) 
<!-- 
locale "fr" : vendredi 21 décembre 2012 (13:37) 
locale "en : Friday, December 21, 2012 (13:37 PM) 
--> 

Если вы получите сообщение об ошибке «Пожалуйста, установите расширение„Интерн“для полных возможностей локализации»

установить пакет php5-intl например, на сервере Debian co mmand будет: APT-получить установку php5-INTL

Не забудьте очистить кэш;)

Смежные вопросы