People,
我正在开发一个基于HTTP_ACCEPT_LANGUAGE的功能,当我测试时,浏览器显示一个重定向循环。我调查了其他帖子中提供的所有解决方案,但不起作用
更新:我尝试首先使用 httaccess 检测语言并使用正确的页面和 lang 变量重定向到正确的页面来执行此操作,但我发现了同样的问题。问题是我使用了两个变量:page(以确定用户在哪个页面)和lang(正确的语言取决于用户的口语)。但是当用户第一次到达网站时:两个变量都是空的,所以这样做的目的是检测用户的浏览器语言,然后将其重定向到正确的 url,在我的例子中.....index.php?page=index&lang=en 例如...
我这样做了:
**init.php**
$supportedLangs = array (
'en-GB',
'en-US',
'es-ES',
'es-AR'
);
$languages = explode ( ',', $_SERVER ['HTTP_ACCEPT_LANGUAGE'] );
detectBrowserLanguage($languages,$supportedLangs);
**functions.php**
function detectBrowserLanguage($languages,$supportedLangs) {
foreach ( $languages as $lang ) {
if (in_array ( $lang, $supportedLangs )) {
// Set the page locale to the first supported language found
switch ($lang) {
case 'es-ES' :
header ( "Location: index.php?pagina=inicio&lang=es", TRUE, 301 );
exit ();
break;
case 'en-US' :
header ( "Location: index.php?pagina=inicio&lang=en", TRUE, 301 );
exit ();
break;
case 'en-GB' :
header ( "Location: index.php?pagina=inicio&lang=en", TRUE, 301 );
exit ();
break;
default :
header ( "Location: index.php?pagina=inicio&lang=es", TRUE, 301 );
exit ();
break;
}
}
}
}
您可能正在从索引.php页面调用detectBrowserLanguage。 确保在 URL 中传递 Lang 参数时不调用该函数。
你可以检查一下
isset($_GET['lang'])
如果页面已经是检测到的语言,我添加了一个方法来打破循环。注意:请参阅我对你的问题的评论。
$supportedLangs = array (
'en-GB',
'en-US',
'es-ES',
'es-AR'
);
$languages = explode ( ',', $_SERVER ['HTTP_ACCEPT_LANGUAGE'] );
$currentLanguage='';
if(isset($_GET['lang'])){
$currentLanguage=$_GET['lang'];
}
detectBrowserLanguage($languages,$supportedLangs, currentLanguage);
功能
function detectBrowserLanguage($languages,$supportedLangs, $currentLanguage) {
foreach ( $languages as $lang ) {
if ($lang == $currentLanguage){
return; //If the page is already redirected just return.
}elseif (in_array ( $lang, $supportedLangs )) {
// Set the page locale to the first supported language found
switch ($lang) {
case 'es-ES' :
header ( "Location: index.php?pagina=inicio&lang=es", TRUE, 301 );
exit ();
break;
case 'en-US' :
header ( "Location: index.php?pagina=inicio&lang=en", TRUE, 301 );
exit ();
break;
case 'en-GB' :
header ( "Location: index.php?pagina=inicio&lang=en", TRUE, 301 );
exit ();
break;
default :
header ( "Location: index.php?pagina=inicio&lang=es", TRUE, 301 );
exit ();
break;
}
}
}
}
编辑:
您可以使用http_negotiate_language轻松完成此操作。这只是有关如何执行此操作的指南。我还没有测试过这个(只是在这里输入)
function detectBrowserLanguage($supportedLangs, $currentLanguage) {
$negotiated_language = http_negotiate_language($supportedLangs);
if ($currentLanguage != $negotiated_language){
switch ($negotiated_language) {
case 'es-ES' :
header ( "Location: index.php?pagina=inicio&lang=es", TRUE, 301 );
exit ();
break;
case 'en-US' :
header ( "Location: index.php?pagina=inicio&lang=en", TRUE, 301 );
exit ();
break;
case 'en-GB' :
header ( "Location: index.php?pagina=inicio&lang=en", TRUE, 301 );
exit ();
break;
default :
header ( "Location: index.php?pagina=inicio&lang=es", TRUE, 301 );
exit ();
break;
}
}
}
参考:
- W3 接受语言RFC
- 语言标签