您在這裡

首頁要判斷瀏覽器語系跳到指定頁面如何處理

roder's 的頭像
roder 在 2009-02-25 (三) 11:51 發表

以前在靜態的網頁中,我只要用PHP語法判斷就可以跳到指定的語系頁面
如果今天要在DRUPAL做到這樣功能要如何處理

我各各語系都做好了,有試過放在page.tpl.php中或是指定某各NODE當作首頁放入下面語法會形成迴圈

if($_SERVER["HTTP_ACCEPT_LANGUAGE"]=='zh-tw') {
header('Location: http://127.0.0.1/tw');
}
elseif($_SERVER["HTTP_ACCEPT_LANGUAGE"]=='zh-cn') {
header('Location: http://127.0.0.1/cn');
}
elseif($_SERVER["HTTP_ACCEPT_LANGUAGE"]=='ru') {
header('Location: http://127.0.0.1/ru');
}
elseif($_SERVER["HTTP_ACCEPT_LANGUAGE"]=='en') {
header('Location: http://127.0.0.1/en');
}
else {
header('Location: http://127.0.0.1/en');
}

應該加上同語系就不再跳轉的判斷


<?php
switch($_SERVER["HTTP_ACCEPT_LANGUAGE"]){
case 'zh-tw':
$path = 'tw';
break;
case 'zh-cn':
$path = 'cn';
break;
case 'ru':
case 'en':
$path = $_SERVER["HTTP_ACCEPT_LANGUAGE"];
break;
default:
$path = 'en';
}

if($arg(0) != $path) drupal_goto($path);
?>

有一各狀況,因為我是用別名的方式
所以$arg(0)會抓到node這個字串,而非我設定別名的tw,en這類的字串
因為目前弄得多國語系網站,老實說為了想保留原本的路徑方式(ex: http://xxx/tw)才想用這種別名方式處理
但是在DRUPAL中這樣處理多國語言網站似乎不是很好的方法

若有大大有較好的方式請建議,我再找找DRUPAL是否有比較好的模組可以達成

另外,因為我有設定多國語系選單,如果這些判斷寫在版型或首頁中,一但使用繁體IE,會自動跳到繁體語系沒問題
但是如果USER想看英文語系的資料,當他選擇英文語系時又會被自動跳到繁體的首頁

這樣無法達成我只想判斷一次,在傳統http://xxx/index.php寫好判斷會自動跳到該語系(ex: http://xxx/tw)
之後在http://xxx/tw下選英文,會跳到http://xxx/en,這樣完全正常不會互相影響

但DRUPAL要如何達成,或是我的作法有誤

因為我不太清楚你的網站的樣子
所以我只能從你給的那段程式來做修改
可能你以前在非 drupal 環境下寫的跳轉頁面只會被執行一次
不過 page.tpl.php 這個檔案是所有的頁面都會去執行
所以你每換一次頁面,就又檢查一次語系了

因為我沒用過多語相關的模組
這邊一樣從你給的程式做修改,給你做參考


<?php
//語系對應陣列
$languages = array(
'zh-tw' => 'tw',
'zh-cn' => 'cn',
'ru' => 'ru',
'en' => 'en',
);

//首次進入未設定語系,依照 HTTP_ACCEPT_LANGUAGE 的值在語系對應陣列內搜尋鄉對應的語系路徑
//對應陣列中查不到的與細則設定為預設語系 en
if(!isset($_SESSION['select_language'])){
$key = $_SERVER["HTTP_ACCEPT_LANGUAGE"];
if(!isset($languages[ $key])) $key = 'en';
$_SESSION['select_language'] = $languages[ $key];
drupal_goto($_SESSION['select_language']);
}

//已經設定過語系時,判斷路徑的語系是否相符
//進入不同語系的路徑時,變更語系的設定
$language = $_SESSION['select_language'];
$alise_args = explode('/', $_GET['q']);
if($alise_args[0] != $language && isset($languages[$alise_args[0]])){
$_SESSION['select_language'] = $alise_args[0];
drupal_goto($_GET['q']);
}
?>

感謝hom大的協助
不過後來發現,若不要這麼堅持非要用程式去轉語系的路徑
基本上,D6本身i18n多國語系就會判斷瀏覽器語系,只要該頁面只限定呈現哪各語系就OK
如瀏覽器是英文版,http://XXX自動會顯示英文的語系頁面,只是我硬要把它變成http://xxx/en
,而那en只是把node/x變成en的別名,若強制導到drupal_goto('en'),其實會變成http:/xxx/en/en
因此所有程式都不加,只用DRUPAL內建的處理方式其實只差在一開始的首頁顯示是,http://XXX,而非我以前的http://XXX/en

但基本上我是可以接受,就看公司是否對這樣呈現有意見