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

PHP 多語系切換機制實作:Session + 語言包 + JavaScript 無縫體驗

     編輯:PHP 綜合知識

打造多語系網站不再是難題。本文示範一套輕量級、易維護的 PHP 多語系切換方案:以 Session 記錄用戶偏好、語言包檔案獨立管理翻譯字串、JavaScript 即時切換無需重新整理頁面,並支援預設語系與擴充新語言。完整程式碼結構清晰,適合中小型專案快速導入。

系統架構概覽

  • 主程式 index.php:偵測語系參數、載入對應語言包、輸出語系選單。
  • 語言包目錄 lang/:每種語言一個 .inc 檔,回傳翻譯陣列或變數。
  • 核心函式庫 lib/function.php:提供語系清單、名稱對照、預設語系等工具函式。
  • 前端腳本 js/language.js:攔截選單變更、重導 URL 附帶 language 參數。

核心程式碼實作

1. 主程式 index.php

<?php
session_start();
require_once 'lib/function.php';

// 1. 處理語系切換請求
if (isset($_GET['language'])) {
    $_SESSION['language'] = $_GET['language'];
} elseif (!isset($_SESSION['language'])) {
    $_SESSION['language'] = getDefaultLanguage();
}

$currentLangCode = $_SESSION['language'];
$currentLangName = getLanguageName($currentLangCode);

// 2. 載入對應語言包(回傳翻譯變數/陣列)
include "lang/{$currentLangName}.inc";
?>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>多語系示範</title>
    <script src="js/language.js"></script>
</head>
<body>
    <h1>目前語系:<?php echo $currentLangName; ?></h1>
    <p>測試翻譯:<?php echo $name ?? '未定義'; ?></p>

    <label for="language">切換語言:</label>
    <select name="language" id="language" onchange="changeLanguage(this)">
        <?php
        $langList = arrayLanguage(); // 回傳支援的語系代碼陣列,如 ['en', 'zh']
        foreach ($langList as $code) {
            $selected = ($code === $currentLangCode) ? 'selected' : '';
            echo "<option value=\"{$code}\" {$selected}>" . getLanguageName($code) . "</option>";
        }
        ?>
    </select>
</body>
</html>

2. 語言包範例 lang/English.inc / lang/Chinese.inc

<?php // English.inc
$name = 'Name';
?>
<?php // Chinese.inc
$name = '名字';
?>

3. 核心函式庫 lib/function.php

<?php
/** 取得所有可用語系代碼 => 名稱對照表 */
function getAvailableLanguages(): array {
    return [
        'af' => 'Afrikaans', 'az' => 'Azerbaijani', 'eu' => 'Basque',
        'be' => 'Belarusian', 'bg' => 'Bulgarian', 'bs' => 'Bosnian',
        'ca' => 'Catalan',   'zh' => 'Chinese',   'cs' => 'Czech',
        'da' => 'Danish',    'de' => 'German',    'el' => 'Greek',
        'en' => 'English',   'es' => 'Spanish',   'et' => 'Estonian',
        'fa' => 'Persian',   'fi' => 'Finnish',   'fr' => 'French',
        'gl' => 'Galician',  'he' => 'Hebrew',    'hi' => 'Hindi',
        'hr' => 'Croatian',  'hu' => 'Hungarian', 'id' => 'Indonesian',
        'it' => 'Italian',   'ja' => 'Japanese',  'ko' => 'Korean',
        'ka' => 'Georgian',  'lt' => 'Lithuanian','lv' => 'Latvian',
        'mk' => 'Macedonian','mn' => 'Mongolian', 'ms' => 'Malay',
        'nl' => 'Dutch',     'no' => 'Norwegian', 'pl' => 'Polish',
        'pt-BR' => 'Brazilian Portuguese','pt' => 'Portuguese',
        'ro' => 'Romanian',  'ru' => 'Russian',   'si' => 'Sinhala',
        'sk' => 'Slovak',    'sl' => 'Slovenian', 'sq' => 'Albanian',
        'sr-lat' => 'Serbian Latin','sr' => 'Serbian',
        'sv' => 'Swedish',   'th' => 'Thai',      'tr' => 'Turkish',
        'tt' => 'Tatar',     'uk' => 'Ukrainian',
    ];
}

/** 依代碼取得語系名稱 */
function getLanguageName(string $code): string {
    $list = getAvailableLanguages();
    return $list[$code] ?? $code;
}

/** 專案實際支援的語系代碼清單 */
function arrayLanguage(): array {
    return ['en', 'zh']; // 依需求增減
}

/** 預設語系 */
function getDefaultLanguage(): string {
    return 'zh';
}
?>

4. 前端切換腳本 js/language.js

function changeLanguage(selectEl) {
    const url = new URL(window.location.href);
    url.searchParams.set('language', selectEl.value);
    window.location.href = url.toString();
}

進階優化建議

  1. 語言包結構化:採用陣列 $lang = ['welcome' => '歡迎', ...] 並搭配 __('key') 輔助函式,避免全域變數汙染。
  2. 瀏覽器偵測:首次訪問可依 $_SERVER['HTTP_ACCEPT_LANGUAGE'] 自動推薦語系。
  3. URL 友善化:採用 /zh/、/en/ 路由而非 Query String,有利 SEO。
  4. 快取機制:語言包載入後可快取至 APCu/Redis,減少 I/O。
  5. 複數形式:整合 gettext 或 symfony/translation 處理複數、語序等複雜 i18n 需求。

總結

本方案以 Session 為核心、語言包解耦、JS 增強體驗,程式碼精簡易懂,非常適合快速為既有專案加入多語系支援。隨著專案增長,可平滑遷移至專業 i18n 函式庫,維持架構彈性。

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