2016-01-02 13 views
9

Używam rozszerzenia daty Twig, aby uzyskać działającego time_diff.Twig date_diff translation

{{ photo.getCreationDate|time_diff }} 

Chcę, aby było wielojęzyczne. Czytałem dokumentację, to mówi

To get a translatable output, give a Symfony\Component\Translation\TranslatorInterface as constructor argument. The returned string is formatted as diff.ago.XXX or diff.in.XXX where XXX can be any valid unit: second, minute, hour, day, month, year.

Nie jestem pewien, jak to zrobić, ale wydaje się, że to nie działa dla mnie.

To jest tak, jak próbowałem w moim kontrolerze.

$ twig = new Twig_Environment (new TranslatorInterface()); $ twig-> addExtension (new Twig_Extensions_Extension_Date());

jestem coraz następny błąd

Error: Cannot instantiate interface Symfony\Component\Translation\TranslatorInterface

Twig_Environment konstruktor czeka obiektu Twig_LoaderInterface, nie TranslatorInterface.

Jak to zrobić, aby umożliwić przetłumaczenie danych wyjściowych time_diff?

Dzięki

Odpowiedz

16

Co czytasz jest dokumentacja Gałązka, a nie Symfony2, nawet jeśli oba są wykonane przez SensioLabs.

Jeśli używasz Symfony ram full-komin, Symfony \ Komponent \ Translation \ TranslatorInterfacejest już zdefiniowany jako argument konstruktora swojego rozszerzenia patyk.

Aby upewnić się, spojrzeć na plik znajduje się na \ vendor \ gałązka \ rozszerzeń \ lib \ Gałązka \ Extensions \ Extension \ date.php

Powinieneś zobaczyć coś takiego:

*\vendor\twig\extensions\lib\Twig\Extensions\Extension\date.php* 

<?php 

/** 
* This file is part of Twig. 
* 
* (c) 2014 Fabien Potencier 
* 
* For the full copyright and license information, please view the LICENSE 
* file that was distributed with this source code. 
*/ 
use Symfony\Component\Translation\TranslatorInterface; 

/** 
* @author Robin van der Vleuten <[email protected]> 
*/ 
class Twig_Extensions_Extension_Date extends Twig_Extension 
{ 
    public static $units = array(
     'y' => 'year', 
     'm' => 'month', 
     'd' => 'day', 
     'h' => 'hour', 
     'i' => 'minute', 
     's' => 'second', 
    ); 

    /** 
    * @var TranslatorInterface 
    */ 
    private $translator; 

    /** 
    * Constructor. 
    * 
    * @param TranslatorInterface $translator A TranslatorInterface instance. 
    */ 
    public function __construct(TranslatorInterface $translator = null) 
    { 
     $this->translator = $translator; 
    } 

// etc. 

Jeśli to jest to, co masz po swojej stronie, to musisz teraz dokonać tłumaczenia.

Symfony2 nie jest dostarczana z gotowym plikiem przetłumaczonym, w zależności od ustawień użytkownika, musisz to zrobić (lub znaleźć osobę, która już to zrobiła i jest OK, aby udostępnić ją ty).

Najpierw dodaj ten argument gałązka Extension w services.yml:

*services.yml* 

twig.extension.date: 
    class: Twig_Extensions_Extension_Date 
    arguments: ["@translator"] // careful of quotes 
    tags: 
     - { name: twig.extension } 

Następnie utwórz "date.fr.xliff" w miejscu \ app \ Resources \ tłumaczenia. Dostosuj lokalizację, jeśli pracujesz w Pakiecie własnym, tzn. Innym od AppBundle. Oczywiście, w zależności od języka, którego szukasz, dostosuj "fr" (np. "De", "es" ...). Dlaczego rozszerzenie ".xliff"? Oczywiście możesz na przykład utworzyć plik ".yml". Ale użycie ".xliff" pozwala ci wykorzystać to, co proponuję ci dalej.

Następnie, jeśli będę kontynuować z francuskim przykładem tłumaczenia, otwórz "date.fr.wliff”pliku i kopiuj/wklej translation provided by the KnpTimeBundle.

Nie zapomnij wyczyścić pamięć podręczną dev jeśli trzeba.

Jeśli szukasz tłumaczenia, które odbędzie się w szablonie gałązka, tylko użyć filtru bez zmieniania czegokolwiek (nie starają się dodać drugi filtr „| trans”):

{{ user.createdAt|time_diff }} 

oczywiście zastąpić „user.createdAt” przez co trzeba tam

przypadku. chcesz, po prostu zaimplementuj K npTimeBundle w aplikacji, aby zrobić to wszystko dla ciebie. W przeciwnym razie, możesz kopiować/wklejać pliki tłumaczeń dostarczone przez KnpTimeBundle dla ogromnej ilości różnych języków, po prostu zadbaj o zastąpienie ich nazwy pliku "time.fr.xliff" słowem "date.fr.xliff" , który jest potrzebny przez rozszerzenie Twig dostępne w pakiecie Symfony2.

+1

Jeszcze jeden krok: musisz odkomentować tę linię w config.yml: 'translator: {fallbacks: ["% locale% "]}' –

+0

Pomogło mi to. Dziękujemy za przesłanie odpowiedzi –