您在這裡

網站根據訪問者浏覽器設置跳轉到合适的多語言版本

James Qi 在 2016年10月11日 - 12:05 發表

  我們做過不少多語言網站,為世界各地各種語言用戶提供服務,一般每個頁面都有語言切換的選擇,讓用戶自行選擇。不過用戶進入網站的時候都是看到默認語言(多為English)界面,如果是非英語用戶感覺會差一些,甚至找不到語言切換的地方。

  而一些大的知名網站很多都是自動判斷用戶語言屬性、來源國家,跳轉到相應的語言版本或者地區版本,這樣讓用戶更方便、體驗更好。于是我們也在網上找了一些資料,實現了根據訪問者浏覽器設置來跳轉到合适的多語言版本。一般是首頁進行跳轉,如果是用戶直接訪問内頁就沒有做跳轉。

  這個站首先已經用子域名的方式設置了多語言版本,例如:

  • ar.example.com 阿拉伯文版
  • de.example.com 德文版
  • en.example.com 英文版
  • es.example.com 西班牙文版
  • fr.example.com 法文版
  • it.example.com 意大利文版
  • ja.example.com 日文版
  • ko.example.com 韓文版
  • pt.example.com 葡萄牙文版
  • ru.example.com 俄文版
  • zh-hans.example.com 簡體中文版
  • zh-hant.example.com 繁體中文版
  • ......

  下面演示在Drupal網站的首頁中用PHP來進行數據獲取、判斷、跳轉:

<?php

if (isset($_SERVER['HTTP_HOST'])) {
  $http_host = $_SERVER['HTTP_HOST'];
} else {
  $http_host = 'example.com';
}

if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
  $http_accept_language = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
} else {
  $http_accept_language = 'en';
}

if (isset($_SERVER['HTTP_REFERER'])) {
  $http_referer = $_SERVER['HTTP_REFERER'];
} else {
  $_SERVER['HTTP_REFERER'] = '';
}

$http_language = strtolower( strtok( $http_accept_language, ',' ) );
if ($http_language == 'zh-cn' || $http_language == 'zh-hans-cn' || $http_language == 'zh-sg' || $http_language == 'zh-hans-sg' || $http_language == 'zh') {
  $http_language = 'zh-hans';
} elseif ($http_language == 'zh-tw' || $http_language == 'zh-hant-tw' || $http_language == 'zh-hk' || $http_language == 'zh-hant-hk') {
  $http_language = 'zh-hant';
}
$flag_from_example = strpos($http_referer, 'example.com');

global $language;
$langcode = $language->language;

$languages = language_list('enabled');
$languages_array = $languages[1];
$langcode_array = array_keys($languages_array);

$flag_language_in_list = in_array($http_language, $langcode_array);

//跳轉的條件有多個:不是來自本站、浏覽器設置的語言在本站多語言列表中、浏覽器設置的語言與網站當前語言不同、不是example.com這個二級域名
if ($flag_from_example == FALSE && $flag_language_in_list == TRUE && $http_language != $langcode && $http_host != 'example.com') {
  $url = "http://$http_language.example.com/";
  header("location: $url");    
}

?>

  上面是針對多語言的跳轉,如果是針對國家/地區的跳轉,需要先獲取訪問者的IP地址,根據IP地址判斷來源的國家/地區,再跳轉到對應的内容網址。


  補充:路徑後綴方式的多語言網站跳轉稍有不同,可以定義一個下面這樣的函數來在需要的地方調用:

function language_redirect() {
  if (isset($_SERVER['HTTP_HOST'])) {
    $http_host = $_SERVER['HTTP_HOST'];

    if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
      $http_accept_language = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
   
      if (isset($_SERVER['HTTP_REFERER'])) {
        $http_referer = $_SERVER['HTTP_REFERER'];
     
        //print "http_host = $http_host, http_accept_language = $http_accept_language, http_referer = $http_referer
\n";
     
        $http_language_full = strtolower( strtok( $http_accept_language, ',' ) );
        $http_language = strtok($http_language_full, '-');
        switch ($http_language_full) {
          case 'zh-cn':
          case 'zh-hans-cn':
          case 'zh-sg':
          case 'zh-hans-sg':
          case 'zh':
            $http_language = 'zh-hans';
            break;
          case 'zh-tw':
          case 'zh-hant-tw':
          case 'zh-hk':
          case 'zh-hant-hk':
            $http_language = 'zh-hant';
            break;
          default:
        }
     
        $flag_from_http_host = strpos($http_referer, $http_host);
     
        global $language;
        $langcode = $language->language;
     
        $languages = language_list('enabled');
        $languages_array = $languages[1];
        $langcode_array = array_keys($languages_array);
     
        $flag_language_in_list = in_array($http_language, $langcode_array);
     
        //print "http_language = $http_language, langcode = $langcode
\n";
     
        if ($flag_from_http_host == FALSE && $flag_language_in_list == TRUE && $http_language != $langcode) {
          if ($http_language == 'en') {
            $url = "http://$http_host";
          } else {
            $url = "http://$http_host/$http_language";
          }
          header("location: $url");    
        }
      }//isset($_SERVER['HTTP_REFERER']), else not jump
    }//isset($_SERVER['HTTP_ACCEPT_LANGUAGE']), else not jump
  }//isset($_SERVER['HTTP_HOST']), else not jump
}// end of language_redirect

自由标簽:

發表新回應

Plain text

  • 不允許使用 HTML 標籤。
  • 自動將網址與電子郵件地址轉變為連結。
  • 自動斷行和分段。