ThinkPHP教程_PHP框架之ThinkPHP(十二)【多語言與多模板主題】


一、多語言支持

  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針對模板主題還有個記錄機制,就是會記錄上一次關閉瀏覽器時的主題

  

  

  

  

  

  

  

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM