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

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);
}

验证修复

  1. 清除浏览器缓存和Session
  2. 重新选择语言,此时中间件应该能正确读取到session中的locale值,应用语言也会随之切换。

内容的提问来源于stack exchange,提问作者Jessica Thedoc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 14:05:31