ThinkPHP 內建強大的多語言支援機制,透過語言包檔案與行為擴展實現零侵入式國際化。本文以 ThinkPHP 3.2 為例,完整記錄從配置開啟、語言偵測、語言包建立、視圖輸出到後台控制器使用的全流程,並補充常見坑點與最佳實踐。
編輯專案配置 `Home/Conf/config.php`:
<?php
return array(
// 開啟語言包功能
'LANG_SWITCH_ON' => true,
// 自動偵測瀏覽器語言
'LANG_AUTO_DETECT' => true,
// 預設語言
'DEFAULT_LANG' => 'zh-cn',
// 允許切換的語言列表(逗號分隔)
'LANG_LIST' => 'en-us,zh-cn,zh-tw',
// URL 切換語言的變數名
'VAR_LANGUAGE' => 'l',
);
?>
建立 `Home/Conf/tags.php`,掛載 `app_begin` 標籤:
<?php
return array(
'app_begin' => array('CheckLang')
);
?>
框架完整版包含 `ThinkPHP/Extend/Behavior/CheckLangBehavior.class.php`。若專案為精簡版,請手動複製至 `Home/Lib/Behavior/CheckLangBehavior.class.php`。核心邏輯如下:
在 `Home/Lang/` 下建立三個語言目錄,各放一個 `common.php`:
Home/Lang/ ├── zh-cn/common.php // 簡體中文 ├── zh-tw/common.php // 繁體中文 ├── en-us/common.php // 英文
zh-cn/common.php
<?php
return array(
'welcome' => '歡迎使用 ThinkPHP',
'login' => '登入',
'logout' => '登出',
);
?>
zh-tw/common.php
<?php
return array(
'welcome' => '歡迎使用 ThinkPHP',
'login' => '登入',
'logout' => '登出',
);
?>
en-us/common.php
<?php
return array(
'welcome' => 'Welcome to ThinkPHP',
'login' => 'Login',
'logout' => 'Logout',
);
?>
建立 `Home/Tpl/Index/index.html`:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>ThinkPHP 多語言示例</title>
</head>
<body>
<div class="main">
<div>
切換語言:
<a href="?l=zh-cn">簡體中文</a> |
<a href="?l=zh-tw">繁體中文</a> |
<a href="?l=en-us">English</a>
</div>
<div class="result">{$Think.lang.welcome}</div>
<p>{$Think.lang.login} | {$Think.lang.logout}</p>
</div>
</body>
</html>
使用 `L()` 函式(`Think\Think::L()` 的快捷方式):
<?php
namespace Home\Controller;
use Think\Controller;
class UserController extends Controller {
public function login() {
// 直接輸出對應語言文字
$this->error(L('login_failed')); // 需在語言包定義 login_failed
}
public function profile() {
// 取得字串供模板使用
$title = L('user_profile');
$this->assign('pageTitle', $title);
$this->display();
}
}
?>
若 `User` 模組有專屬術語,可在 `Home/Lang/zh-cn/User.php` 定義:
<?php
return array(
'user_profile' => '個人資料',
'login_failed' => '帳號或密碼錯誤',
);
?>
框架會自動載入 `Lang/zh-cn/User.php`(普通分組模式)或 `Lang/zh-cn/User/User.php`(獨立分組模式)。
| 現象 | 原因 | 解決 |
|---|---|---|
| 語言不切換 | 未開啟 `LANG_SWITCH_ON` 或 `tags.php` 未掛載 `CheckLang` | 檢查配置與標籤檔案 |
| 變數顯示原鍵名 | 語言包未定義該鍵、或檔案編碼非 UTF-8 無 BOM | 補全語言包、另存為 UTF-8 無 BOM |
| Cookie 無效 | Cookie 前綴衝突、域名設定錯誤 | 檢查 `COOKIE_PREFIX`、`COOKIE_DOMAIN` 配置 |
| 瀏覽器語言偵測失效 | `HTTP_ACCEPT_LANGUAGE` 格式複雜、正則未匹配 | 手動指定 `l` 參數測試、或改用 GeoIP |
Home/
├── Conf/
│ ├── config.php # 開啟多語言配置
│ └── tags.php # 掛載 CheckLang 行為
├── Lang/
│ ├── zh-cn/
│ │ ├── common.php
│ │ └── User.php
│ ├── zh-tw/
│ │ └── common.php
│ └── en-us/
│ └── common.php
├── Lib/Behavior/
│ └── CheckLangBehavior.class.php (若精簡版需自行複製)
└── Tpl/Index/index.html # 視圖使用 {$Think.lang.key}