gpt4 book ai didi

php - Symfony 5 - 基于浏览器语言的网站翻译后重定向

转载 作者:行者123 更新时间:2023-12-04 14:54:05 24 4
gpt4 key购买 nike

我目前正在开发 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');
}

这里我只是简单的在session中注册变量来改变语言。而我的问题就在这一步之后。当用户简单地点击站点上的语言更改按钮时,他会返回到上一页(他没有输入 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 路由中删除这个条件,并找到一种方法在请求的 header 中添加指向前一个的属性 'referer'页。我可以在对 change_locale 执行 redirectToRoute 之前在我的索引中执行此操作。

最佳答案

不要使用重定向来设置语言环境。

Symfony 关于 How to Work with the User’s Locale 的文档有一个很好的建议:改为使用自定义事件监听器。另请阅读 Making the Locale “Sticky” during a User’s Session .

您可以使用文档中的这个示例:

class LocaleSubscriber implements EventSubscriberInterface
{
private $defaultLocale;

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

public function onKernelRequest(RequestEvent $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->attributes->get('_locale')) {
$request->getSession()->set('_locale', $locale);
} else {
// if no explicit locale has been set on this request, use one from the session
$request->setLocale($request->getSession()->get('_locale', $this->defaultLocale));
}
}

public static function getSubscribedEvents()
{
return [
// must be registered before (i.e. with a higher priority than) the default Locale listener
KernelEvents::REQUEST => [['onKernelRequest', 20]],
];
}
}

还有一些免费的建议:在 onKernelRequest 方法中,您可以使用 HTTP_ACCEPT_LANGUAGE 来查看用户可能使用的语言,但是(就像所有其他用户输入一样!)它可以不可用或不可靠。您可能希望使用来自用户 IP 地址或其他逻辑的信息。

关于php - Symfony 5 - 基于浏览器语言的网站翻译后重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68465821/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com