Может быть, кому-то понадобится мое решение, потому что я думаю, что писать скучно
{{ message|trans(arguments = [], domain = null, locale = null) }}
Для каждого перевода.
Во-первых, я создал службу, чтобы проверить, переводится ли дляДоступен данный языковой стандарт:
use Symfony\Component\HttpKernel\KernelInterface;
class LocaleChecker
{
const TRANSLATE_FILE_PATTERN = 'mail.%s.yml';
/**
* @var KernelInterface
*/
private $storage;
public function __construct(KernelInterface $kernel)
{
$this->storage = $kernel;
}
/**
* @param string $locale
*
* @return bool
*/
public function isLocaleExist(string $locale)
{
$filename = sprintf(self::TRANSLATE_FILE_PATTERN, $locale);
$path = sprintf('%s%s', $this->storage->getTranslationsDir(), $filename);
return file_exists($path);
}
}
Затем я создал расширение ветки, чтобы выполнить эту работу за меня:
<?
use FrontBundle\Service\Translate\LocaleChecker;
use Symfony\Component\Translation\TranslatorInterface;
class FallbackEnglishExtension extends \Twig_Extension
{
/**
* @var LocaleChecker
*/
private $localeChecker;
/**
* @var TranslatorInterface
*/
private $translator;
public function __construct(LocaleChecker $localeChecker, TranslatorInterface $translator)
{
$this->localeChecker = $localeChecker;
$this->translator = $translator;
}
public function getFilters()
{
return [
new \Twig_Filter('trans_mail', [$this, 'translate']),
];
}
/**
* @param string $translateKey
* @param string $locale
*
* @return string
*/
public function translate(string $translateKey, string $locale = 'en_EN')
{
if ($this->localeChecker->isLocaleExist($locale)) {
return $this->translator->trans($translateKey, [], 'mail', $locale);
}
return $this->translator->trans($translateKey, [], 'mail', $locale);
}
}