You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 04:03:00