2017-10-04 43 views
0

我正在使用多種語言的頁面工作。 我在樹枝主頁上有一個按鈕來切換語言。 我想設置的地點這樣,當用戶點擊一個按鈕來選擇語言:用戶選擇languague並保存所有會話的語言環境

public function indexLangAction(Request $request, $lang) 
{ 
$session = $this->get('session'); 
if ($session->has("_locale") && $lang !== $session->get("_locale")) { 
    $session->set("_locale", $lang); 
    return new RedirectResponse('/' . $lang); 
} 

return $this->render('default/index.html.twig', [ 
    'base_dir' => realpath($this- 
>getParameter('kernel.project_dir')).DIRECTORY_SEPARATOR, 
]); 
} 

但是當我去到另一個網頁在同一會議上,語言回默認。

如何在所有用戶會話中保存_locale

設置_locale的最佳方法是怎樣的?我怎樣才能從樹枝給控制器打電話?當用戶點擊按鈕改變語言時,我怎樣才能打電話給控制器?

privacy_lang: 
path:  /{_locale}/privacy 
defaults: { _controller: AppBundle:Documents:privacy } 
requirements: 
     _locale: en|es|ca 

而且這是在樹枝鏈接呼叫路由privacy_lang

<a class="privacy enllac-lower" href="{{ path('privacy_lang') }}">Política de privacidad</a> 
+0

你已經閱讀本文檔? [在用戶會話期間使語言環境「粘滯」](https://symfony.com/doc/current/session/locale_sticky_session.html) –

+0

當我使用多語言網站時,我使用jms/i18n-routing-bundle構建應用程序 – Mz1907

回答

0

使用監聽器。首先創建一個服務:

AppBundle\EventListener\LocaleListener: 
    tags: 
     - { name: kernel.event_subscriber } 

LocaleListener.php:

namespace AppBundle\EventListener; 

use Symfony\Component\HttpKernel\Event\GetResponseEvent; 
use Symfony\Component\HttpKernel\KernelEvents; 
use Symfony\Component\EventDispatcher\EventSubscriberInterface; 

class LocaleListener implements EventSubscriberInterface { 
private $defaultLocale; 

public function __construct($defaultLocale = 'en') 
{ 
    $this->defaultLocale = $defaultLocale; 
} 

public function onKernelRequest(GetResponseEvent $event) 
{ 
    $request = $event->getRequest(); 

    if ($locale = $request->attributes->get('_locale')) { 
     $request->getSession()->set('_locale', $locale); 
    } else { 
     $request->setLocale($request->getSession()->get('_locale', $this->defaultLocale)); 
    } 
} 

public static function getSubscribedEvents() 
{ 
    return [KernelEvents::REQUEST => array(array('onKernelRequest', 15))]; 
} 

} 

更改語言控制器:

$request->getSession()->set('_locale', 'fr'); 
相關問題