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