ThinkPHP 內置了對多語言的支持,如果應用項目涉及到國際化,那么可以定義相關的語言包文件以實現多語言支持,這里涉及的多語言支持是指模板語言,數據的多語言轉換(翻譯)不在這個范疇之內.
在項目配置文件里添加如下參數以開啟多語言的支持:
- 'LANG_SWITCH_ON' => true, //開啟多語言支持開關
- 'DEFAULT_LANG' => 'zh-cn', // 默認語言
- 'LANG_AUTO_DETECT' => true, // 自動偵測語言
ThinkPHP 會自動判斷當前用戶的瀏覽器支持語言來定位該使用何種語言包,如果找不到相關的語言包文件,會使用默認語言,如果瀏覽器支持多種語言,那么取第一種支持語言.
除了自動偵測當前用戶的瀏覽器語言之外,也可以在 URL 中指定使用何種語言,詳細見下面例子.
與多語言有關的文件包或目錄如下:
ThinkPHP系統簡體中文語言包:ThinkPHP系統目錄/Lang/zh-cn.php
ThinkPHP系統繁體中文語言包:ThinkPHP系統目錄/Lang/zh-tw.php
ThinkPHP系統美國英語語言包:ThinkPHP系統目錄/Lang/en-us.php
項目簡體中文語言包目錄:項目目錄/Lang/<項目分組/>zh-cn/
項目繁體中文語言包目錄:項目目錄/Lang/<項目分組/>zh-tw/
項目美國英語中文語言包目錄:項目目錄/Lang/<項目分組/>en-us/
如果有更多語言,可以按照例子依次創建文件或目錄即可。
項目多語言實例
下面以一個中英雙語的例子來看項目多語言支持的具體實現.
在項目目錄/Lang/zh-cn/ 下創建 common.php 文件,并在內設定簡體中文語言定義:
- <?php
- return array(
- 'welcome'=>'歡迎使用 ThinkPHP !',
- 'message'=>'這是一條測試消息!',
- );
- ?>
在項目目錄/Lang/en-us/ 下創建 common.php 文件,并在內設定美國英語語言定義:
- <?php
- return array(
- 'welcome'=>'Welcome to ThinkPHP!',
- 'message'=>'This is a test message!',
- );
- ?>
在操作中(如 Index 模塊 lang 操作)中:
- public function lang(){
- $this->assign('message', L('message'));
- $this->display();
- }
- 對應的模板(Tpl/default/Index/lang.html):
- <p>{$Think.lang.welcome}</p>
- <p>{$message}</p>
- <p>切換到:<a href="?l=zh-cn">簡體中文</a> | <a href="?l=en-us">English</a></p>
當我們訪問該操作時,系統會根據當前瀏覽器語言來自動獲取對應的語言包內容,上面的例子中,直接在模板中顯示的內容使用 {$Think.lang.welcome} 來輸出,而在操作中獲取語言包內容時,需要使用 L 快捷方法,當點擊 English 鏈接時,由于 URL 中傳入了 l=en-us 參數,系統會獲取對應的英語語言包,從而顯示:
Welcome to ThinkPHP!This is a test message!
L 快捷方法
L 快捷方法用于獲取和設置語言定義,語法如下:
L(name,value)
如果 name 和 value 參數都存在時,表示設定語言變量名 name=value,當 value 省略時,表示獲取 name 語言變量對應的值,若 name 未定義時,將 name 以大寫返回.
模塊定義語言包
當項目比較大時,可能需要按照模塊來定義語言包,按照模塊定義語言包時,語言包名字就是對應的模塊名字(小寫),如給 User 模塊定義語言包時,對應的語言包文件為:項目目錄/Lang/zh-cn/user.php.
對模塊定義語言包時,使用上與上面普通定義方式完全一致,當模塊語言包與普通語言包有相同的語言定義項時,模塊語言包的定義會覆蓋普通方式的定義.
項目模型里使用語言包
項目多語言支持中除了模板和模塊操作要用到語言包之外,在模型類里也可能需要用到語言包(如自動驗證的提示信息),要在項目模型里使用語言包,只需將原來寫入驗證規則的提示信息更改為:
array('title','require','{%vali_title}',1),
vali_title 是項目語言包里面定義的語言變量,如同例子上面定義 welcome 和 message 一樣,如果想測試多語言的效果,可以在表單提交的時候傳入 l 參數:
<form action="__URL__/insert/l/en-us" method="post">
注意:在提交表單里不可像前面列子使用 __URL__/insert?l=en-us 這種參數傳入形式,否則會導致“表單令牌錯誤”.
由于 ThinkPHP 具有自動檢測瀏覽器使用語言的功能,因此一般不需要在 URL 中傳入 l 參數,當然這不是絕對的,可以根據實際情況來決定.
新聞熱點
疑難解答
圖片精選