symfony 如何读取 php-translation 的语言环境
How symfony read locale for php-translation
我想在我的 Symfony 4 项目中使用 php-translation/symfony-bundle。
我已经关注了configuration step。
translation:
locales: ["fr", "en", "de", "nl"]
configs:
applicationName:
dirs: ['%kernel.project_dir%/templates', '%kernel.project_dir%/src']
output_dir: '%kernel.project_dir%/translations'
excluded_names: ['*TestCase.php', '*Test.php']
excluded_dirs: [cache, data, logs]
remote_storage: ['php_translation.adapter.loco']
但是我遇到了一个问题。当我想翻译成语言时,如果我不指定语言环境,它就不起作用。
$trans = $translator->trans('portal.no_access', [], 'portal', $request->getLocale());
$transWithoutLocale = $translator->trans('portal.no_access', [], 'portal');
var_dump($trans); ==> return 'string translated'
var_dump($transWithoutLocale); ==> return 'string in default locale format' ( fr )
var_dump($request->getLocale()); ==> return 'de'
如何强制 translator
使用像 symfony recommend it
这样的请求语言环境
因为翻译器没有像@yivi 所说的那样读取请求语言环境,而且我不想将请求语言环境提供给我对 trans
的所有调用。我添加了一个 Listener
来监听所有 KernelEvents::REQUEST
并将 locale
设置为 Translator
:
class LocaleListener implements EventSubscriberInterface
{
/** @var TranslatorInterface */
private $translator;
/**
* LocaleListener constructor.
*/
public function __construct(TranslatorInterface $translator)
{
$this->translator = $translator;
}
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents(): array
{
return [
KernelEvents::REQUEST => ['onKernelRequest', 10],
];
}
public function onKernelRequest(RequestEvent $event): void
{
$request = $event->getRequest();
if (\method_exists($this->translator, 'setLocale')) {
$this->translator->setLocale($request->getLocale());
}
}
}
我想在我的 Symfony 4 项目中使用 php-translation/symfony-bundle。
我已经关注了configuration step。
translation:
locales: ["fr", "en", "de", "nl"]
configs:
applicationName:
dirs: ['%kernel.project_dir%/templates', '%kernel.project_dir%/src']
output_dir: '%kernel.project_dir%/translations'
excluded_names: ['*TestCase.php', '*Test.php']
excluded_dirs: [cache, data, logs]
remote_storage: ['php_translation.adapter.loco']
但是我遇到了一个问题。当我想翻译成语言时,如果我不指定语言环境,它就不起作用。
$trans = $translator->trans('portal.no_access', [], 'portal', $request->getLocale());
$transWithoutLocale = $translator->trans('portal.no_access', [], 'portal');
var_dump($trans); ==> return 'string translated'
var_dump($transWithoutLocale); ==> return 'string in default locale format' ( fr )
var_dump($request->getLocale()); ==> return 'de'
如何强制 translator
使用像 symfony recommend it
因为翻译器没有像@yivi 所说的那样读取请求语言环境,而且我不想将请求语言环境提供给我对 trans
的所有调用。我添加了一个 Listener
来监听所有 KernelEvents::REQUEST
并将 locale
设置为 Translator
:
class LocaleListener implements EventSubscriberInterface
{
/** @var TranslatorInterface */
private $translator;
/**
* LocaleListener constructor.
*/
public function __construct(TranslatorInterface $translator)
{
$this->translator = $translator;
}
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents(): array
{
return [
KernelEvents::REQUEST => ['onKernelRequest', 10],
];
}
public function onKernelRequest(RequestEvent $event): void
{
$request = $event->getRequest();
if (\method_exists($this->translator, 'setLocale')) {
$this->translator->setLocale($request->getLocale());
}
}
}