ThinkPHP支持多語言,采用的是語言文件的方式。如果你的應用涉及到多個語言版本和國際化的支持,那么可以定義相關的語言包文件。任何字符串形式的輸出,都可以定義語言常量。
啟用多語言
要啟用多語言功能,首先要下載多語言行為擴展(http://www.thinkphp.cn/extend/186.html),或者下載官方的完整擴展包(http://www.thinkphp.cn/down/253.html)里面也已經包含多語言行為擴展了,把下載后解壓到的CheckLangBehavior.class.php 文件放入ThinkPHP/Extend/Behavior(如果沒有請手動創建)目錄下面。然后在項目的行為配置文件(Conf/tags.php)中啟用多語言行為,添加如下配置項:
return array(
// 添加下面一行定義即可
'app_begin' => array('CheckLang')
);
表示在app_begin標簽位置執行多語言檢測行為。
由于多語言默認是關閉的,我們還要在項目配置文件(Conf/config.php)中開啟語言包功能:
'LANG_SWITCH_ON' => true, // 開啟語言包功能
其他的多語言相關配置參數包括:
'LANG_AUTO_DETECT' => true, // 自動偵測語言 開啟多語言功能后有效
'DEFAULT_LANG' => 'zh-cn', // 默認語言
'LANG_LIST' => 'zh-cn,en-us', // 允許切換的語言列表 用逗號分隔
'VAR_LANGUAGE' => 'l', // 默認語言切換變量
如果開啟了LANG_AUTO_DETECT,表示會自動偵測當前語言,否則就采用DEFAULT_LANG的語言設置。
語言包的使用由系統自動判斷當前用戶的瀏覽器支持語言來定位,如果瀏覽器支持多種語言,那么取第一種支持語言。
也可以在URL地址中使用參數來切換多語言,例如:
http://localhost/Lang/index.php/?l=en-us
多語言切換采用了Cookie機制,因此會記住當前的語言選擇。
多語言的切換受LANG_LIST參數控制,如果瀏覽器自動偵測的語言或者用戶切換的語言在LANG_LIST之外則無效,系統會采用默認語言。
例如,上面的設置參數情況下,訪問:
http://localhost/Lang/index.php/?l=zh-tw
由于zh-tw語言未在多語言列表中,所以將會采用簡體中文zh-cn語言包。
定義語言包
可以為項目定義不同的語言文件,語言文件包括系統語言包和項目語言包。框架的系統語言包目錄在系統框架的Lang目錄下面,每個語言都對應一個語言包文件,系統默認有簡體中文語言包文件zh-cn.php和英文語言包en-us.php ,如果要增加繁體中文zh-tw或者其他語言包,只要對照系統已有的語言包增加相應的文件。
語言文件主要提供對模板的多語言支持,數據的多語言轉換(翻譯)不在這個范疇之內。ThinkPHP具備語言包定義、自動識別、動態定義語言參數的功能。并且可以自動識別用戶瀏覽器的語言,從而選擇相應的語言包(如果有定義)。
項目語言包文件位于項目的Lang目錄下面,并且按照語言類別分子目錄存放,在執行的時候系統會自動加載,無需手動加載。
語言子目錄采用瀏覽器的語言命名(全部小寫)定義,例如English (United States) 可以使用en-us作為目錄名。一般情況下,如果項目不大,那定義common.php文件即可:
Lang/zh-cn/common.php
如果你的項目比較大,則可以按照模塊或者分組來單獨定義。具體的語言包文件命名規范如下:
項目公共語言包 | 語言目錄/common.php |
項目分組語言包 | 語言目錄/分組名.php |
項目模塊語言包 | 不存在分組情況:語言目錄/模塊名(小寫).php |
存在分組的情況:語言目錄/分組名/模塊名(小寫).php |
語言包文件可以按照模塊來定義,每個模塊單獨定義語言包文件,文件名和模塊名稱相同,例如:
Lang/zh-cn/user.php 表示給User模塊定義簡體中文語言包文件
Lang/zh-tw/user.php 表示給User模塊定義繁體中文語言包文件
分組的模塊語言包定義受TMPL_FILE_DEPR參數配置影響,如果你修改了TMPL_FILE_DEPR參數,例如:
'TMPL_FILE_DEPR'=>'_',
那么,分組的模塊語言包定義方式應該改為:
語言目錄/分組名_模塊名(小寫).php
如果你采用了新版的獨立分組模式的話,那么可以直接在分組的Lang目錄下定義分組語言文件,
Lang/分組名.php
ThinkPHP語言文件定義采用返回數組方式:
return array(
'lan_define'=>'歡迎使用ThinkPHP',
);
使用語言定義
定義了語言文件后,我們通常需要改變控制器中的提示信息用法,例如:
throw_exception('新增用戶失敗!');
我們采用語言包后(例如在語言包里面增加了ADD_USER_ERROR 語言配置變量),在程序中的寫法就要改為:
throw_exception(L('ADD_USER_ERROR'));
也就是說,字符串信息要改成L方法和語言定義來表示。
如果ADD_USER_ERROR語言變量沒有定義的話,L方法會輸出當前的字符串ADD_USER_ERROR本身,所以你不用擔心ADD_USER_ERROR是否有定義,可以在最后統一修改語言文件。
定義好語言文件后,也可以在程序里面動態設置語言定義的值,使用下面的方式:
L('ADD_USER_ERROR','新增用戶錯誤!');
$value = L('ADD_USER_ERROR');
模型類的自動驗證功能里面會用到提示信息,這個部分也可以使用多語言的特性。例如:
原來的方式是把提示信息直接寫在模型里面定義
array('title','require','標題必須!',1),
如果使用了語言文件的話(假設,我們在當前語言包里面定義了' lang_var'=>'標題必須!')
還可以這樣定義模型的自動驗證:
array('title','require','{%lang_var}',1),
如果要在模板中輸出語言變量不需要在Action中賦值,可以直接使用模板引擎特殊標簽來直接輸出語言定義的值:
{$Think.lang.lang_var}
可以輸出當前選擇的語言包里面定義的 lang_var 語言定義。