我創建了一個控制器,根據加密的GET參數手動設置安全令牌。我用它來創建一個遠程登錄URL,當用戶關注這個鏈接時,它將執行登錄。通過GET參數在Symfony中設置語言環境
現在我想添加語言環境的設置。當提供Lang參數時,它應該設置語言環境。我把它添加到我的控制器中:
$lang = strtolower($lang);
$this->getRequest()->getSession()->set('_locale', $lang);
$this->getRequest()->setLocale($lang);
$this->container->get('translator')->setLocale($lang);
根據開發欄將_locale變量設置爲設置。語言文件雖然沒有加載,但它回落到默認語言。
我讀過關於創建一個Listener來實現這一點,但在我看來,當你想在URL中提供語言時,這是有用的。我不想將這添加到我的路由中,我只是想在創建會話時設置語言環境。
UPDATE:
我去了 'simulate old beheaviour' 的解決方案,如Symfony的提供。設置請求區域設置似乎不起作用。當我在我的Twig模板中回顯這些時,值不相等:req lang: {{ app.request.locale }} session: {{ app.session.get('_locale') }}
。下面發佈的LocaleListener工作正常,我通過插入die()
來檢查這個,並且設置翻譯服務的語言環境似乎正在工作。
所以通過設置翻譯器的語言環境,我得到了這個工作。我不明白爲什麼雖然。翻譯服務不應該使用請求語言環境嗎?爲什麼我需要手動設置?
請求對象中的區域設置是否用於翻譯以外的內容?
<?php
namespace Mb\MyBundle\Listener;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class LocaleListener implements EventSubscriberInterface
{
private $translator;
public function __construct($translator) {
$this->translator = $translator;
}
public function onKernelRequest(GetResponseEvent $event)
{
$request = $event->getRequest();
if (!$request->hasPreviousSession()) {
return;
}
if (strlen($request->getSession()->get('_locale'))) {
$request->setLocale($request->getSession()->get('_locale'));
$this->translator->setLocale($request->getSession()->get('_locale'));
}
}
static public function getSubscribedEvents()
{
return array(
// must be registered before the default Locale listener
KernelEvents::REQUEST => array(array('onKernelRequest', 17)),
);
}
}
在我services.yml我:
mb.locale.listener:
class: Mb\MyBundle\Listener\LocaleListener
arguments: [@translator]
tags:An
- { name: kernel.event_subscriber }
如果有人能解釋我這裏發生了什麼,我會非常高興:-)
這也爲我解決了!我還使用了LocaleListener方法,請求在偵聽器中有正確的區域設置,但不再在控制器中。感謝您分享翻譯解決方案。儘管如此,仍然無法告訴你爲什麼會發生這種情況:p – juuga