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

Laravel内置多语言功能异常:会话Locale切换后翻译未生效

Laravel语言切换后翻译不生效的解决方案

你遇到的问题核心是仅在切换语言的请求里设置了App的locale,但重定向后的新请求会回到配置文件的默认locale——Laravel的每个HTTP请求都是独立的,控制器里的App::setLocale($locale)只对当前请求有效,下一次请求不会保留这个设置。

以下是解决步骤:

1. 创建设置语言的中间件

首先生成一个中间件,用来在每次请求开始时根据session里存储的语言设置应用locale:

php artisan make:middleware SetLocale

打开生成的app/Http/Middleware/SetLocale.php,修改handle方法:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;

class SetLocale
{
    public function handle(Request $request, Closure $next)
    {
        // 验证session中的语言是否为我们支持的类型
        if ($request->session()->has('locale') && in_array($request->session()->get('locale'), ['en', 'fr', 'ar'])) {
            App::setLocale($request->session()->get('locale'));
        }

        return $next($request);
    }
}

2. 注册中间件

打开app/Http/Kernel.php,将刚才的中间件添加到web中间件组中(web组包含session支持,能正常读取session数据):

protected $middlewareGroups = [
    'web' => [
        // 保留已有的其他中间件...
        \App\Http\Middleware\SetLocale::class,
    ],
    // ...
];

3. 优化LocaleController(可选)

现在中间件会自动处理所有请求的locale设置,控制器里只需负责存储合法的语言到session即可:

public function setLocale($locale)
{
    // 先校验语言合法性,防止非法值存入session
    if (in_array($locale, ['en', 'fr', 'ar'])) {
        session()->put('locale', $locale);
    }
    return redirect()->back();
}

验证翻译文件

最后确认resources/lang/fr/messages.php的内容正确:

<?php

return [
    'welcome' => 'Bienvenue',
];

完成以上步骤后,再次点击语言切换按钮,重定向后的页面就会正确显示对应语言的翻译内容了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 23:17:35