Symfony 2.4中的语言切换器

时间:2014-02-06 17:06:42

标签: php symfony locale language-switching

我有一个对象语言,我可以从管理页面添加,删除和更新语言。

我想要做的是添加一个语言切换器,我把这个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,就是我在上面的切换台中使用的动作:

 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)

由于

3 个答案:

答案 0 :(得分:3)

在搜索更多详细信息以便撰写答案时,我偶然发现了这个Symfony食谱条目: Making the Locale "Sticky" during a User's Session

我认为这正是你所需要的;)

答案 1 :(得分:3)

Symfony 2.6: 我使用了#34;提到Locale Sticky&#34;中提到的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'));
}

答案 2 :(得分:2)

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);
    }
}

您可以添加为内核请求,并使用查询字符串swich_language进行更改