当前生效的 locale 由 App::currentLocale() 返回,config('app.locale') 仅是配置默认值;需检查 resources/lang 下对应子目录及 messages.php 格式;切换应通过中间件按 session→cookie→Accept-Language 优先级设置,并校验白名单。

要查看当前生效的 locale,直接在任意路由或控制器中执行:
dd(App::currentLocale(), config('app.locale'))。
前者返回运行时实际使用的语言标识(可被动态修改),后者只是配置文件里写死的默认值。两者不一致非常正常,也恰恰说明你已成功做了动态切换。
确认语言包文件是否就位
检查 resources/lang 目录下是否存在对应 locale 的子目录,例如:
• ✓ 正确:resources/lang/zh_CN/、resources/lang/en/
• ✗ 错误:resources/lang/zh-cn/、resources/lang/Chinese/、resources/lang/ZH_CN/
每个子目录内至少要有 messages.php,且必须返回标准 PHP 关联数组:
return ['welcome' => '欢迎'];- 不能有 BOM 头、不能含 echo/print、不能是 JSON 或其他格式
安全切换 locale 的操作步骤
切换不是改 config/app.php,而是让每次请求都主动设置。推荐在中间件中完成:
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
- 创建 app/Http/Middleware/SetLocale.php
- 在
handle()方法中按优先级读取:
→ session('locale')
→ cookie('locale')
→ Accept-Language 头(仅作兜底,不建议依赖) - 校验值是否在白名单中:
in_array($locale, ['en', 'zh_CN']) - 确认后立即调用 App::setLocale($locale)
- 确保该中间件注册在
$middlewareGroups['web']中,且排在StartSession::class之后
前端触发切换的后端配合方式
提供一个 POST 接口,例如 POST /set-locale:
- 控制器中接收
$request->locale,先校验合法性 - 存入 session:
session(['locale' => $locale]) - 同步写入 cookie(可选但推荐):
Cookie::queue('locale', $locale, 365 * 24 * 60) - 再调用 App::setLocale($locale) 确保本次响应也生效
- 返回 JSON 成功响应,前端可据此 reload 页面










