在我的Symfony 2.8项目中,我有一个扩展,为 trans 方法添加了一些额外的逻辑:
namespace MyBundle\Twig\TranslationExtension;
use Symfony\Bundle\FrameworkBundle\Translation\Translator as BaseTranslator;
class TranslationExtension extends BaseTranslator
{
private $currentLocale;
public function trans($id, array $parameters = array(), $domain = null, $locale = null)
{
$translation = parent::trans($id, $parameters, $domain, $locale);
// Some extra logic here
return $translation;
}
public function transChoice($id, $number, array $parameters = array(), $domain = null, $locale = null)
{
return parent::transChoice($id, $number, $parameters, $domain, $locale);
}
}
该课程如下:
(def funcs [(assoc board :a 2)
(assoc board :b 4)
(assoc board :a (inc (get board :a)))])
现在,我正在迁移到Symfony 3,其中不推荐使用这些类参数,但是如何通过覆盖翻译器服务来实现这一点?
答案 0 :(得分:7)
不是扩展,而是装饰translator
服务会更好。现在你覆盖了类名,它还将覆盖其他想要装饰服务的包。我看到你因为Twig而扩展了它,原来的Twig {{ trans() }}
过滤器也将使用装饰服务。
services:
app.decorating_translator:
class: AppBundle\DecoratingTranslator
decorates: translator
arguments: ['@app.decorating_translator.inner'] # original translator
public: false
请参阅此处有关装饰的文档:http://symfony.com/doc/current/service_container/service_decoration.html
答案 1 :(得分:5)
以下是如何在symfony 3中修饰翻译服务并替换所有已翻译字符串中的参数的完整工作示例。
在config中装饰服务:
# app/config/services.yml
app.decorating_translator:
class: AppBundle\Translation\Translator
decorates: translator
arguments:
- '@app.decorating_translator.inner'
# passing custom parameters
- {'%%app_name%%': '%app_name%', '%%PRETTY_ERROR%%': 'This is not nice:'}
public: false
创建新的翻译器,重用原始翻译器并添加在服务配置中定义的参数。唯一的新代码是updateParameters()
方法并调用它:
# AppBundle/Translation/Translator.php
namespace AppBundle\Translation;
use Symfony\Component\Translation\TranslatorBagInterface;
use Symfony\Component\Translation\TranslatorInterface;
class Translator implements TranslatorInterface, TranslatorBagInterface
{
/** @var TranslatorBagInterface|TranslatorInterface */
protected $translator;
/** @var array */
private $parameters;
/**
* @param TranslatorInterface|TranslatorBagInterface $translator
* @param array $parameters
*/
public function __construct($translator, $parameters)
{
$this->translator = $translator;
$this->parameters = $parameters;
}
/**
* @param string $id
* @param array $parameters
* @param null $domain
* @param null $locale
*
* @return string
*/
public function trans($id, array $parameters = [], $domain = null, $locale = null)
{
$parameters = $this->updateParameters($parameters);
return $this->translator->trans($id, $parameters, $domain, $locale);
}
/**
* @param string $id
* @param int $number
* @param array $parameters
* @param null $domain
* @param null $locale
*
* @return string
*/
public function transChoice($id, $number, array $parameters = [], $domain = null, $locale = null)
{
$parameters = $this->updateParameters($parameters);
return $this->translator->transChoice($id, $number, $parameters, $domain, $locale);
}
/**
* @param string $locale
*/
public function setLocale($locale)
{
$this->translator->setLocale($locale);
}
/**
* @return string
*/
public function getLocale()
{
return $this->translator->getLocale();
}
/**
* @param string|null $locale
*
* @return \Symfony\Component\Translation\MessageCatalogueInterface
*/
public function getCatalogue($locale = null)
{
return $this->translator->getCatalogue($locale);
}
/**
* @param array $parameters
*
* @return array
*/
protected function updateParameters($parameters)
{
return array_merge($this->parameters, $parameters);
}
}
现在每次翻译消息%app_config%
都将替换为config中的参数(例如parameters.yml),而%PRETTY_ERROR%
将替换为静态字符串。
如果需要,可以在调用trans:
{{ 'layout.title.home'|trans({'%app_name%': 'Real App No. 1'}) }}
了解服务修饰here
答案 2 :(得分:0)
@Aurelijus Rozenas:
将此添加到您的翻译器中:
public function __call($method, $args)
{
return \call_user_func_array(array($this->translator, $method), $args);
}