2012-02-13 12 views
7

Czy ktoś może mi powiedzieć, jak zmienić format daty lokalizacji w Symfony2?przełączanie lokalizacji daty

bez względu na to, co się w config (framework.session.default_locale), to zawsze zwraca dni tygodnia w języku angielskim (musiałbym dzień tygodnia w języku niemieckim):

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

kiedy wyjście domyślne ustawienia regionalne zawsze returnes „de” BTW, bez względu na to, co w konfiguracji config.yml

echo \Locale::getDefault() 

DODATKOWE INFORMACJE:

Chcę być w stanie sformatować datę w taki sposób, że zostanie poprawnie wyprowadzony (co oznacza poprawne niemieckie dni powszednie) w moim lokalnym systemie I na serwerze na żywo. Próbowałem tego z strftime, który używa zainstalowanych lokacji systemu i miał z tym poważne kłopoty, ponieważ pakiety ustawień narodowych mają różne schematy nazewnictwa na urządzeniach na żywo i na urządzeniach dev. Nie ma innego SO pytanie o to tutaj: PHP: why is my date formated on the server differently?

+0

Zobacz http://stackoverflow.com/a/23424315/1001110 –

Odpowiedz

3

użyłem takiego kodu do formatowania dat w moim projekcie (trzeba będzie włączyć rozszerzenie intl dla 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)); 
    } 

I działa dobrze dla mnie. Jak stworzyć tupot formatowania można znaleźć w http://userguide.icu-project.org/formatparse/datetime

Ale nie znalazł pomocnika na gałązce, dzięki czemu można tworzyć własne

8

Symfony2 nie przewiduje żadnego formatowania dat w jej rdzeniu.

Wszystko to, aby skonfigurować wartość \Locale::getDefault() przez sniffing sesji i żądania.

Musisz zapewnić dodatkowe usługi do obsługi formatowania lokalnego, takie jak SonataIntlBundle.

Ten pakiet dodaje kilka rozszerzeń do filtrów gałązkowych i udostępnia pomocników, których można używać w dowolnym miejscu.

Po aktywacji można z nich korzystać w swoich szablonach na przykład:

{{ my_date|format_datetime }} 

Inne informacje tutaj: https://github.com/sonata-project/SonataIntlBundle/blob/master/Resources/doc/reference/datetime.rst

+2

Dzięki za wskazanie, że nie ma Bezobsługowe funkcje Symfony. Ale musi istnieć jakiś sposób, aby uruchomić to przy użyciu Intl. Spojrzałem na kod SonataIntlBundle, ale go nie rozumiem. Czuję się jak na Marsie. Naprawdę jestem jedyną osobą, która ma ten problem? – stoefln

+0

Wiele rzeczy z sonaty może sprawić, że myślisz, że jesteś na Marsie :) Ale wiele części kodu związanego z symfony jest takie :) Oczywiście możesz po prostu użyć klas Intl * bezpośrednio i skonfigurować je za pomocą $ session-> getLocale() lub cokolwiek. – Florian

+0

Teraz mam, brakowało mi jakiejś wartościowej wartości: ustawienia regionalne użytkownika są ustawione na logowanie, więc zmiana konfiguracji nie ma żadnego wpływu, dopóki użytkownik się nie wyloguje i nie wznowi. Dzięki! – stoefln

1

Bardziej prostym sposobem jest przechowywanie formatów w plikach tłumaczeniowych, tak:

w pliku "wiadomości PL .yml.".

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

W „wiadomości fr .yml”file:

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

Następnie w pliku gałązka, można to zrobić:

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

Więc data zostanie automatycznie w odpowiednim formacie, przy użyciu bieżącego ustawienia regionalne.

+0

To jest najłatwiejszy sposób IMO. Daje ci to możliwość definiowania formatów takich jak długie, krótkie itp. I po prostu użyj ich bez żadnych dodatkowych pakietów. –

+0

Jedyny problem polega na tym, że nazwy dni i miesięcy nie są tłumaczone. –

2

prostu dodać rozszerzenie gałązka w config.yml

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

W szablonie gałązka Syntaxe: {{MyDate | localizeddate ("sizeDate", "sizeHour", "locale"}} myDate: musi być obiektem DateTime sizeDate: może być żadnym/krótkim/średnim/długim/pełnym sizeHour: może być żadnym/krótkim/średnim/długim/pełny locale: opcja domyślnie język sesja będzie stosowanie ale można wymusić jeden wypróbujemy inny wartość lokalizacji

{{ 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) 
--> 

Jeśli pojawi się błąd „Proszę zainstalować«intl»rozszerzenie na pełnych możliwości lokalizacyjnych

zainstaluj pakiet php5-intl np. Na serwerze Debiana, co mmand będą: apt-get install php5-INTL

nie zapomnij, aby wyczyścić pamięć podręczną;)