Laravel本地化语言无法切换问题解决:如何实现网页语言切换
解决Laravel本地化语言切换不生效的问题
嘿,我来帮你搞定这个问题!你当前的代码只是在单次请求里临时设置了Locale,但Laravel默认不会把这个设置持久化,所以下次请求又会回到默认语言。咱们一步步来修复:
1. 持久化用户选择的语言(用Session)
首先修改你的路由,把用户选择的语言存入Session,这样后续请求能读取到这个设置:
Route::get('/{lang?}', function($lang = null){ // 先定义支持的语言列表,避免非法值 $allowedLangs = ['en', 'zh-CN', 'ja']; // 替换成你实际支持的语言 if ($lang && in_array($lang, $allowedLangs)) { // 把语言存入Session session()->put('locale', $lang); // 立即设置当前请求的Locale App::setLocale($lang); } else { // 没有传合法语言时,优先用Session里的设置,否则用系统默认 App::setLocale(session()->get('locale', config('app.locale'))); } return view('frontend.home'); });
2. 创建中间件自动应用语言设置
上面的代码只有访问这个路由时才会设置语言,但其他页面请求不会生效。咱们需要一个中间件,让所有Web请求都自动读取Session里的语言并应用:
首先生成中间件:
php artisan make:middleware SetLocale
然后打开app/Http/Middleware/SetLocale.php,替换成以下内容:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Support\Facades\App; class SetLocale { public function handle($request, Closure $next) { // 如果Session里有语言设置,就应用它 if (session()->has('locale')) { App::setLocale(session()->get('locale')); } return $next($request); } }
最后把这个中间件加到app/Http/Kernel.php的web中间件组里(这样所有Web请求都会经过它):
找到$middlewareGroups['web']数组,添加一行:
\App\Http\Middleware\SetLocale::class,
3. 验证语言文件与视图调用
确保你的语言文件放在正确的位置:比如resources/lang/en/messages.php(英文)、resources/lang/zh-CN/messages.php(中文),并且视图里用Laravel的翻译函数调用内容,比如:
{{ __('messages.welcome') }} {{ __('welcome') }} <!-- 如果直接在语言文件根目录定义键值 -->
可选:用Cookie持久化(跨会话保留语言)
如果希望用户关闭浏览器再打开时,语言设置依然保留,可以把Session换成Cookie:
- 路由里替换
session()->put(...)为:cookie()->forever('locale', $lang); - 中间件里替换
session()->has(...)和session()->get(...)为:if (cookie()->has('locale')) { App::setLocale(cookie()->get('locale')); }
现在测试一下:访问/en切换英文,/zh-CN切换中文,刷新其他页面,语言应该就能保持住了!
内容的提问来源于stack exchange,提问作者user19648060
相关产品推荐
相关产品推荐

