这里是完整的工作示例,如何在 symfony 3 中装饰翻译服务并替换所有翻译字符串中的参数。
在配置中装饰服务:
# 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% 将替换为配置中的参数(例如 parameters.yml),%PRETTY_ERROR% 将替换为静态字符串。
如果需要,可以在调用 trans 时覆盖相同的参数:
{{ 'layout.title.home'|trans({'%app_name%': 'Real App No. 1'}) }}
了解服务装饰here