Мой сайт состоит из 2 частей, публичная часть с разными локалями работает, админка переведена только на 1 язык.
Проблема в том, что файл lang для общедоступной стороны такой же, как и для административной. Я хотел бы использовать другой файл для всех административных маршрутов
Я пытался изменить домен с помощью {% trans_default_domain "admin" %}, но мне нужно поместить эту строку во все мои файлы ветки. Я не нашел решения изменить домен в контроллере или где-либо еще.
Я также пытался использовать определенную локаль для администратора, но переводы не найдены, а «админ» явно не является языком.
Спасибо за вашу помощь :)
Спасибо за ваш быстрый ответ, административная часть не имеет локали в URL-адресе. Буду искать в этом направлении и выложу здесь то, что нашел
Я имел в виду, что вы должен можете установить _locale в routing.yaml, установив defaults._locale на основе префикса пути, но рад, что у вас это работает.





Я нашел половинчатое решение, заменив класс 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');
}
}
Теперь в каждом контроллере, где я хочу переводы администратора, мне просто нужно заменить «расширяет абстрактный контроллер» на «расширяет BaseAdminController».
Если я хочу определить конструкцию, я вызываю в ней родителя
public function __construct(Translator $translator, EntityManagerInterface $manager)
{
$this->manager = $manager;
parent::__construct($translator);
}
Вы должны иметь возможность установить локаль с помощью специальный параметр
_locale, но это будет сильно зависеть от вашей конфигурации маршрутизации, структуры классов и т. д.