SlugTranslateHandler.php 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. <?php
  2. namespace App\Handlers;
  3. use GuzzleHttp\Client;
  4. use Overtrue\Pinyin\Pinyin;
  5. class SlugTranslateHandler
  6. {
  7. public function translate($text)
  8. {
  9. // 实例化 HTTP 客户端
  10. $http = new Client;
  11. // 初始化配置信息
  12. $api = 'http://api.fanyi.baidu.com/api/trans/vip/translate?';
  13. $appid = config('services.baidu_translate.appid');
  14. $key = config('services.baidu_translate.key');
  15. $salt = time();
  16. // 如果没有配置百度翻译,自动使用兼容的拼音方案
  17. if (empty($appid) || empty($key)) {
  18. return $this->pinyin($text);
  19. }
  20. // 根据文档,生成 sign
  21. // http://api.fanyi.baidu.com/api/trans/product/apidoc
  22. // appid+q+salt+密钥 的MD5值
  23. $sign = md5($appid. $text . $salt . $key);
  24. // 构建请求参数
  25. $query = http_build_query([
  26. "q" => $text,
  27. "from" => "zh",
  28. "to" => "en",
  29. "appid" => $appid,
  30. "salt" => $salt,
  31. "sign" => $sign,
  32. ]);
  33. // 发送 HTTP Get 请求
  34. $response = $http->get($api.$query);
  35. $result = json_decode($response->getBody(), true);
  36. /**
  37. 获取结果,如果请求成功,dd($result) 结果如下:
  38. array:3 [▼
  39. "from" => "zh"
  40. "to" => "en"
  41. "trans_result" => array:1 [▼
  42. 0 => array:2 [▼
  43. "src" => "XSS 安全漏洞"
  44. "dst" => "XSS security vulnerability"
  45. ]
  46. ]
  47. ]
  48. **/
  49. // 尝试获取获取翻译结果
  50. if (isset($result['trans_result'][0]['dst'])) {
  51. return str_slug($result['trans_result'][0]['dst']);
  52. } else {
  53. // 如果百度翻译没有结果,使用拼音作为后备计划。
  54. return $this->pinyin($text);
  55. }
  56. }
  57. public function pinyin($text)
  58. {
  59. return str_slug(app(Pinyin::class)->permalink($text));
  60. }
  61. }