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
相关产品推荐
相关产品推荐

