自动检测语言并重定向用户

2022-08-30 20:52:16

我正在做自己的网站,我设法编写了一些代码,根据浏览器的语言将用户定向到语言版本。下面是脚本:

<?php
  if ($_SERVER["HTTP_ACCEPT_LANGUAGE"] == "sv")
    header("location: index.php");
  if ($_SERVER["HTTP_ACCEPT_LANGUAGE"] == "pt")
    header("location: pt/index.php");
  else 
    header("location: en/index.html");
?>

我已将其放在索引中.php在 .它似乎正在工作,因为我不在英语国家,但我的浏览器是英语的,我被重定向到英语版本。

这是正确的吗?有没有更好/更清洁的方法可以做到这一点?


答案 1

PHP 5.3.0+附带了从标头获取首选语言的功能。locale_accept_from_http()Accept-Language

您应该始终更喜欢此方法而不是自写方法,因为标头字段比人们想象的要复杂得多。(这是一个加权首选项列表。

您应该像这样检索语言:

$lang = locale_accept_from_http($_SERVER['HTTP_ACCEPT_LANGUAGE']);

但即便如此,您也不会只拥有每个英语用户和西班牙语用户。它可能会变得比这更困难,像这样的东西是标准的。eneses-ESes-US

这意味着您应该循环访问正则表达式列表,并尝试以这种方式确定页面语言。有关示例,请参阅 PHP-I18N


答案 2

好吧,我在代码中遇到了一些问题,这并不奇怪,因为我不是PHP专家。因此,我一直在寻找可能的解决方案,并在另一个网站上找到了以下代码:

<?php
    // Initialize the language code variable
$lc = ""; 
    // Check to see that the global language server variable isset()
    // If it is set, we cut the first two characters from that string
if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE']))
    $lc = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);

    // Now we simply evaluate that variable to detect specific languages
if($lc == "fr"){
    header("location: index_french.php");
    exit();
} else if($lc == "de"){
    header("location: index_german.php");
    exit();
}
else{ // don't forget the default case if $lc is empty
    header("location: index_english.php");
    exit();
}
?>

这完美地完成了工作!我只剩下一个问题。没有办法改变语言,即使直接链接到另一种语言,因为一旦页面加载,php块就会将我重定向到borwser的语言。如果您居住在另一个国家/地区,并且以瑞典语作为母语,但您的浏览器是英文的,因为您在英国购买了计算机,这可能是一个问题。

因此,我对这个问题的解决方案是为每种语言(甚至是主要语言的模板)创建具有重复版本的文件夹,而无需在索引.html(因此不是索引.php)上使用此php代码。所以现在我的网站正在自动检测语言,用户也可以选择手动更改它,以防他们需要!

希望它能帮助其他人解决同样的问题!


推荐