Localization.php 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. <?php
  2. namespace App\Http\Middleware;
  3. use Closure;
  4. use Illuminate\Support\Facades\App;
  5. use Illuminate\Support\Facades\Session;
  6. class Localization
  7. {
  8. // 支持的语种
  9. protected $supportedLocales = ['zh_CN', 'zh_TW', 'en', 'ja', 'ko'];
  10. public function handle($request, Closure $next)
  11. {
  12. $locale = $this->getLocaleFromRequest($request);
  13. // 设置应用语言环境
  14. App::setLocale('zh_CN');
  15. // 可选:将当前语言添加到响应头中
  16. $response = $next($request);
  17. $response->header('Content-Language', $locale);
  18. return $response;
  19. }
  20. /**
  21. * 从请求中获取语言设置
  22. */
  23. protected function getLocaleFromRequest($request)
  24. {
  25. // 1. 优先从 Headers 获取
  26. $locale = $request->header('lang') ??
  27. $request->header('x-lang') ??
  28. $request->header('accept-language');
  29. // 2. 如果是 accept-language,提取主要语言
  30. if ($locale && str_contains($locale, ',')) {
  31. $locale = strtok($locale, ',');
  32. }
  33. // 3. 规范化语言代码
  34. $locale = $this->normalizeLocale($locale);
  35. // 4. 验证是否为支持的语种
  36. if (!in_array($locale, $this->supportedLocales)) {
  37. return config('app.fallback_locale', 'en');
  38. }
  39. return $locale;
  40. }
  41. /**
  42. * 规范化语言代码
  43. */
  44. protected function normalizeLocale($locale)
  45. {
  46. if (!$locale) {
  47. return config('app.locale', 'zh_CN');
  48. }
  49. // 处理简写
  50. $localeMap = [
  51. 'zh' => 'zh_CN',
  52. 'zh-CN' => 'zh_CN',
  53. 'zh-cn' => 'zh_CN',
  54. 'zh-Hans' => 'zh_CN',
  55. 'zh-TW' => 'zh_TW',
  56. 'zh-Hant' => 'zh_TW',
  57. 'en-US' => 'en',
  58. 'en-GB' => 'en',
  59. 'ja-JP' => 'ja',
  60. 'ko-KR' => 'ko',
  61. 'chinese_simplified' => 'zh_CN',
  62. 'Chinese_simplified' => 'zh_CN',
  63. 'Chinese_Simplified' => 'zh_CN',
  64. 'ChineseSimplified' => 'zh_CN',
  65. 'chineseSimplified' => 'zh_CN',
  66. 'chinese_traditional' => 'zh_TW',
  67. 'Chinese_traditional' => 'zh_TW',
  68. 'Chinese_Traditional' => 'zh_TW',
  69. 'ChineseTraditional' => 'zh_TW',
  70. 'chineseTraditional' => 'zh_TW',
  71. 'english' => 'en',
  72. 'English' => 'en',
  73. 'japanese' => 'ja',
  74. 'Japanese' => 'ja',
  75. 'korean' => 'ko',
  76. 'Korean' => 'ko'
  77. ];
  78. if (isset($localeMap[$locale])) {
  79. return $localeMap[$locale];
  80. }
  81. // 保持原有格式或转换为下划线格式
  82. return $locale;
  83. }
  84. }