2013-07-23 56 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個字母的語言。 –