1 回答

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