Laravel登录后通过中间件设置Locale翻译不生效问题求助
问题根因
1. 中间件执行逻辑顺序错误
你当前的中间件代码中先执行了$next($request),该方法会完成路由逻辑处理、视图渲染、生成响应的全流程,之后才设置应用语言,此时设置的语言对已经生成的响应不会产生任何效果,自然看不到翻译结果。
2. 语言值读取逻辑错误
代码中session(Auth::user()->language)的作用是从会话中读取键名等于用户language字段值的变量,而非直接使用用户的language字段值作为语言标识。你已经确认Auth::user()->language可以返回正确的语言值,不需要额外套session()方法读取。
解决方案
第一步:修正ChangeLang中间件代码
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Auth; class ChangeLang { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle(Request $request, Closure $next) { // 先设置应用语言,再处理请求 if (Auth::check()) { app()->setLocale(Auth::user()->language); } else { // 可选:未登录用户使用配置的默认语言 app()->setLocale(config('app.locale')); } return $next($request); } }
第二步:确认配置有效性
你将中间件放在web路由组的配置是正确的,不需要调整位置,web组包含Session、用户认证等必要中间件,刚好满足读取登录用户信息的需求。
额外校验点
如果修改后还是不生效,请检查以下配置:
- 语言文件存放在
resources/lang/对应语言目录下,例如简体中文对应resources/lang/zh-CN/目录,翻译文件格式符合Laravel规范 - 代码中需要翻译的文本使用了
__()、trans()辅助函数或者@lang()Blade指令,硬编码的文本不会自动翻译 - 确认
Auth::user()->language返回的取值和语言目录名完全一致,比如返回zh-CN就要对应zh-CN目录,大小写、分隔符都要匹配
内容的提问来源于stack exchange,提问作者El Hombre Sin Nombre
相关产品推荐
相关产品推荐

