| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- <?php
- namespace App\Http\Middleware;
- use Closure;
- use Illuminate\Support\Facades\App;
- use Illuminate\Support\Facades\Session;
- class Localization
- {
- // 支持的语种
- protected $supportedLocales = ['zh_CN', 'zh_TW', 'en', 'ja', 'ko'];
- public function handle($request, Closure $next)
- {
- $locale = $this->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;
- }
- }
|