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

Laravel 5.2 本地化问题:App::setLocale设值无效,翻译未生效求助

排查Laravel 5.2多语言翻译失效&App::setLocale为null的问题

看了你的代码和描述,核心问题出在中间件逻辑错误,还有几个关键细节没处理到位,我帮你一步步梳理修复:

1. 中间件完全忽略了Session里的用户选择

你的Localization中间件现在每次请求都强制把locale设为env('APP_LOCALE'),完全没用到控制器存在session里的locale值——这就导致用户选完语言后,下一次请求直接被打回默认语言了。另外直接用env()读取配置在生产环境会有坑(配置缓存后env函数会失效),应该改用config('app.locale')。

修复后的中间件代码:

class Localization { 
    public function handle($request, Closure $next) { 
        // 优先读取用户存在session里的语言选择,没有则用系统默认配置
        $locale = session()->get('locale', config('app.locale'));
        App::setLocale($locale); 

        return $next($request); 
    } 
}

2. 确保中间件在正确位置注册

Laravel 5.2里,要读取session的中间件必须放在StartSession中间件之后,不然请求到你的Localization中间件时,session还没初始化,根本读不到值。

打开app/Http/Kernel.php,找到$middlewareGroups里的web组,把你的Localization中间件加到StartSession之后:

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        // 把你的中间件放在这个位置
        \App\Http\Middleware\Localization::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],
    // ...其他中间件组
];

如果需要单独给路由绑定这个中间件,还要在$routeMiddleware里注册别名:

protected $routeMiddleware = [
    // ...其他已注册的中间件别名
    'localization' => \App\Http\Middleware\Localization::class,
];

3. 解决App::setLocale为null的问题

如果还是出现locale被设为null的情况,排查这两个点:

  • 路由必须在web中间件组内:Laravel 5.2默认分web和api路由组,只有web组会启动session,不然控制器里的session()->put()根本存不进去。把你的语言切换路由放到web组里:
Route::group(['middleware' => 'web'], function() {
    Route::get('lang/{locale}', 'LocalizationController@index');
    // 其他前端路由也放这里
});
  • 验证传入的locale合法性:控制器里没有校验用户传入的$locale是不是你支持的语言(en/ro/pk),如果传了一个不存在的值,App::setLocale会自动设为null。加个简单的校验:
public function index($locale) { 
    // 只允许你支持的语言类型
    $allowedLocales = ['en', 'ro', 'pk'];
    if (!in_array($locale, $allowedLocales)) {
        $locale = config('app.locale');
    }
    App::setLocale($locale); 
    session()->put('locale', $locale); 
    return redirect()->back(); 
}

4. 翻译文件的小细节确认

你的ro.json用的是JSON格式翻译,Laravel 5.2支持这种方式,但要注意:

  • JSON文件的键名必须和视图里__('Hi there!')的调用完全一致,包括大小写、空格和标点。
  • 语言文件夹的命名要和你传入的locale参数完全匹配(比如ro文件夹对应ro参数)。

最后清理下配置缓存(如果之前缓存过的话):

php artisan config:clear

按照这些步骤调整后,应该就能正常切换语言了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 13:42:58