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

