Php symfony2:如何进行参数本地化,使我们可以有两种语言?
在我的symfony2应用程序中,我设置了JMSI18nRoutingBundle: 我有以下配置:Php symfony2:如何进行参数本地化,使我们可以有两种语言?,php,symfony,internationalization,twig,locale,Php,Symfony,Internationalization,Twig,Locale,在我的symfony2应用程序中,我设置了JMSI18nRoutingBundle: 我有以下配置: jms_i18n_routing: default_locale: fr locales: [fr, en] strategy: prefix_except_default 我已设置控制器操作以更改区域设置: /** * @Route("/public/change_locale/{locale}", name="change_locale", requiremen
jms_i18n_routing:
default_locale: fr
locales: [fr, en]
strategy: prefix_except_default
我已设置控制器操作以更改区域设置:
/**
* @Route("/public/change_locale/{locale}", name="change_locale", requirements={"locale" = "fr|en"})
* @Template(":Core/Admin:test.html.twig")
* @param Request $request
* @param string $locale
* @return array
*/
public function changeLocaleAction(Request $request, $locale)
{
$request->setLocale($locale);
$this->get('session')->set('_locale', $locale);
return $this->redirectToRoute('home');
}
我发现该区域设置没有在会话中持久化。出于一个我不理解的原因,在细枝中生成路由时,不会自动使用区域设置。
因此,我来构建一个侦听器,以将区域设置重新分配给请求和会话,但仍然无法正常工作,我不能简单地将区域设置从“fr”更改为“en”,并将布局点的所有路由更改为包含“en”区域设置参数的路由
在实现这个捆绑包的过程中,我遗漏了什么
我的听众:
<?php
namespace AppBundle\EventListener;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\HttpKernelInterface;
class LocaleListener
{
private $container;
public function __construct(ContainerInterface $container)
{
$this->container = $container;
}
public function setLocale(GetResponseEvent $event)
{
if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
return;
}
$request = $event->getRequest();
if (!$request->hasPreviousSession()) {
$request->setLocale($request->getPreferredLanguage($this->container->getParameter('jms_i18n_routing.locales')));
return;
}
// on essaie de voir si la locale a été fixée dans le paramètre de routing _locale
if ($locale = $request->attributes->get('_locale')) {
$request->getSession()->set('_locale', $locale);
$request->setLocale($locale);
} else {
// si aucune locale n'a été fixée explicitement dans la requête, on utilise celle de la session
$request->setLocale($request->getSession()->get('_locale', $this->container->getParameter('jms_i18n_routing.default_locale')));
}
}
}
我上次编辑的路径是正确的:请求上下文参数\u locale也必须定义:
我的听众变成:
<?php
namespace AppBundle\EventListener;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\Routing\RequestContext;
class LocaleListener
{
/**
* @var RequestContext
*/
private $context;
private $locales;
private $defautLocales;
public function __construct(RequestContext $context, $locales, $defautLocales)
{
$this->context = $context;
$this->locales = $locales;
$this->defautLocales = $defautLocales;
}
public function setLocale(GetResponseEvent $event)
{
$request = $event->getRequest();
if (!$request->hasPreviousSession()) {
$request->setLocale($request->getPreferredLanguage($this->locales));
return;
}
// on essaie de voir si la locale a été fixée dans le paramètre de routing _locale
if ($locale = $request->attributes->get('_locale')) {
$request->getSession()->set('_locale', $locale);
} else {
// si aucune locale n'a été fixée explicitement dans la requête, on utilise celle de la session
$locale = $request->getSession()->get('_locale', $this->defautLocales);
}
$request->setLocale($locale);
$this->context->setParameter('_locale', $locale);
}
}
我上次编辑的路径是正确的:请求上下文参数\u locale也必须定义:
我的听众变成:
<?php
namespace AppBundle\EventListener;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\Routing\RequestContext;
class LocaleListener
{
/**
* @var RequestContext
*/
private $context;
private $locales;
private $defautLocales;
public function __construct(RequestContext $context, $locales, $defautLocales)
{
$this->context = $context;
$this->locales = $locales;
$this->defautLocales = $defautLocales;
}
public function setLocale(GetResponseEvent $event)
{
$request = $event->getRequest();
if (!$request->hasPreviousSession()) {
$request->setLocale($request->getPreferredLanguage($this->locales));
return;
}
// on essaie de voir si la locale a été fixée dans le paramètre de routing _locale
if ($locale = $request->attributes->get('_locale')) {
$request->getSession()->set('_locale', $locale);
} else {
// si aucune locale n'a été fixée explicitement dans la requête, on utilise celle de la session
$locale = $request->getSession()->get('_locale', $this->defautLocales);
}
$request->setLocale($locale);
$this->context->setParameter('_locale', $locale);
}
}