3

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

我想要做的是添加一个语言切换器,我把这个 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 %}

还有一个 action 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'));
    }

这是我为动作/控制器 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)

谢谢

4

3 回答 3

3

在寻找更多细节以写出答案时,我偶然发现了这个Symfony食谱条目:在用户会话期间使区域设置“粘性”

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

于 2014-02-06T23:28:06.933 回答
3

Symfony 2.6:我使用了“Making the Locale Sticky”中提到的 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'));
}
于 2015-05-20T23:47:06.620 回答
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);
    }
}

您可以添加为内核请求,并使用 querystring swich_language 进行更改

于 2018-11-06T14:01:20.760 回答