利用 HTTP 標頭 Accept-Language 判斷用戶偏好語言,自動重導至對應語言版面(繁中/簡中/英文),提升國際化體驗。本文提供輕量、可擴充的導向邏輯。
<?php
$lang = $_SERVER['HTTP_ACCEPT_LANGUAGE']; // 例:zh-CN,zh;q=0.9,en;q=0.8
// 1. 繁體中文(港澳台)
if (preg_match('/zh[-_](HK|TW)/i', $lang)) {
$url = 'hk/index.php'; // 或 tw/
}
// 2. 英文系(優先匹配 en 開頭)
elseif (preg_match('/^en/i', $lang)) {
$url = 'en/index.php';
}
// 3. 簡體中文(大陸)
elseif (preg_match('/zh[-_](CN|SG)/i', $lang)) {
$url = 'cn/index.php';
}
// 4. 預設回退英文
else {
$url = 'en/index.php';
}
header("Location: $url", true, 302);
exit;
?>
標準格式:語言代碼[-地區代碼][;q=權重], ...
zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7:偏好簡中,次選英文zh-TW,zh;q=0.9,en;q=0.8:偏好繁中(台灣)en-US,en;q=0.9,zh-CN;q=0.8:偏好美式英文function getPreferredLang($acceptLanguage, $supported = ['zh-CN', 'zh-TW', 'zh-HK', 'en-US', 'en']) {
// 解析語言標籤與權重
$langs = [];
foreach (explode(',', $acceptLanguage) as $part) {
$part = trim($part);
$q = 1.0;
if (strpos($part, ';q=') !== false) {
list($tag, $qval) = explode(';q=', $part);
$q = (float)$qval;
} else {
$tag = $part;
}
$langs[] = ['tag' => strtolower($tag), 'q' => $q];
}
// 按權重排序
usort($langs, fn($a, $b) => $b['q'] <=> $a['q']);
// 匹配支援列表(支援前綴匹配:en-US 匹配 en)
foreach ($langs as $l) {
foreach ($supported as $sup) {
if (strpos($l['tag'], strtolower($sup)) === 0 || strpos(strtolower($sup), $l['tag']) === 0) {
return $sup;
}
}
}
return $supported[0]; // 預設第一個
}
// 使用
$langCode = getPreferredLang($_SERVER['HTTP_ACCEPT_LANGUAGE']);
$map = [
'zh-CN' => 'cn/', 'zh-SG' => 'cn/',
'zh-TW' => 'tw/', 'zh-HK' => 'hk/', 'zh-MO' => 'hk/',
'en-US' => 'en/', 'en' => 'en/',
];
$targetDir = $map[$langCode] ?? 'en/';
header("Location: {$targetDir}index.php");
exit;
Cache-Control: no-store, no-cache, must-revalidate,避免 CDN/瀏覽器快取導向錯誤。hreflang 標籤、站點地圖標註語言版本,避免搜尋引擎視為重複內容。幾行代碼即可實現智慧語言導向,配合手動覆蓋機制,打造無感多語言體驗。