一、多語言支持
ThinkPHP 內置了對多語言的支持,如果應用項目涉及到國際化,那么可以定義相關的語言包文件以實現多語言支持。這里涉及的多語言支持是指模板語言,數據的多語言轉換(翻譯)不在這個范疇之內。
1、配置
在項目配置文件中做如下配置
·自動偵測
ThinkPHP 會自動判斷當前用戶的瀏覽器支持語言來定位該使用何種語言包,如果找不到相關的語言包文件,會使用默認語言。如果瀏覽器支持多種語言,那么取第一種支持語言!實際上,自動偵測是通過$_SERVER['HTTP_ACCEPT_LANGUAGE']來確定使用何種語言的
·手動設置
除了自動偵測當前用戶的瀏覽器語言之外,也可以在 URL 中指定使用何種語言。
·與多語言相關的文件包(系統)或目錄(項目)
ThinkPHP系統簡體中文語言包:ThinkPHP系統目錄/Lang/zh-cn.php
ThinkPHP系統繁體中文語言包:ThinkPHP系統目錄/Lang/zh-tw.php
ThinkPHP系統美國英語語言包:ThinkPHP系統目錄/Lang/en-us.php
項目簡體中文語言包目錄:項目目錄/Lang/<項目分組/>zh-cn/模塊名(小寫).php(或者各個模塊公用的common.php)
項目繁體中文語言包目錄:項目目錄/Lang/<項目分組/>zh-tw/模塊名(小寫).php(或者各個模塊公用的common.php)
項目美國英語中文語言包目錄:項目目錄/Lang/<項目分組/>en-us/模塊名(小寫).php(或者各個模塊公用的common.php)
如果有更多語言,可以依次創建更多的文件包和目錄
2、項目多語言實例
下面舉個栗子來看項目多語言支持的實例
·分別在項目目錄->Lang目錄->zh-cn目錄->common.php文件、項目目錄->Lang目錄->zh-tw目錄->common.php文件、項目目錄->Lang目錄->en-us目錄->common.php文件中設定語言定義
#簡體中文
#繁體中文
#美式英語
·在動作(比如Index模塊的lang動作)中
·在對應的模板(比如項目目錄->Tpl目錄->default目錄->Index目錄->lang.html文件)中
其實,這里不難看出,在模板中獲取語言定義有兩種方式!一是控制器分配過來(如{$message})、二是直接通過模板系統變量獲取(如{$Think.lang.welcome})!稍微靈活一點,可以想到在模板中也可以通過{$Think.lang.message}獲取語言定義的message的,實際上通過模板系統變量獲取在底層也是通過L()方法實現的
*******************************我是一條分界線************************************************
1、其實說到這里,有必要研究一下L()函數
注意批量定義和$_lang前面的static關鍵字
實際上,在入口文件中,關於多語言的操作過程如下
根據瀏覽器支持的語言或默認語言或URL中傳遞過來的" l "值來將相應的系統語言定義和項目語言定義裝載到{$Think.lang}和L()函數的$_lang變量中!裝載到L()函數的$_lang變量中應該就是通過L()函數的批量定義功能來實現的,也就是說在入口文件中自動調用L()函數,並把相應的語言定義(系統和項目)數組傳進去。$_lang前面的static關鍵字就保證了在入口文件(主棧)多次調用L()函數對$_lang產生的影響可以累加!至於怎么裝載到{$Think.lang}中,ThinkPHP也應該是在入口文件中自動完成的,這個細節就不做討論了
2、在動作中var_dump(L());可以驗證上面的理解
ps,L()函數在不傳值時返回所有已裝載的語言定義
·默認時(即為zh-cn時)
·ch-tw時
·en-us時
不難發現,zh-cn時不僅僅顯示了剛才定義的項目語言定義,還顯示了系統語言定義,而zh-tw和en-us卻只顯示了項目語言定義!原因很簡單,系統語言定義目錄(系統目錄->lang目錄)中並沒有zh-tw.php和en-us.php語言文件
**********************************************************************************************
3、定義項目模塊語言包
上面一個例子中,項目目錄->Lang目錄->語言目錄中定義了一個common.php語言文件,該語言文件是該項目的各個模塊都可以用的(即訪問該項目的任意模塊,common.php文件中的語言定義都會被裝載到{$Think.lang}和L()函數中的$_lang中的),而ThinkPHP還支持單獨為某一模塊創建語言定義文件,此時語言定義文件名就是模塊名,不過要小寫。比如說為User模塊創建的語言定義文件就是user.php,那么只有在訪問該項目的User模塊時,user.php文件中的語言定義才會被裝載到{$Think.lang}和L()函數中的$_lang中
不過要注意的是,如果模塊語言文件與公共語言文件有相同的鍵時,則前者會覆蓋后者該相同的鍵!從這個特性以及array_merge()函數的特性可以推測,對於公共語言文件和模塊語言文件,應該是分開加載的,即調用了兩次L()函數,且先加載公共語言文件,后加載模塊語言文件!
這里還提一點,如果在控制器中通過L($name,$value)來動態增加或者修改語言定義時,$name必須得為String,否則是加進去的,看L()源碼即知!而且在語言包文件中,語言定義的數組鍵也要是String,雖然是int也可以加載進去,但是鑒於array_merge()函數的操作,最好也要是String
4、模型中使用語言包
項目多語言支持中除了模板和模塊動作要用到語言包之外,在模型類里也可能需要用到語言包(如自動驗證的提示信息)。要在項目模型里使用語言包,只需將原來寫入驗證規則的提示信息修改一下。舉個栗子
5、強調一下,不管是語言文件/目錄的命名還是URL中'l'值,格式都要按照$_SERVER['HTTP_ACCEPT_LANGUAGE']來,即簡體中午必須是zh-cn、繁體中文是zh-tw、美式英語是en-us、小鬼子語是jp、韓語是ko、德語是de、法語是fr
6、針對系統多語言補充個栗子
·在系統目錄->Lang目錄中添加一個en-us.php文件,並寫上如下語句
·訪問一個不存在的動作lang1,並在URL后加上/l/en-us
·訪問一個不存在的動作lang1,默認情況(zh-cn)下是這樣的
7、不難看出,ThinkPHP對於多語言支持具有自動偵測,自動加載的特點,能夠很方便的實現系統及項目上的多語言支持效果
二、多模板主題
相比多語言,多模板主題要簡單得多
1、配置
在項目配置文件中做如下配置
2、創建模板主題目錄
即在項目目錄->Tpl目錄中創建多個子目錄,一個目錄就是一套模板主題,如下
創建了三個子目錄,即為三個模板主題,這三個目錄中的模板一般內容都是一樣的,只不過樣式不一樣
3、在三個子目錄的對應於User模塊的Index動作的模板中,分別都加上如下語句測試
ps,ThinkPHP針對模板主題還有個記錄機制,就是會記錄上一次關閉瀏覽器時的主題