多語系網站需依使用者偏好顯示介面語言。標準做法:優先讀取使用者明確設定的語言,若無則解析瀏覽器 Accept-Language 標頭。本文提供 UserLang 類別,封裝此邏輯,支援 Cookie 持久化(可自訂名稱、過期時間),語言代碼對應:en(英文)、sc(簡體中文)、tc(繁體中文)。
get():取得目前語言(Cookie > Accept-Language > 預設 en)set($lang):寫入 Cookie,僅接受 en/sc/tcuserlang)與過期秒數(預設 30 天)<?php
class UserLang {
private $name = 'userlang'; private $expire = 2592000; // 30天
public function __construct($name='', $expire=null) {
if($name) $this->name = $name;
if(is_numeric($expire) && $expire>0) $this->expire = intval($expire);
}
public function get() {
if(isset($_COOKIE[$this->name])) return $_COOKIE[$this->name];
return $this->getAcceptLanguage();
}
public function set($lang='') {
$lang = strtolower($lang);
if(in_array($lang, array('en','sc','tc'))) setcookie($this->name, $lang, time()+$this->expire);
}
private function getAcceptLanguage() {
$lang = strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE']);
if(in_array(substr($lang,0,5), array('zh-tw','zh_hk'))) return 'tc';
if(in_array(substr($lang,0,5), array('zh-cn','zh-sg'))) return 'sc';
return 'en';
}
}
?>
<?php
require "UserLang.class.php";
$obj = new UserLang('sitelang', 3600); // Cookie 名 sitelang,1小時過期
echo $obj->get().'<br>'; // 輸出 en / sc / tc
// 使用者切換語言時
if(isset($_GET['lang'])) $obj->set($_GET['lang']);
HTTP_ACCEPT_LANGUAGE 格式如 zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7。本類別簡化處理:取前 5 字元判斷 zh-tw/zh_hk(繁體)、zh-cn/zh-sg(簡體),其餘視為英文。實際專案建議使用 Locale::acceptFromHttp()(intl 擴展)或完整解析 q-value 排序。
檢查 $_SERVER['HTTP_REFERER'] 是否為允許的來源頁面,但 Referer 可偽造且 HTTPS→HTTP 會遺失,建議改用 Session/Token 驗證流程。
HTML <form method="post" action="login.php"> 提交帳密,PHP login.php 驗證後 setcookie 或 $_SESSION 記錄登入狀態,導向會員頁。
UserLang 類別提供輕量的語言偵測與持久化機制,適合中小型多語系專案。大型專案建議採用成熟的 i18n 函式庫(如 Symfony Translation、Laravel Localization)支援複數形式、語系檔案管理、路由前綴等完整功能。