Laravel 显示中文需设 APP_LOCALE=zh、创建 resources/lang/zh 并放入完整翻译文件(如 auth.php、validation.php),通过 app()->setLocale() 或中间件生效;推荐使用 laravel-lang/lang 包,注意 Carbon 本地化需 setlocale 或 translatedFormat,验证占位符需整体翻译。

怎么让 Laravel 应用显示中文界面
Laravel 默认不带中文语言包,lang/zh 目录需要手动创建或引入第三方翻译。官方只维护 en,其他语言靠社区维护——所以“安装中文语言包”本质是把翻译文件放进 resources/lang/zh,再告诉框架用它。
常见错误现象:__('Welcome') 仍返回英文、Lang::get('auth.failed') 没反应、浏览器语言设为 zh-CN 但页面没切换。
- 确认
APP_LOCALE=zh已写入.env(不是APP_FALLBACK_LOCALE) - 检查
config/app.php中'locale' => env('APP_LOCALE', 'en')是否生效(运行php artisan tinker后输入app()->getLocale()验证) -
resources/lang/zh必须存在,且至少包含auth.php、pagination.php等基础文件,否则调用缺失键时会回退到英文
用哪个中文翻译包最靠谱
别直接 npm install 或 composer require “laravel-zh”,多数已停止维护或只适配旧版。推荐两种方式:
- 用 Laravel-Lang/lang:社区最全的多语言翻译仓库,支持 Laravel 9–11,
zh分支更新及时。执行php artisan lang:publish zh(需先装laravel-lang/lang包)或直接复制zh文件夹内容到resources/lang/zh - 手动维护:新建
resources/lang/zh/auth.php,内容结构必须和en/auth.php一致,键名不能改,只改值。例如:'failed' => '用户名或密码错误' - 注意:Laravel 10+ 的验证规则提示(如
required、email)也需在zh/validation.php中定义,漏掉会导致表单报错仍显示英文
为什么设置了 locale 还是不生效
本地化失效往往不是语言包问题,而是请求上下文没被正确识别。Laravel 不自动根据浏览器 Accept-Language 切换语言,除非你显式设置或写中间件。
- 路由中强制指定语言:在
routes/web.php里用->middleware('setlocale:zh')(需自定义中间件) - Session 或 Cookie 控制:用户点击“中文”后执行
session(['locale' => 'zh']),并在AppServiceProvider::boot()中读取并调用app()->setLocale(session('locale', config('app.locale'))) - 避免在 Blade 中用
{{ __('xxx') }}前修改 locale:Blade 编译缓存可能保留旧语言,清缓存用php artisan view:clear - API 请求默认无 session,必须靠 query 参数(
?locale=zh)或 header(X-Locale: zh),并在中间件中解析
日期、数字等格式怎么同步变中文
语言包只管翻译字符串,Carbon::now()->formatLocalized('%A %B %d') 这类本地化格式依赖系统 locale 设置,和 Laravel 的 APP_LOCALE 无关。
- Linux/macOS 下需确保系统有
zh_CN.UTF-8locale:运行locale -a | grep zh_CN,没有就生成(Ubuntu:sudo locale-gen zh_CN.UTF-8) - PHP 中设置:
setlocale(LC_TIME, 'zh_CN.UTF-8'),然后Carbon::now()->formatLocalized('%Y年%m月%d日')才能输出中文月份 - 更稳妥的方式是用
Carbon::now()->translatedFormat('Y年m月d日')(Laravel 9.27+ / Carbon 2.65+),它不依赖系统 locale,纯靠翻译文件 - 数字千分位、小数点符号(如 1,234.56 → 1.234,56)需配置
NumberFormatter,不能靠语言包自动处理
最容易被忽略的是 validation 错误消息里的占位符:比如 'The :attribute must be at least :value characters.',如果 :attribute 是中文字段名(如“密码”),而 :value 是数字,组合后语序可能不对——这时候得重写整个验证消息模板,而不是只翻关键词。










