打造多語系網站不再是難題。本文示範一套輕量級、易維護的 PHP 多語系切換方案:以 Session 記錄用戶偏好、語言包檔案獨立管理翻譯字串、JavaScript 即時切換無需重新整理頁面,並支援預設語系與擴充新語言。完整程式碼結構清晰,適合中小型專案快速導入。
index.php:偵測語系參數、載入對應語言包、輸出語系選單。lang/:每種語言一個 .inc 檔,回傳翻譯陣列或變數。lib/function.php:提供語系清單、名稱對照、預設語系等工具函式。js/language.js:攔截選單變更、重導 URL 附帶 language 參數。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>
lang/English.inc / lang/Chinese.inc<?php // English.inc $name = 'Name'; ?>
<?php // Chinese.inc $name = '名字'; ?>
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';
}
?>
js/language.jsfunction changeLanguage(selectEl) {
const url = new URL(window.location.href);
url.searchParams.set('language', selectEl.value);
window.location.href = url.toString();
}
$lang = ['welcome' => '歡迎', ...] 並搭配 __('key') 輔助函式,避免全域變數汙染。$_SERVER['HTTP_ACCEPT_LANGUAGE'] 自動推薦語系。/zh/、/en/ 路由而非 Query String,有利 SEO。gettext 或 symfony/translation 處理複數、語序等複雜 i18n 需求。本方案以 Session 為核心、語言包解耦、JS 增強體驗,程式碼精簡易懂,非常適合快速為既有專案加入多語系支援。隨著專案增長,可平滑遷移至專業 i18n 函式庫,維持架構彈性。