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