laravel后台中英文切换需三步:设.env的app_locale=zh、建resources/lang/zh|en/messages.php、用中间件setuserlocale动态设locale;缺一将返回键名而非翻译。

要在Laravel后台快速启用中英文切换,必须让__('welcome')这类调用立即返回中文而非键名或英文,这要求语言文件路径、环境配置、运行时locale设置三者严丝合缝——漏掉任一环,页面就卡在原始键上不动。
确认并修正基础环境配置
打开项目根目录下的.env文件,检查并确保这两行存在且格式正确:
APP_LOCALE=zh
APP_FALLBACK_LOCALE=en
注意:不能写成zh_CN、ZH、zh-cn或zh-CN,【Laravel 13.2.0 只识别小写短码如 zh/en】;写错不会报错,但所有翻译静默失效。
保存后立刻执行命令清除配置缓存:
php artisan config:clear
这一步不可跳过——Laravel 不会自动重载.env变更,不执行就永远读旧缓存。
建立标准语言文件结构
进入resources/lang目录,按语言代码创建两个小写子目录:
zh/
en/
在zh/下新建messages.php,内容为:
'欢迎', 'login' => '登录'];
在en/下新建messages.php,内容为:
'Welcome', 'login' => 'Login'];
文件名必须是messages.php(或其他你打算用的名称),不能加.php以外的后缀,也不能用大写或横线命名。
编写语言切换中间件
执行命令生成中间件:
php artisan make:middleware SetUserLocale
编辑app/Http/Middleware/SetUserLocale.php,在handle方法中写入:
public function handle($request, Closure $next)
{
$locale = $request->session()->get('locale') ?? config('app.fallback_locale');
app()->setLocale($locale);
return $next($request);
}
打开app/Http/Kernel.php,在$middlewareGroups['web']数组中,将SetUserLocale::class插入到StartSession::class之后、其他业务中间件之前。
添加语言切换路由与动作
方法一:简单GET路由(适合后台管理页)
在routes/web.php中添加:
Route::get('/admin/locale/{locale}', function ($locale) {
if (in_array($locale, ['zh', 'en'])) {
session(['locale' => $locale]);
}
return redirect()->back();
})->middleware('web');
方法二:带验证的POST接口(更安全)
新增路由:
Route::post('/api/set-locale', [LocaleController::class, 'store'])->middleware('web');
在控制器中写入:
public function store(Request $request)
{
$request->validate(['locale' => 'required|in:zh,en']);
session(['locale' => $request->locale]);
return response()->noContent();
}
验证日期与验证消息是否同步变语言
第一步:在AppServiceProvider的boot()方法中加入:
Carbon::setLocale(app()->getLocale());
第二步:检查resources/lang/zh/validation.php是否存在,且包含'attributes'子数组,例如:
'attributes' => ['email' => '邮箱', 'name' => '姓名']
第三步:在表单验证规则中,避免直接写Rule::unique('users'),改用:
Rule::unique('users')->where(fn ($q) => $q->where('status', 1))->with('message', __('validation.unique'))
这一步不补全,提交失败时仍显示英文提示。











