getLocaleFromRequest($request); // 设置应用语言环境 App::setLocale('zh_CN'); // 可选:将当前语言添加到响应头中 $response = $next($request); $response->header('Content-Language', $locale); return $response; } /** * 从请求中获取语言设置 */ protected function getLocaleFromRequest($request) { // 1. 优先从 Headers 获取 $locale = $request->header('lang') ?? $request->header('x-lang') ?? $request->header('accept-language'); // 2. 如果是 accept-language,提取主要语言 if ($locale && str_contains($locale, ',')) { $locale = strtok($locale, ','); } // 3. 规范化语言代码 $locale = $this->normalizeLocale($locale); // 4. 验证是否为支持的语种 if (!in_array($locale, $this->supportedLocales)) { return config('app.fallback_locale', 'en'); } return $locale; } /** * 规范化语言代码 */ protected function normalizeLocale($locale) { if (!$locale) { return config('app.locale', 'zh_CN'); } // 处理简写 $localeMap = [ 'zh' => 'zh_CN', 'zh-CN' => 'zh_CN', 'zh-cn' => 'zh_CN', 'zh-Hans' => 'zh_CN', 'zh-TW' => 'zh_TW', 'zh-Hant' => 'zh_TW', 'en-US' => 'en', 'en-GB' => 'en', 'ja-JP' => 'ja', 'ko-KR' => 'ko', 'chinese_simplified' => 'zh_CN', 'Chinese_simplified' => 'zh_CN', 'Chinese_Simplified' => 'zh_CN', 'ChineseSimplified' => 'zh_CN', 'chineseSimplified' => 'zh_CN', 'chinese_traditional' => 'zh_TW', 'Chinese_traditional' => 'zh_TW', 'Chinese_Traditional' => 'zh_TW', 'ChineseTraditional' => 'zh_TW', 'chineseTraditional' => 'zh_TW', 'english' => 'en', 'English' => 'en', 'japanese' => 'ja', 'Japanese' => 'ja', 'korean' => 'ko', 'Korean' => 'ko' ]; if (isset($localeMap[$locale])) { return $localeMap[$locale]; } // 保持原有格式或转换为下划线格式 return $locale; } }