2
0

SetLocale.php 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. <?php
  2. namespace App\Http\Middleware;
  3. use Closure;
  4. use Illuminate\Support\Facades\App;
  5. use Illuminate\Support\Facades\Cookie;
  6. class SetLocale
  7. {
  8. public function handle($request, Closure $next)
  9. {
  10. // 支持的语言列表
  11. $supportedLocales = ['en', 'zh-Hans', 'zh-Hant'];
  12. $defaultLocale = config('app.locale', 'en');
  13. // 1. 检查 URL 参数中的 lang
  14. $locale = $request->query('lang');
  15. // 2. 如果没有 URL 参数,检查 Cookie 中的 language
  16. if (!$locale) {
  17. $locale = Cookie::get('language');
  18. }
  19. // 3. 如果没有 Cookie,检测浏览器语言
  20. if (!$locale) {
  21. $locale = $this->getBrowserLocale($request, $supportedLocales);
  22. }
  23. // 如果检测到的语言不在支持列表中,使用默认语言
  24. if (!in_array($locale, $supportedLocales)) {
  25. $locale = $defaultLocale;
  26. }
  27. // 设置应用语言
  28. App::setLocale($locale);
  29. // 存储到 Session 和 Cookie(可选:Cookie 有效期为 1 年)
  30. session(['locale' => $locale]);
  31. Cookie::queue('language', $locale, 525600); // 525600 分钟 = 1 年
  32. return $next($request);
  33. }
  34. /**
  35. * 从 HTTP Accept-Language 头获取浏览器语言
  36. *
  37. * @param \Illuminate\Http\Request $request
  38. * @param array $supportedLocales
  39. * @return string
  40. */
  41. protected function getBrowserLocale($request, $supportedLocales)
  42. {
  43. $acceptLanguage = $request->header('Accept-Language');
  44. if (!$acceptLanguage) {
  45. return config('app.locale', 'en');
  46. }
  47. // 解析 Accept-Language 头(格式如:zh-CN,zh;q=0.9,en;q=0.8)
  48. $languages = array_map(function ($lang) {
  49. return explode(';', $lang)[0]; // 提取语言代码(如 zh-CN, en)
  50. }, explode(',', $acceptLanguage));
  51. // 提取主语言代码并匹配支持的语言
  52. foreach ($languages as $lang) {
  53. $mainLang = explode('-', $lang)[0]; // 提取 zh 或 en
  54. if (in_array($mainLang, $supportedLocales)) {
  55. return $mainLang;
  56. }
  57. }
  58. // 如果没有匹配的语言,返回默认语言
  59. return config('app.locale', 'en');
  60. }
  61. }