一直以來(lái),在項(xiàng)目開(kāi)發(fā)中,都是以硬編碼方式返回中文文案或者提示信息的,如:
$rs['msg'] = '用戶不存在';
這種寫法在根本不需要考慮國(guó)際化翻譯的項(xiàng)目中是沒(méi)問(wèn)題的,但當(dāng)開(kāi)發(fā)的項(xiàng)目面向的是國(guó)際化用戶人群時(shí),使用i18n則是很有必要的。
在初始化文件./public/init.php
中,通過(guò)快速函數(shù)\PhalApi\SL($language)
可以設(shè)定當(dāng)前所使用的語(yǔ)言。例如設(shè)置語(yǔ)言為簡(jiǎn)體中文,可以:
// 翻譯語(yǔ)言包設(shè)定
\PhalApi\SL('zh_cn');
設(shè)定的語(yǔ)言即為語(yǔ)言目錄下對(duì)應(yīng)語(yǔ)言的目錄名稱,例如可以是:de、en、zh_cn、zh_tw等。
$ tree ./language/
./Language/
├── de
├── en
...
├── zh_cn
└── zh_tw
此處,也可以通過(guò)客戶端傳遞參數(shù)動(dòng)態(tài)選擇語(yǔ)言。簡(jiǎn)單地:
\PhalApi\SL(isset($_GET['lan'] ? $_GET['lan'] : 'zh_cn');
翻譯包的文件路徑為:./language/語(yǔ)言/common.php
,例如簡(jiǎn)體中文zh_cn對(duì)應(yīng)的翻譯包文件為:./Language/zh_cn/common.php
。此翻譯包文件返回的是一個(gè)數(shù)組,其中鍵為待翻譯的內(nèi)容,值為翻譯后的內(nèi)容。例如:
return array(
'Hi {name}, welcome to use PhalApi!' => '{name}您好,歡迎使用PhalApi!',
'user not exists' => '用戶不存在',
);
對(duì)于需要?jiǎng)討B(tài)替換的參數(shù),可以使用大括號(hào)括起來(lái),如名字參數(shù)name對(duì)應(yīng)為{name}。除了這種關(guān)聯(lián)數(shù)組的方式,還可以使用索引數(shù)組的方式來(lái)傳遞動(dòng)態(tài)參數(shù)。例如:
return array(
... ...
'I love {0} because {1}' => '我愛(ài){0},因?yàn)閧1}',
);
當(dāng)需要進(jìn)行翻譯時(shí),可以使用快速函數(shù)\PhalApi\T($msg, $params = array()),第一個(gè)參數(shù)為待翻譯的內(nèi)容,第二個(gè)參數(shù)為可選的動(dòng)態(tài)參數(shù)。例如前面的文案調(diào)整成:
$rs['msg'] = \PhalApi\T('user not exists');
最后顯示的內(nèi)容將是對(duì)應(yīng)翻譯包里的翻譯內(nèi)容,如這里對(duì)應(yīng)的是:
// 文件 ./language/zh_cn/common.php
return array(
... ...
'user not exists' => '用戶不存在',
);
當(dāng)翻譯中存在動(dòng)態(tài)參數(shù)時(shí),根據(jù)待翻譯中參數(shù)的傳遞方式,可以相應(yīng)提供對(duì)應(yīng)的動(dòng)態(tài)參數(shù)。例如對(duì)于關(guān)聯(lián)數(shù)組方式,可以:
// 輸出:dogstar您好,歡迎使用PhalApi!
echo \PhalApi\T('Hi {name}, welcome to use PhalApi!', array('name' => 'dogstar'));
關(guān)聯(lián)數(shù)組方式中參數(shù)的對(duì)應(yīng)關(guān)系由鍵名對(duì)應(yīng),而索引數(shù)組方式則要嚴(yán)格按參數(shù)出現(xiàn)的順序?qū)?yīng)傳值,例如:
// 輸出:我愛(ài)PhalApi,因?yàn)樗鼘W⒂诮涌陂_(kāi)發(fā)
echo \PhalApi\T('I love {0} because {1}', array('PhalApi', '它專注于接口開(kāi)發(fā)'));
若是翻譯不存在時(shí)怎么辦?翻譯不存在,有兩種情況:一種是指定的語(yǔ)言包不存在;另一種是語(yǔ)言包存在但翻譯不存在。無(wú)論何種情況,當(dāng)找不到翻譯時(shí),都會(huì)返回待翻譯時(shí)的內(nèi)容。
默認(rèn)的翻譯包存放在項(xiàng)目根目錄的language目錄下。當(dāng)需要添加其他路徑的翻譯包時(shí),例如在進(jìn)行擴(kuò)展類庫(kù)開(kāi)發(fā)時(shí)。
對(duì)于也擁有翻譯包的擴(kuò)展類庫(kù),其翻譯包文件可以放在擴(kuò)展類庫(kù)本身目錄的language子目錄中,其結(jié)構(gòu)一樣。但由于不在項(xiàng)目根目錄下,這時(shí)需要手動(dòng)引入翻譯包目錄,以便框架可以加載識(shí)別。當(dāng)需要加載其他路徑的翻譯包時(shí),可以使用PhalApi/Translator::addMessage($path)進(jìn)行添加,后面添加的翻譯包會(huì)覆蓋前面的翻譯包。例如User擴(kuò)展類庫(kù)中的:
PhalApi\Translator::addMessage('/path/to/user/language');
這樣,就可以添加/path/to/user/language
目錄下的翻譯包了。
更多建議: