多語系網站常需依訪客瀏覽器語言偏好自動切換介面。PHP 透過超級全域變數 $_SERVER['HTTP_ACCEPT_LANGUAGE'] 即可取得原始標頭,配合正則表達式解析優先語言代碼。
Accept-Language 標頭格式如 zh-TW,zh;q=0.9,en-US;q=0.8,優先順序由 q 值決定。簡易做法擷取前 4 字元(如 zh-T、en-U)進行比對:
<?php
function detectBrowserLanguage() {
$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 4);
if (preg_match('/zh-c/i', $lang)) return 'zh-CN'; // 簡體中文
if (preg_match('/zh/i', $lang)) return 'zh-TW'; // 繁體中文
if (preg_match('/en/i', $lang)) return 'en-US'; // 英文
if (preg_match('/fr/i', $lang)) return 'fr-FR'; // 法文
if (preg_match('/de/i', $lang)) return 'de-DE'; // 德文
if (preg_match('/ja/i', $lang)) return 'ja-JP'; // 日文
if (preg_match('/ko/i', $lang)) return 'ko-KR'; // 韓文
if (preg_match('/es/i', $lang)) return 'es-ES'; // 西班牙文
if (preg_match('/sv/i', $lang)) return 'sv-SE'; // 瑞典文
return $_SERVER['HTTP_ACCEPT_LANGUAGE']; // 回傳原始值供進一步處理
}
// 使用方式
$locale = detectBrowserLanguage();
echo "偵測語言: $locale";
若需精確處理權重,可進一步解析完整標頭:
function parseAcceptLanguage($header) {
$langs = array();
foreach (explode(',', $header) as $part) {
$part = trim($part);
if (strpos($part, ';q=') !== false) {
list($code, $q) = explode(';q=', $part);
$langs[trim($code)] = (float)$q;
} else {
$langs[$part] = 1.0;
}
}
arsort($langs); // 依權重遞減排序
return $langs;
}
$prefs = parseAcceptLanguage($_SERVER['HTTP_ACCEPT_LANGUAGE']);
$firstChoice = key($prefs); // 最高優先權語言
zh-Hant-TW)