_Your new understanding has made you powerful. Please use your new powers for good._
##1.25.1 固定的中文寫法
一直以來,我們都是硬編碼方式返回中文的文案或者提示,如:
```javascript
$rs['msg'] = '用戶不存在';
```
這種寫法在項目根本不需要考慮國際化翻譯時,是完全沒問題的。
##1.25.2 通用的翻譯寫法
當我們需要進行翻譯時,可以這樣進行調整:
```javascript
$rs['msg'] = T('user not exists');
```
然后在對應的翻譯文件中(如中文對應文件是:./Language/zh_cn/common.php)添加對應的翻譯即可:
```javascript
// $vim ./Language/zh_cn/common.php
return array(
'user not exists' => '用戶不存在',
);
```
###(1)當存在動態變量時?
有時,我們需要動態返回一些值,這里可以用 **大括號** 將需要動態替換的值包住并提供替換的參數即可,一如:
```javascript
echo T('hello {name}', array('name' => 'dogstar'));
```
如果對應的中文翻譯是:
```javascript
'hello {name}' => '您好,{name}',
```
將會看到輸出:
```javascript
您好,dogstar
```
###(2)當多個動態變量時,還可以這樣省略變量名
如果要簡化動態變量的傳遞,可以這樣:
```javascript
echo T('{0} I love you because {1}', array('PhalApi', 'no reasons'));
```
如果對應的中文翻譯是:
```javascript
'{0} I love you because {1}' => '{0} 我愛你因為{1}',
```
將會看到輸出:
```javascript
PhalApi 我愛你因為no reasons
```
###(3)當翻譯不存在時?
翻譯不存在,有兩種場景:一是指定的語言包不存在;二是語言包存在但翻譯不存在。無論何種情況,找不到翻譯時,都會用代碼硬編碼的內容返回。
##1.25.3 語言的設定
當我們擁有了多種語言時,則可以在入口/初始化文件中,選擇設定需要的語言。
```javascript
SL('zh_cn'); //SL()函數等效于PhalApi_Translator::setLanguage()
```
參數即為語言包的路徑名,如下面的en, zh_cn:
```javascript
.
|-- en
| `-- common.php
`-- zh_cn
`-- common.php
```
此處,也可以通過客戶端傳遞參數來自行選擇語言。簡單地:
```javascript
SL($_GET['lan']);
```
##1.25.4 添加語言翻譯包
有時需要手動添加語言翻譯包,因為對應的翻譯不一定在項目的./Language下,如擴展類庫。
當需要添加額外的語言翻譯包時,可以這樣添加:
```
PhalApi_Translator::addMessage(API_ROOT . '/Library/User');
```
在User這個目錄下的翻譯包類似地,為:
```
./Language/
└── zh_cn
└── common.php
1 directory, 1 file
```
相當于追加一個額外的項目路徑,其他的加載過程和原來的一樣。
##1.25.5 建議
所以,你可以輕松看到,所謂的翻譯也只是通過數組下標找一下對應的內容而已,沒有太多的技術性,也沒有過多的性能問題。
但正是有這樣提前周到的國際化準備,我們可以對外(如像產品、BOSS和外界)傳送這樣一個隱喻: **我們的項目可以快速支持國際翻譯** 。
這聽起來多么高大尚啊!因為那些不懂技術的人,根本不在乎是用PHP的數組來存放還是什么技術,而在于能不能走向國際化。
SO?既然翻譯”無傷大雅“(指對性能的影響和對代碼編寫的阻礙),統一使用翻譯的寫法是值得推薦的。
即使項目沒有機會用到真正的翻譯,但至少有兩點我認為也是有用的:
+ 1、便于產品維護接口返回的提示文案;
+ 2、被同行問到時,你們有支持i18n嗎?我們也可以笑著回答:有 ^_^ ;
- 歡迎使用PhalApi!
- 接口,從簡單開始!
- [1.1]-下載與安裝
- [1.2]-創建一個自己的項目
- [1.3]-在線體驗
- [1.4]-文檔、幫助和官網
- [1.10]-對PhalApi框架的抉擇
- [1.11]-快速入門(backup)
- [1.12]-參數規則:接口參數規則配置
- [1.13]-統一的接口請求方式:_sevice=XXX.XXX
- [1.14]-統一的返回格式和結構:ret-data-msg
- [1.15]-數據庫操作:基于NotORM的使用及優化
- [1.16]-配置讀取:內外網環境配置的完美切換
- [1.17]-日記紀錄:簡化版的日記接口
- [1.18]-快速函數:人性化的關懷
- [1.19]-DI服務速查:各資源服務一覽表
- [1.20]-DB操作:數據庫基本操作速查
- [1.21]-類的自動加載:遵循PEAR包的命名規范
- [1.22]-簽名驗證:自定義簽名規則
- [1.23]-請求和響應:GET和POST兩者皆可得及超越JSON格式返回
- [1.24]-緩存策略:更靈活地可配置化的多級緩存
- [1.25]-國際化翻譯:為走向國際化提前做好翻譯準備
- [1.26]-數據安全:數據對稱加密方案
- [1.27]-精益開發:更富表現力的Model層和重量級數據獲取的應對方案
- [1.28]-COOKIE:對COOKIE原生態的支持及記憶加密升級版
- [1.29]-開放與封閉:多入口和統一初始化
- [1.30]-保持的力量:接口開發最佳實踐
- [1.31]-新型計劃任務:以接口形式實現的計劃任務
- [2.11]-核心思想:DI依賴注入-讓資源更可控
- [2.12]-海量數據:可配置的分庫分表
- [2.13]-接口調試:在線SQL語句查看與性能優化
- [2.14]-測試驅動開發:意圖導向編程下的接口開發
- [2.15]-演進:新型計劃任務續篇
- [2.16]-領域驅動設計:應對復雜領域業務的Domain層
- [2.17]-微服務:Api接口服務層
- [2.18]-定制化:資源服務的再實現
- [2.19]-擴展庫:可重用的擴展類庫
- [2.20]-約定編程:架構明顯的編程風格
- [2.21]-服務器統一部署方案簡明版:CentOs---Nginx---php-fpm---MySql-[--Memcached]
- [2.22]-更多工具:精益項目和團隊建設
- [3.1]-擴展類庫:微信開發
- [3.2]-擴展類庫:代理模式下phprpc協議的輕松支持
- [3.3]-擴展類庫:基于PHPMailer的郵件發送
- [3.4]-擴展類庫:優酷開放平臺接口調用
- [3.5]-擴展類庫:七牛云存儲接口調用
- [3.6]-擴展類庫:新型計劃任務
- [3.8]-擴展類庫:用戶、會話和第三方登錄集成
- [3.9]-擴展類庫:swoole支持下的長鏈接和異步任務實現
- [3.11]-擴展類庫:基于FastRoute的快速路由
- [4.2]-開發實戰2:模擬優酷開放平臺接口項目開發
- [4.3]-開發實戰3:一個簡單的小型項目開發(奔跑吧兄弟投票活動)
- [5.1]-架構與思想:PhalApi核心設計和思想解讀
- [5.2]-雜談:扯一些PhalApi的前世和今生
- [5.3]-框架總結:術語表和PHP開發建議
- [5.4]-許可
- [5.5]-聯系和加入我們
- [5.6]-更新日記
- [5.8]-致框架貢獻者:加入PhalApi開源指南
- [6.1]-基于接口查詢語言的SDK包
- [6.2]-SDK包(JAVA版)
- [6.3]-SDK包(PHP版)
- [6.4]-SDK包(Objective-C版)
- [6.5]-SDK包(javascript版)
- [6.6]-SDK包(Ruby版)
- [8.1]-PhalApi視頻教程
- 附錄1:接口文檔參考模板