Можно ли установить домен перевода по умолчанию по указанному пути? - PullRequest
1 голос
/ 11 июля 2019

Мой сайт состоит из 2 частей, публичная сторона с разными языками работает, админская сторона переведена только на 1 язык.

Проблема в том, что файл lang для публичной стороны такой же, как и для административной. Я хотел бы использовать другой файл для всех маршрутов администратора

Я пытался изменить домен с помощью {% trans_default_domain "admin" %}, но мне нужно поместить эту строку во все мои файлы веток. Я не нашел никакого решения изменить домен в контроллере или в другом месте.

Я также пытался использовать конкретную локаль для администратора, но переводы не найдены, и 'admin' явно не является языком

Спасибо за вашу помощь:)

1 Ответ

1 голос
/ 12 июля 2019

Я нашел половинное решение, заменив класс Translator, этот пост мне помогает Замена службы Translator в 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);
}
...