将 config/app.php 的 'locale' 改为 'zh_CN' 仅是基础步骤,还需安装 laravel-lang/lang 包、确保 resources/lang/zh_CN/validation.php 等文件存在、注册 SetLocale 中间件(置于 StartSession 后)、单独处理 laravel-admin 的 zh-CN 语言包及配置。

直接把 config/app.php 里的 'locale' => 'en' 改成 'locale' => 'zh_CN' 是最基础的一步,但光改这行不会让表单验证、系统提示、后台菜单等全部变中文——缺语言包、缺验证文件、缺中间件逻辑,都会导致部分文案仍是英文。
确认你用的是哪个中文语言包
现在主流是 laravel-lang/lang(推荐),旧版 caouecs/laravel-lang 已废弃,overtrue/laravel-lang 也已停止维护。不同包生成的目录结构和语言代码不一致:
-
laravel-lang/lang:安装后运行php artisan lang:publish zh_CN,生成resources/lang/zh_CN/目录,含validation.php、pagination.php等完整文件 -
caouecs/laravel-lang(不建议):复制vendor/caouecs/laravel-lang/src/zh-CN到resources/lang/zh-CN,注意这里是短横线而非下划线 - 语言代码必须和目录名严格一致:
zh_CN对应resources/lang/zh_CN/,zh-CN对应resources/lang/zh-CN/,错一个字符就加载失败
验证消息没变中文?检查 validation.php 是否存在
Laravel 的表单验证错误提示(如 “The email field is required.”)默认不走 messages.php,而是读取 resources/lang/xx/validation.php。很多新手只放了 messages.php,却漏掉这个文件。
确保以下路径存在且内容正确:
resources/lang/zh_CN/validation.php
内容示例(必须返回数组):
return [
'required' => ':attribute 为必填项。',
'email' => ':attribute 格式不正确。',
'min' => [
'string' => ':attribute 长度不能少于 :min 个字符。',
],
];
- 如果该文件缺失,Laravel 会回退到英文原提示,哪怕
locale已设为zh_CN -
resources/lang/zh_CN/messages.php只负责你手动调用__('xxx')的地方,不影响验证系统 - 修改后清缓存:
php artisan config:clear和php artisan view:clear
中间件没注册?请求来了还是英文
仅靠 config/app.php 设定 locale 只影响默认值;用户切换语言时,必须靠中间件在每次请求中动态设置当前 locale。
- 创建中间件:
php artisan make:middleware SetLocale - 在
handle()中写入:
if (session()->has('locale')) {
app()->setLocale(session()->get('locale'));
}
- 注册到
app/Http/Kernel.php的$middlewareGroups['web']数组末尾(必须在StartSession::class之后) - 否则 session 读不到,
app()->setLocale()就白设了 - 如果用 URL 参数(如
/lang/zh_CN)切换,中间件里要从$request->route('lang')或$request->query('lang')读取,别硬编码
laravel-admin 后台菜单还是英文?单独处理
laravel-admin 不读 Laravel 原生语言包,它有自己的发布机制:
- 先执行:
php artisan vendor:publish --tag=laravel-admin-lang - 再确认
resources/lang/zh-CN/admin.php存在且有对应键(如'dashboard' => '仪表盘') - 修改
config/admin.php中的'locale' => 'zh-CN'(注意这里是短横线) - laravel-admin 的语言目录名是
zh-CN,和 Laravel 主框架的zh_CN不兼容,不能复用 - 改完必须清缓存:
php artisan admin:publish --force再php artisan config:clear
真正容易被忽略的点是:语言包目录名、验证文件是否存在、中间件注册位置、laravel-admin 的独立配置——四个地方任意一个出错,都会让你以为“切中文失败”,其实只是某一层没透下去。


















