2013-07-23 105 views
14

我正在做我自己的网站,我设法编写一些代码,使用户根据浏览器的语言指向语言版本。这里是脚本:自动检测语言和重定向用户

<?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"); 
?> 

我已经把这个在index.php之前。这似乎是有用的,因为我不是在说英语的国家,但我的浏览器是英文的,我正在重定向到英文版本。

这是正确的吗?有没有更好的/更清洁的方式来做到这一点?

+2

重复:http://stackoverflow.com/questions/6038236/http-accept-language – Sherlock

+0

谢谢,无法找到它! – viriato

回答

10

嗯,我遇到了一些我的代码问题,这并不令人惊讶,因为我不是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的语言。如果你生活在另一个国家,例如瑞典语作为母语,但这是一个问题,但因为你在英国购买了计算机,所以你的浏览器使用英语。

所以我对这个问题的解决方案是在index.html(因此没有index.php)上没有这个php代码的情况下为每种语言(甚至是主要语言的语言)创建一个具有重复版本的文件夹。所以现在我的网站会自动检测语言,用户也可以选择手动更改它,以防他们想要!

希望它能帮助出现相同问题的其他人!

+0

**否则如果**不是正确的方法,** elseif **是正确的。我认为这只是一个错字,但以防万一:http://php.net/manual/en/control-structures.elseif.php –

4

我认为你的想法很好。可能会帮助你最短代码:

$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); 
header("location: ".$lang."/index.php"); 
14

PHP 5.3.0+附带locale_accept_from_http()它从Accept-Language标题获得首选语言。

因为标题字段比人们想象的要复杂得多,所以您应该始终将此方法更改为自写方法。 (这是加权的首选项列表。)

你应该取回这样的语言:

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

但即便如此,你将不只是对西班牙的人en为每一个英语用户和es 。它可以变成much more difficult,而像es-ESes-US这些标准是标准的。

这意味着您应该迭代正在尝试的正则表达式列表,并以此方式确定页面语言。以PHP-I18N为例。

+0

现在有最好的解决方案,谢谢。 – lewsid

-1

最有用的代码

$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); 
if(file_exists('system/lang/'.$lang.'.php')) 
{ 
    include('system/lang/'.$lang.'.php'); 
}else{ 
    include('system/lang/en.php'); //set default lang here if not exists translated language in ur system 
    } 
+0

不幸的是,这是非常懒惰的代码,不支持优先级或标识符超过2个字母的语言。 –