Пользовательский транс-фильтр в Twig и Symfony2

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

4

Решение

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

Однако вы можете сделать то же самое и переопределить фильтр trans с вашим собственным расширением Twig.

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

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

2

Другие решения

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

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

В app / 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 }

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

В остальном я просто переопределил метод trans filter. Вот для тех, кто заинтересован:

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';
}
}
2

Чтобы уточнить после @Webberig, вы можете определить свое собственное расширение перевода, не переопределяя оригинальное расширение (что IMO плохо, потому что вы должны поддерживать хотя бы сигнатуру конструктора) и просто использовать оригинальное расширение как внутренний обслуживание и доступ к оригиналу trans() функция-член, которая должна быть всегда public по определению…

# config/services.yaml
...
App\Twig\TranslationExtension:
arguments: ['@twig.extension.trans']
tags:
- { name: twig.extension, priority: 100 }
...
// src\Twig\TranslationExtension.php
namespace App\Twig;

use Symfony\Bridge\Twig\Extension\TranslationExtension as BaseTranslationExtension;
use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;

class TranslationExtension extends AbstractExtension
{
/**
* @var BaseTranslationExtension
*/
protected $inner;
public function __construct(BaseTranslationExtension $inner)
{
$this->inner = $inner;
}

public function getFilters()
{
return [
new TwigFilter('trans', [$this, 'trans']),
];
}

public function trans($message, array $arguments = [], $domain = null, $locale = null, $count = null)
{
// do ugly stuff

return $this->inner->trans($message, $arguments, $domain, $locale, $count);
}
}

(используется против SF4.2)

0
По вопросам рекламы [email protected]