我目前正在使用symfony 5开发,并已将我的网站完全翻译成多种语言。我有一个选择语言的按钮,但我希望网站的默认语言是用户的语言(更准确地说是他的浏览器语言设置)。
目前,我已经找到了一种解决方案,但它并不是最优的。
我所做的是,在我的索引中检查用户是否已经浏览过该站点,如果没有,则将其重定向到一个名为“change_locale”的路由,该路由将采用相应的语言作为参数(只有在第一次访问时才会进入此条件)。
public function index(Request $request): Response
{
// If this is the first visit to the site, the default language is set according to the user's browser language
if (!$request->hasPreviousSession()) {
return $this->redirectToRoute('change_locale', ['locale' => strtolower(str_split($_SERVER['HTTP_ACCEPT_LANGUAGE'], 2)[0])]);
}
return $this->render('accueil/index.html.twig');
}
我只是在会话中注册变量以更改语言。然后我的问题就出现在这一步之后。当用户在网站上简单地点击语言更改按钮时,他会返回到之前的页面(他没有进入if条件)。但是,如果他第一次访问网站,则从索引页重定向到该路由时,他会进入条件if (!$request->hasPreviousSession())
,而这就是问题所在。因为如果他之前没有访问过任何内容,我无法将他重定向回他正在访问的页面。
/**
* @Route("/change-locale/{locale}", name="change_locale")
*/
public function changeLocale($locale, Request $request)
{
$request->getSession()->set('_locale', $locale); // Storing the requested language in the session
// If it's the first page visited by the user
if (!$request->headers->get('referer')) {
return $this->redirectToRoute('index');
}
// Back to the previous page
return $this->redirect($request->headers->get('referer'));
}
因此,我试图从我的change_locale
路由中删除此条件,并找到一种方法在请求的头部添加属性'referer'
,该属性指向上一页。
我可以在执行redirectToRoute
到change_locale
之前在我的索引中完成此操作。