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