I18N 组件

I18N 国际多语言,允许让您的项目支持多种语言

组件要求

  • easyswoole/component: ^2.2

安装方法

composer require easyswoole/i18n

仓库地址

easyswoole/i18n

基本使用

在 swoole 中单独使用

  1. <?php
  2. require_once __DIR__ . '/vendor/autoload.php';
  3. use EasySwoole\I18N\AbstractDictionary;
  4. use EasySwoole\I18N\I18N;
  5. // 定义一个词典。const 值请务必于 const 变量名一致,这样是避免用户手敲词条名称出错
  6. class Dictionary extends AbstractDictionary
  7. {
  8. const HELLO = 'HELLO';
  9. const GOOD_MORNING = 'GOOD_MORNING';
  10. const HOME = 'HOME';
  11. }
  12. // 定义一个中文语言包
  13. class Chinese extends Dictionary
  14. {
  15. const HELLO = '你好';
  16. const HOME = '主页';
  17. }
  18. // 定义一个英文语言包
  19. class English extends Dictionary
  20. {
  21. const HELLO = 'hello';
  22. const GOOD_MORNING = 'Hi,good morning';
  23. const HOME = 'home page';
  24. }
  25. // 注册语言包
  26. I18N::getInstance()->addLanguage(new Chinese(), 'Cn');
  27. I18N::getInstance()->addLanguage(new English(), 'En');
  28. // 设置默认语言包
  29. I18N::getInstance()->setDefaultLanguage('Cn');
  30. $http = new swoole_http_server('0.0.0.0', 9501);
  31. $http->on('request', function (\Swoole\Http\Request $request, \Swoole\Http\Response $response) {
  32. // 使用
  33. $res = [];
  34. $ret = I18N::getInstance()->translate(Dictionary::HELLO);
  35. $res[] = $ret;
  36. var_dump($ret); // string(6) "你好"
  37. $ret = I18N::getInstance()->translate(Dictionary::GOOD_MORNING);
  38. $res[] = $ret;
  39. var_dump($ret); // string(12) "GOOD_MORNING"
  40. $ret = I18N::getInstance()->sprintf('%s ! 欢迎到 %s !!!!',Dictionary::HELLO,Dictionary::HOME);
  41. $res[] = $ret;
  42. var_dump($ret); // string(30) "你好 ! 欢迎到 主页 !!!!"
  43. // setLanguage 仅仅会影响当前协程的语言
  44. $ret = I18N::getInstance()->setLanguage('En')->translate(Dictionary::GOOD_MORNING);
  45. $res[] = $ret;
  46. var_dump($ret); // string(15) "Hi,good morning"
  47. $response->header('Content-Type', 'text/html;charset=utf-8');
  48. $response->end(json_encode($res, JSON_UNESCAPED_UNICODE));
  49. });
  50. $http->start();

访问 http://localhost:9501/ (示例访问请求地址) 即可看到如下结果:["你好","GOOD_MORNING","你好 ! 欢迎到 主页 !!!!","Hi,good morning"]

在 EasySwoole 中使用

1. 定义语言包

新增如下文件:App\Languages\Dictionary.phpApp\Languages\Chinese.phpApp\Languages\English.php

内容如下:

  1. <?php
  2. namespace App\Languages;
  3. use EasySwoole\I18N\AbstractDictionary;
  4. // 定义一个词典。
  5. // const 值请务必于 const 变量名一致,这样是避免用户手敲词条名称出错
  6. class Dictionary extends AbstractDictionary
  7. {
  8. const HELLO = 'HELLO';
  9. const GOOD_MORNING = 'GOOD_MORNING';
  10. const HOME = 'HOME';
  11. }
  1. <?php
  2. namespace App\Languages;
  3. // 定义一个中文语言包
  4. class Chinese extends Dictionary
  5. {
  6. const HELLO = '你好';
  7. const GOOD_MORNING = '早上好';
  8. const HOME = '主页';
  9. }
  1. <?php
  2. namespace App\Languages;
  3. // 定义一个英文语言包
  4. class English extends Dictionary
  5. {
  6. const HELLO = 'hello';
  7. const GOOD_MORNING = 'Hi,good morning';
  8. const HOME = 'home page';
  9. }

2. 注册语言包和注册默认语言

在项目根目录的 EasySwooleEvent.phpinitialize 事件函数中进行注册。

调用示例代码如下:

  1. <?php
  2. namespace EasySwoole\EasySwoole;
  3. use App\Languages\Chinese;
  4. use App\Languages\English;
  5. use EasySwoole\EasySwoole\AbstractInterface\Event;
  6. use EasySwoole\EasySwoole\Swoole\EventRegister;
  7. use EasySwoole\Http\Request;
  8. use EasySwoole\Http\Response;
  9. use EasySwoole\I18N\I18N;
  10. class EasySwooleEvent implements Event
  11. {
  12. public static function initialize()
  13. {
  14. date_default_timezone_set('Asia/Shanghai');
  15. // 注册语言包
  16. I18N::getInstance()->addLanguage(new Chinese(), 'Cn');
  17. I18N::getInstance()->addLanguage(new English(), 'En');
  18. \EasySwoole\Component\Di::getInstance()->set(\EasySwoole\EasySwoole\SysConst::HTTP_GLOBAL_ON_REQUEST, function (Request $request, Response $response) {
  19. // 获取 header 中 language 参数
  20. $lang = $request->getHeader('language');
  21. if (empty($zh)) {
  22. $lang = 'Cn';
  23. }
  24. // 设置默认语言包
  25. I18N::getInstance()->setDefaultLanguage($lang);
  26. return true;
  27. });
  28. }
  29. public static function mainServerCreate(EventRegister $register)
  30. {
  31. }
  32. }

3. 在控制器中进行调用

  1. <?php
  2. namespace App\HttpController;
  3. use App\Languages\Dictionary;
  4. use EasySwoole\Http\AbstractInterface\Controller;
  5. use EasySwoole\I18N\I18N;
  6. class Index extends Controller
  7. {
  8. function index()
  9. {
  10. // 使用
  11. $rets = [];
  12. $ret = I18N::getInstance()->translate(Dictionary::HELLO);
  13. $rets[] = $ret;
  14. var_dump($ret); // 你好
  15. $ret = I18N::getInstance()->translate(Dictionary::GOOD_MORNING);
  16. $rets[] = $ret;
  17. var_dump($ret); // GOOD_MORNING
  18. $ret = I18N::getInstance()->sprintf('%s ! 欢迎到 %s !!!!', Dictionary::HELLO, Dictionary::HOME);
  19. $rets[] = $ret;
  20. var_dump($ret); // "你好 ! 欢迎到 主页 !!!!
  21. // setLanguage 仅仅会影响当前协程的语言
  22. $ret = I18N::getInstance()->setLanguage('En')->translate(Dictionary::GOOD_MORNING);
  23. $rets[] = $ret;
  24. var_dump($ret); // Hi,good morning
  25. $this->writeJson(200, $rets, 'success!');
  26. }
  27. }

运行结果:访问 http://localhost:9501/(示例访问地址) 即可看到如下结果:{"code":200,"result":["你好","早上好","你好 ! 欢迎到 主页 !!!!","Hi,good morning"],"msg":"success!"}

提示

  • 可以在 EasySwooleinitialize 初始化事件 中做好语言包的注册和默认语言的注册。
  • 可以在全局的 onRequest 事件,根据 header 或者是其他参数,调用 setLanguage 方法修改当次请求的语言