
我们做过不少多语言网站,为世界各地各种语言用户提供服务,一般每个页面都有语言切换的选择,让用户自行选择。不过用户进入网站的时候都是看到默认语言(多为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
评论