是否可以在指定路径上设置翻译默认域?
Is it possible to set translation default domain on a specified path?
我的网站分为 2 个部分,public 不同语言环境的部分正在运行,管理部分仅翻译成一种语言。
问题是 public 端的 lang 文件与管理员端相同。我想为所有管理路由使用不同的文件
我试图用 {% trans_default_domain "admin" %}
更改域,但我需要将这一行放在我所有的 twig 文件中。我没有找到任何解决方案来更改控制器或其他地方的域。
我也尝试过为管理员使用特定的语言环境,但找不到翻译,'admin' 显然不是一种语言
感谢您的帮助:)
我通过替换翻译器 class 找到了 half-solution,这个 post 对我有帮助
此解决方案为控制器中的所有方法和其中调用的模板(甚至是扩展模板和包含)更改了翻译域
我的翻译文件是 'admin.fr.yml'
我在服务文件夹中添加了我的新翻译器class
<?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
然后在我的管理控制器文件夹中创建了一个摘要 class 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);
}
我的网站分为 2 个部分,public 不同语言环境的部分正在运行,管理部分仅翻译成一种语言。
问题是 public 端的 lang 文件与管理员端相同。我想为所有管理路由使用不同的文件
我试图用 {% trans_default_domain "admin" %}
更改域,但我需要将这一行放在我所有的 twig 文件中。我没有找到任何解决方案来更改控制器或其他地方的域。
我也尝试过为管理员使用特定的语言环境,但找不到翻译,'admin' 显然不是一种语言
感谢您的帮助:)
我通过替换翻译器 class 找到了 half-solution,这个 post 对我有帮助
此解决方案为控制器中的所有方法和其中调用的模板(甚至是扩展模板和包含)更改了翻译域
我的翻译文件是 'admin.fr.yml'
我在服务文件夹中添加了我的新翻译器class
<?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
然后在我的管理控制器文件夹中创建了一个摘要 class 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);
}