LoadLocale.php 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. <?php
  2. namespace App\Http\Middleware;
  3. use Closure;
  4. use Illuminate\Http\Request;
  5. use Illuminate\Support\Facades\App;
  6. /**
  7. * 读取语言环境
  8. *
  9. */
  10. class LoadLocale
  11. {
  12. /**
  13. * 处理传入请求
  14. * @param \Illuminate\Http\Request $request
  15. * @param \Closure $next
  16. * @return mixed
  17. */
  18. public function handle(Request $request, Closure $next)
  19. {
  20. // 设置语言
  21. $request = $this->setLocale($request);
  22. // 返回结果
  23. return $next($request);
  24. }
  25. /**
  26. * 自动侦测当前语言
  27. * @param \Illuminate\Http\Request $request
  28. */
  29. private function setLocale(Request $request){
  30. // 默认语言
  31. $langSet = config('lang.default_lang','en');
  32. // 多语言自动侦测变量名
  33. if ($request->get(config('lang.detect_var','lang'))) {
  34. // url中设置了语言变量
  35. $langSet = strtolower($request->get(config('lang.detect_var','lang')));
  36. } elseif ($request->header(config('lang.header_var','lang'))) {
  37. // Header中设置了语言变量
  38. $langSet = strtolower($request->header(config('lang.header_var','lang')));
  39. } elseif ($request->cookie(config('lang.cookie_var','lang'))) {
  40. // Cookie中设置了语言变量
  41. $langSet = strtolower($request->cookie(config('lang.cookie_var','lang')));
  42. } elseif ($request->server('HTTP_ACCEPT_LANGUAGE')) {
  43. // 自动侦测浏览器语言
  44. $match = preg_match('/^([a-z\d\-]+)/i', $request->server('HTTP_ACCEPT_LANGUAGE'), $matches);
  45. // 如果有匹配语言,获取第一条语言
  46. if ($match) $langSet = strtolower($matches[1]);
  47. }
  48. // 统一分割符号
  49. $langSet = str_ireplace('_','-',$langSet);
  50. // 允许语言列表
  51. $allow_lang_list = config('lang.allow_lang_list');
  52. // 如果不在允许语言内,使用默认语言
  53. if( !empty($allow_lang_list) && !in_array($langSet,$allow_lang_list) ) $langSet = config('lang.default_lang','en');
  54. // 请求语言设置为最终语言
  55. $request->lang = $langSet;
  56. // 设置语言
  57. App::setLocale($langSet);
  58. // 返回结果
  59. return $request;
  60. }
  61. }