I18N 組件
I18N
國際多語言,允許讓您的項目支持多種語言
組件要求
- easyswoole/component: ^2.2
安裝方法
composer require easyswoole/i18n
倉庫地址
基本使用
在 swoole 中單獨使用
<?php
require_once __DIR__ . '/vendor/autoload.php';
use EasySwoole\I18N\AbstractDictionary;
use EasySwoole\I18N\I18N;
// 定義一個詞典。const 值請務必于 const 變量名一致,這樣是避免用戶手敲詞條名稱出錯
class Dictionary extends AbstractDictionary
{
const HELLO = 'HELLO';
const GOOD_MORNING = 'GOOD_MORNING';
const HOME = 'HOME';
}
// 定義一個中文語言包
class Chinese extends Dictionary
{
const HELLO = '你好';
const HOME = '主頁';
}
// 定義一個英文語言包
class English extends Dictionary
{
const HELLO = 'hello';
const GOOD_MORNING = 'Hi,good morning';
const HOME = 'home page';
}
// 注冊語言包
I18N::getInstance()->addLanguage(new Chinese(), 'Cn');
I18N::getInstance()->addLanguage(new English(), 'En');
// 設置默認語言包
I18N::getInstance()->setDefaultLanguage('Cn');
$http = new swoole_http_server('0.0.0.0', 9501);
$http->on('request', function (\Swoole\Http\Request $request, \Swoole\Http\Response $response) {
// 使用
$res = [];
$ret = I18N::getInstance()->translate(Dictionary::HELLO);
$res[] = $ret;
var_dump($ret); // string(6) "你好"
$ret = I18N::getInstance()->translate(Dictionary::GOOD_MORNING);
$res[] = $ret;
var_dump($ret); // string(12) "GOOD_MORNING"
$ret = I18N::getInstance()->sprintf('%s ! 歡迎到 %s !!!!',Dictionary::HELLO,Dictionary::HOME);
$res[] = $ret;
var_dump($ret); // string(30) "你好 ! 歡迎到 主頁 !!!!"
// setLanguage 僅僅會影響當前協程的語言
$ret = I18N::getInstance()->setLanguage('En')->translate(Dictionary::GOOD_MORNING);
$res[] = $ret;
var_dump($ret); // string(15) "Hi,good morning"
$response->header('Content-Type', 'text/html;charset=utf-8');
$response->end(json_encode($res, JSON_UNESCAPED_UNICODE));
});
$http->start();
訪問 http://localhost:9501/
(示例訪問請求地址) 即可看到如下結果:["你好","GOOD_MORNING","你好 ! 歡迎到 主頁 !!!!","Hi,good morning"]
在 EasySwoole 中使用
1. 定義語言包
新增如下文件:App\Languages\Dictionary.php
、App\Languages\Chinese.php
、App\Languages\English.php
內容如下:
<?php
namespace App\Languages;
use EasySwoole\I18N\AbstractDictionary;
// 定義一個詞典。
// const 值請務必于 const 變量名一致,這樣是避免用戶手敲詞條名稱出錯
class Dictionary extends AbstractDictionary
{
const HELLO = 'HELLO';
const GOOD_MORNING = 'GOOD_MORNING';
const HOME = 'HOME';
}
<?php
namespace App\Languages;
// 定義一個中文語言包
class Chinese extends Dictionary
{
const HELLO = '你好';
const GOOD_MORNING = '早上好';
const HOME = '主頁';
}
<?php
namespace App\Languages;
// 定義一個英文語言包
class English extends Dictionary
{
const HELLO = 'hello';
const GOOD_MORNING = 'Hi,good morning';
const HOME = 'home page';
}
2. 注冊語言包和注冊默認語言
在項目根目錄的 EasySwooleEvent.php
的 initialize
事件函數中進行注冊。
調用示例代碼如下:
<?php
namespace EasySwoole\EasySwoole;
use App\Languages\Chinese;
use App\Languages\English;
use EasySwoole\EasySwoole\AbstractInterface\Event;
use EasySwoole\EasySwoole\Swoole\EventRegister;
use EasySwoole\Http\Request;
use EasySwoole\Http\Response;
use EasySwoole\I18N\I18N;
class EasySwooleEvent implements Event
{
public static function initialize()
{
date_default_timezone_set('Asia/Shanghai');
// 注冊語言包
I18N::getInstance()->addLanguage(new Chinese(), 'Cn');
I18N::getInstance()->addLanguage(new English(), 'En');
\EasySwoole\Component\Di::getInstance()->set(\EasySwoole\EasySwoole\SysConst::HTTP_GLOBAL_ON_REQUEST, function (Request $request, Response $response) {
// 獲取 header 中 language 參數
$lang = $request->getHeader('language');
if (empty($lang)) {
$lang = 'Cn';
}
// 設置默認語言包
I18N::getInstance()->setDefaultLanguage($lang);
return true;
});
}
public static function mainServerCreate(EventRegister $register)
{
}
}
3. 在控制器中進行調用
<?php
namespace App\HttpController;
use App\Languages\Dictionary;
use EasySwoole\Http\AbstractInterface\Controller;
use EasySwoole\I18N\I18N;
class Index extends Controller
{
function index()
{
// 使用
$rets = [];
$ret = I18N::getInstance()->translate(Dictionary::HELLO);
$rets[] = $ret;
var_dump($ret); // 你好
$ret = I18N::getInstance()->translate(Dictionary::GOOD_MORNING);
$rets[] = $ret;
var_dump($ret); // GOOD_MORNING
$ret = I18N::getInstance()->sprintf('%s ! 歡迎到 %s !!!!', Dictionary::HELLO, Dictionary::HOME);
$rets[] = $ret;
var_dump($ret); // "你好 ! 歡迎到 主頁 !!!!
// setLanguage 僅僅會影響當前協程的語言
$ret = I18N::getInstance()->setLanguage('En')->translate(Dictionary::GOOD_MORNING);
$rets[] = $ret;
var_dump($ret); // Hi,good morning
$this->writeJson(200, $rets, 'success!');
}
}
運行結果:訪問 http://localhost:9501/
(示例訪問地址) 即可看到如下結果:{"code":200,"result":["你好","早上好","你好 ! 歡迎到 主頁 !!!!","Hi,good morning"],"msg":"success!"}
提示
- 可以在
EasySwoole
的 initialize 初始化事件 中做好語言包的注冊和默認語言的注冊。 - 可以在全局的 onRequest 事件,根據
header
或者是其他參數,調用setLanguage
方法修改當次請求的語言