Laravel中间件设置Locale翻译失效问题求助
问题分析与解决方案
你的核心问题是Localization中间件注册位置错误,导致中间件执行时Session尚未初始化,无法读取到已设置的locale值,因此应用始终使用默认的pt-BR语言。
问题根源
Laravel的全局中间件($middleware数组)会在所有请求最开始执行,而Session的初始化中间件(StartSession)属于web中间件组,执行时机晚于全局中间件。因此你的Localization中间件在全局数组里时,session()->has('locale')永远返回false,自然不会修改应用的locale。而视图能读取到session值,是因为视图渲染发生在路由处理之后,此时Session已经完成初始化。
修复步骤
1. 调整中间件注册位置
打开app/Http/Kernel.php,将Localization中间件从全局$middleware数组中移除,添加到web中间件组里,且必须放在StartSession中间件之后:
protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, // 把Localization放在StartSession之后 \App\Http\Middleware\Localization::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, ], ];
2. 修复Carbon引用(必要)
你的中间件中使用了Carbon::setLocale()但未引入Carbon类,需要在中间件顶部添加引用:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Illuminate\Support\Facades\App; use Carbon\Carbon; // 添加这一行 class Localization { // ... 其余代码不变 }
3. 优化中间件逻辑(可选)
可以添加默认语言 fallback,确保当session没有locale时,也能正确处理:
public function handle(Request $request, Closure $next) { $locale = session()->get('locale', config('app.locale')); Carbon::setLocale($locale); App::setLocale($locale); return $next($request); }
验证修复
- 清除浏览器缓存和Session
- 重新选择语言,此时中间件应该能正确读取到session中的locale值,应用语言也会随之切换。
内容的提问来源于stack exchange,提问作者Jessica Thedoc
相关产品推荐
相关产品推荐

