2015-01-23 5 views
4

Мне нужно переоценить стандартный Twig trans фильтр для моих специальных целей, например. Я хочу получить мои переводы из пользовательского хранилища. Поэтому я не знаю, что мне нужно делать. Я пытаюсь выяснить в docs. Но о переводах нет. Я нашел Symfony\Bridge\Twig\Extension\TranslationExtension класс, и я думаю, может быть, мне нужно только переоценить этот класс? Благодаря!Пользовательский транс-фильтр в Twig and Symfony2

+1

Лучше всего создать пользовательский загрузчик, а не переопределять фильтр 'trans'. Ниже приведен пример создания для загрузки из БД - http://blog.elendev.com/development/php/symfony/use-a-database-as-translation-provider-in-symfony-2/ - который вы можете расширить его, чтобы соответствовать вашим целям. – qooplmao

+0

Взгляните на http://symfony.com/doc/current/components/translation/custom_formats.html#creating-a-custom-loader. Вы можете использовать существующие загрузчики и добавлять ресурсы из своего пользовательского хранилища. – Holger

+0

@ Хольджер, да, я уже создаю свой пользовательский загрузчик, но я не знаю, как использовать только мой загрузчик, emmm, сначала я загружаю все переводы с помощью базовых загрузчиков, а затем помещаю их в свое пользовательское хранилище, и я хочу, чтобы trans поиск перевода в моем хранилище. – nowiko

ответ

1

Компонент Translates Symfony в основном переопределяет фильтр трансфокатора по умолчанию Twig. Компонент является частью основного фреймворка и не может быть отключен.

Вы можете, тем не менее, сделать то же самое и переустановить транс-фильтр с помощью собственного удлинителя Twig.

Просто создайте расширение Twig, как описано здесь: http://symfony.com/doc/current/cookbook/templating/twig_extension.html

Если добавить транс фильтра, он перекроет код компонента переводческого.

2

Просто, чтобы расширить свой ответ на @ Webberig выше, в Symphony v3.0.4 и Twig v1.24.0, то, как вы определяете свою услугу, кажется важным.

Я хотел бы добавить резервную копию домена к фильтру по умолчанию(), но не смог понять, как переопределить фильтр по умолчанию. Я, наконец, удалось так:

В приложение/Config/services.yml

# This is important!! Use this exact service ID (twig.extension.trans) 
twig.extension.trans: 
    class: AppBundle\Twig\AppTranslationExtension 
    public: false 
    arguments: ['@translator'] 
    tags: 
    - { name: twig.extension } 

И вот что в основном это сделал для меня, используя тот же самый точный идентификатор службы в моей конфигурации.

В остальном я просто переопределил метод транс-фильтра. Здесь для заинтересованных:

namespace AppBundle\Twig; 

use Symfony\Bridge\Twig\Extension\TranslationExtension; 
use Symfony\Component\Translation\TranslatorInterface; 

class AppTranslationExtension extends TranslationExtension 
{ 
    public function __construct(
      TranslatorInterface $translator, 
      \Twig_NodeVisitorInterface $translationNodeVisitor = null) 
    { 
     parent::__construct($translator, $translationNodeVisitor); 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function getFilters() 
    { 
     return array(
      new \Twig_SimpleFilter('trans', array($this, 'trans')), 
     ); 
    } 

    public function trans($id, array $parameters = array(), $domain = null, $locale = null) 
    { 
     if (null === $locale) { 
      $locale = $this->getTranslator()->getLocale(); 
     } 

     if (null === $domain) { 
      $domain = 'messages'; 
     } 

     if ('messages' !== $domain 
     && false === $this->translationExists($id, $domain, $locale)) { 
      $domain = 'messages'; 
     } 

     return $this->getTranslator()->trans($id, $parameters, $domain, $locale); 
    } 

    protected function translationExists($id, $domain, $locale) 
    { 
     return $this->getTranslator()->getCatalogue($locale)->has((string) $id, $domain); 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function getName() 
    { 
     return 'app_translator'; 
    } 
} 
+0

Спасибо за отзыв – nowiko

+0

Отлично! Спасибо, что поделились своим кодом. – Roubi