Laravel验证提示切中文需两步:发布zh_CN语言包并设locale为zh_CN;检查配置、中间件、请求头及验证消息键名是否匹配,确保上传等小众规则翻译完整。

验证提示语默认是英文,怎么快速切中文
Laravel 默认用英文提示验证失败信息,改中文最直接的方式是替换语言包。核心操作就两步:发布中文语言文件 + 确保应用使用 zh_CN 区域设置。
别手动改 resources/lang/en/validation.php,那是英文源文件;你要的是把官方维护的中文翻译加载进来。
- 运行
php artisan lang:publish zh_CN(Laravel 9.2+ 自带命令) - 如果提示命令不存在,说明版本较老,直接执行
php artisan vendor:publish --tag=lang,然后选中文语言包(通常标有zh-CN或zh) - 检查是否生成了
resources/lang/zh_CN/validation.php(或zh/validation.php),确保该文件存在且内容完整
app.locale 配置没生效?检查这三处
即使语言包有了,提示还是英文,大概率是区域设置没走对路。Laravel 不只看 config/app.php 里的 locale,还会被运行时覆盖。
-
config/app.php中确认'locale' => 'zh_CN'(注意下划线,不是短横线) - 检查中间件或控制器里有没有调用
App::setLocale('en')或app()->setLocale('en')—— 这会强行覆盖全局配置 - 如果是 API 请求,确认没在请求头带
Accept-Language: en,且没启用Illuminate\Http\Middleware\SetLocaleFromBrowser类似的自动识别逻辑
自定义验证消息时,messages() 数组键名要对得上
用 Validator::make($data, $rules)->messages() 或在 Request 类里重写 messages() 方法时,键名必须严格匹配验证规则的字段+点+规则格式,否则中文不显示。
比如规则是 'title' => 'required|string|max:50',对应的消息键应为:
return [
'title.required' => '标题不能为空',
'title.max' => '标题不能超过 :max 个字符',
];
- 不要写成
'title.required_string'或'required.title'—— 键名错一个字符,就回退到英文默认值 -
:attribute、:max这类占位符保留原样,中文翻译文件已处理它们的替换逻辑 - 若用
Rule::unique('users')->ignore($id),错误键是'email.unique',不是'email.exists'
表单验证失败后重定向,withInput() 和语言上下文容易断开
用 redirect()->back()->withErrors($validator)->withInput() 时,如果页面渲染前 locale 被重置(比如某些多语言中间件在 redirect 后重新初始化),中文提示可能变回英文。
- 确保重定向响应中 session 已保存,且
app()->getLocale()在视图渲染时仍返回zh_CN - 临时调试可在 Blade 模板开头加
{{ app()->getLocale() }}看实际值 - 更稳妥的做法:在基控制器的
__construct()里固定调用$this->middleware(function ($request, $next) { app()->setLocale('zh_CN'); return $next($request); });
最容易被忽略的是:中文语言包里的 validation.php 文件,有些第三方镜像或旧版翻译缺了 uploaded、invalid_type 这类小众规则的翻译,遇到上传失败等提示仍是英文,得手动补全。


















