是否可以在指定路径上设置翻译默认域?

时间:2019-07-11 14:50:03

标签: translation symfony4

我的网站分为两部分,具有不同语言环境的公共方面正在运行,管理方面仅以一种语言进行翻译。

问题在于,公共端的lang文件与管理端的相同。我想对所有管理路由使用不同的文件

我尝试使用{% trans_default_domain "admin" %}更改域,但是我需要将此行放入所有树枝文件中。我找不到在控制器或其他地方更改域的任何解决方案。

我也尝试对admin使用特定的语言环境,但是找不到翻译,并且'admin'显然不是语言

感谢您的帮助:)

1 个答案:

答案 0 :(得分:1)

我通过替换Translator类找到了一个半解,这篇文章对我有帮助Replacing the Translator service in Symfony 3

此解决方案更改了控制器中所有方法和其中调用的模板(甚至扩展模板和包含)的转换域

我的翻译文件是“ admin.fr.yml”

我在Service文件夹中添加了新的Translator类

<?php


namespace App\Service;


use Symfony\Component\Translation\TranslatorBagInterface;
use Symfony\Component\Translation\TranslatorInterface as LegacyTranslatorInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\Translation\Translator as BaseTranslator;

class Translator implements LegacyTranslatorInterface, TranslatorInterface, TranslatorBagInterface
{
    private $defaultDomain = 'messages';

    private $translator;

    public function __construct(BaseTranslator $translator)
    {
        $this->translator = $translator;
    }

    public function getDefaultDomain(): string
    {
        return $this->defaultDomain;
    }

    public function setDefaultDomain(string $defaultDomain): Translator
    {
        $this->defaultDomain = $defaultDomain;
        return $this;
    }

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

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

    public function getCatalogue($locale = null)
    {
        return $this->translator->getCatalogue($locale);
    }

    public function transChoice($id, $number, array $parameters = [], $domain = null, $locale = null)
    {
        return $this->translator->transChoice($id, $number, $parameters, $domain, $locale);
    }

    public function setLocale($locale)
    {
        return $this->translator->setLocale($locale);
    }

    public function getLocale()
    {
        return $this->translator->getLocale();
    }
}

然后在services.yaml中

App\Service\Translator:
    decorates: translator

然后在我的管理员文件夹中创建一个抽象类BaseAdminController

<?php


namespace App\Controller\Admin;


use App\Service\Translator;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Contracts\Translation\TranslatorInterface;

abstract class BaseAdminController extends AbstractController
{

    /**
     * @var Translator
     */
    protected $translator;

    public function __construct(TranslatorInterface $translator)
    {
        $this->translator = $translator;
        $this->translator->setDefaultDomain('admin');

    }

}

现在在我要进行管理员翻译的每个控制器中,我只需要将“ extends AbstractController ”替换为“ extends BaseAdminController

如果我想定义一个结构,我可以在其中调用父级

public function __construct(Translator $translator, EntityManagerInterface $manager)
{
    $this->manager = $manager;
    parent::__construct($translator);
}