首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 根據瀏覽器語言自動導向多語言頁面實作

     編輯:PHP 綜合知識

利用 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;
?>

Accept-Language 格式解析

標準格式:語言代碼[-地區代碼][;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/瀏覽器快取導向錯誤。
  • 提供手動切換:務必在頁面保留語言切換選單,並將選擇寫入 Cookie/Session,優先級高於自動偵測。
  • SEO 友善:使用 hreflang 標籤、站點地圖標註語言版本,避免搜尋引擎視為重複內容。
  • 無 Accept-Language:部分爬蟲/舊瀏覽器不送此標頭,預設回退邏輯必須健全。

幾行代碼即可實現智慧語言導向,配合手動覆蓋機制,打造無感多語言體驗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved