簡體   English   中英

Symfony 2.4中的語言切換器

[英]A language switcher in Symfony 2.4

我有一個對象語言,我可以從管理頁面添加,刪除和更新語言。

我想要做的是添加語言切換器,我把這個html / twig代碼:

 {% for language in languages %}         
      <li><a href="{{ path('evr_footer_switch_language',{'locale': language.code | lower }) }}">{{ language.language | capitalize }} ({{ language.code }})</a></li>
 {% endfor %}

動作the route for the action is evr_footer_switch_language ,我在上面的切換器中使用the route for the action is evr_footer_switch_language

 public function switchlanguageAction($locale = 'en') {

        $this->get('session')->set('_locale', $locale);
        $request = $this->getRequest();
       $request->setLocale($locale);
        return $this->redirect($request->headers->get('referer'));
    }

這是我為action / controller switchlanguageAction()定義的路由

evr_footer_switch_language:
    pattern: /language/switch/{locale}
    defaults: { _controller: EvrHomeBundle:Footer:switchlanguage, locale: en }

在我看來,原理上非常簡單,你點擊語言的鏈接(從數據庫中獲取),發送語言的代碼(例如:'fr','en','zh'等...)將操作作為$ locale變量,然后將會話/請求的Locale設置為此值。

問題是這些都不起作用,語言仍然是'EN'(默認值)。

注意根據這個項目的要求,URL中沒有提到語言(如fr / articles,en / articles), 但是相同的URL(/ articles /)可以用不同的語言顯示,這就是為什么我沒有不要使用預定義的slug(_locale)

謝謝

在尋找更多細節以便撰寫答案時,我偶然發現了這個Symfony食譜條目: 在用戶會話期間使語言環境“粘滯”

我認為這正是你所需要的;)

Symfony 2.6:我使用了“使區域設置粘滯”中提到的LocaleListener,但也必須使用它來使事情正常工作:

/** from Controller
 *
 * @Route("/changeLanguage/{changeToLocale}", name="changeLanguage")
 *
 */
public function changeLanguageAction($changeToLocale){
    $this->get('request')->attributes->set('_locale', null);
    $this->get('session')->set('_locale', $changeToLocale);

    return $this->redirect($this->generateUrl('index'));
}
public function onKernelRequest(GetResponseEvent $event)
{
    $request = $event->getRequest();
    if (!$request->hasPreviousSession()) {
        return;
    }

    // try to see if the locale has been set as a _locale routing parameter
    if ($locale = $request->query->get('swich_language')) {

        $request->getSession()->set('_locale', $locale);
        $routing = $this->router->match($request->getPathInfo());

        $route_params = array();

        foreach ($routing as $key => $value) {
            if($key[0] !== "_")
            {
                $route_params[$key] = $value;
            }
        }

        $parameters = \array_merge($route_params, array("_locale" => $locale));
        $url = $this->urlGenerator->generate($routing['_route'], $parameters);

        $response = new RedirectResponse($url);
        $event->setResponse($response);
    }
}

您可以添加內核請求,使用querystring swich_language可以更改它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM