2016-01-02 25 views
9

Çalışma time_diff almak için Twig Date uzantısını kullanıyorum.Twig date_diff translation

{{ photo.getCreationDate|time_diff }} 

Çok dilli hale getirmek istiyorum. Ben dokümanlar okudum, bu

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.

Im bunu nasıl emin değilim diyor, ama bu benim için doesnt iş gibi görünüyor.

Denetleyicide denediğim gibi.

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

sonraki hatayı alıyorum

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

Twig_Environment yapıcı Twig_LoaderInterface nesnesi değil, TranslatorInterface bekliyor.

Time_diff çıktısını çevirmeme izin vermek için nasıl yapılmalı?

Teşekkür

cevap

16

Ne okumak Symfony2'nin en, hem SensioLabs tarafından yapılır olmasa bile Twig dokümantasyon vardır. Eğer Symfony'nin tam yığın çerçevesini kullanırsanız

, Symfony \ Component \ Tercüme \ TranslatorInterfacezaten Twig uzantının bir yapıcı argüman olarak tanımlanır. Emin olmak için

, satıcı \ dal \ uzantıları \ bulunan dosyanın bir göz \ lib \ Twig \ Extensions \ Uzatma \ date.php

Böyle bir şey görmeniz gerekir:

*\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. 

Bu sizin tarafınızda sahip olduğunuz şey ise, şimdi yapmanız gereken şey çeviri.

Symfony2 bunun için hazır-çevrilmiş-dosyaya bağlı olarak-kendi-in-kendi-yerel ile gelmiyor, bunu yapmak zorundasınız (ya da bunu zaten yapmış birisini bulmak ve OK ile paylaşmak için sen).

İlk olarak, services.yml yılında Twig Uzantısı'na bu argümanı ekleyin:

*services.yml* 

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

oluşturmak bir konuma \ app \ Resources içinde "date.fr.xliff" \ çeviriler. Kendi Bundle’nizde çalışıyorsanız, yani AppBundle’dan farklı olarak konumu uyarlayın. Elbette, aradığınız dile bağlı olarak, "fr" ("de", "es" ... gibi) uyarlayın. Neden ".xliff" uzantısı? Elbette, örneğin bir ".yml" dosyası oluşturabilirsiniz. Ancak ".xliff" i kullanarak, size önerdiğim avantajdan faydalanabilirsiniz.

Sonra, Fransızca çeviri örneğini kullanmaya devam edersem, "date.fr.dosya ve kopya "wliff/ translation provided by the KnpTimeBundle yapıştırın. Eğer gerekirse

dev önbelleği temizlemek için unutmayın.

Bir Twig şablonunda gerçekleşecek çeviri için arıyorsanız, sadece ("| trans" ikinci filtre eklemek kalkmayın) hiçbir şey değiştirmeden filtre kullanın: elbette

{{ user.createdAt|time_diff }} 

, orada gerekenler tarafından "user.createdAt" yerine

edin. istiyorsun, sadece K uygulamak npTimeBundle sizin için tüm bunları yapmak için uygulamanızda. Aksi takdirde, KnpTimeBundle tarafından sağlanan çeviri dosyalarını farklı diller için kopyalamanız/yapıştırmanız yeterlidir. Sadece "date.fr.xliff" dosya adlarını "date.fr.xliff" ile değiştirmeye özen gösterin. Symfony2 paketinde bulunan Twig Extension tarafından gerekli olan.

+1

Bir adım daha: config.yml: 'çevirmen: {fallbacks: ["% locale% "]}' –

+0

Bu satırı uncomment gerekir Bu bana yardımcı oldu. Cevabı gönderdiğiniz için teşekkürler –