
升级到 laravel 9 后,若将 `resources/lang` 迁移至项目根目录 `lang/` 但翻译未生效,很可能是旧目录残留导致 laravel 优先加载了 `resources/lang` 中的文件。
Laravel 9 确实将语言文件默认路径从 resources/lang 调整为项目根目录下的 lang/(即 base_path('lang')),这是框架内部语言加载器(Illuminate\Translation\FileLoader)的硬编码行为变更。然而,该变更并非“替换”,而是“新增默认路径”——Laravel 的翻译系统会按顺序搜索多个路径,其中 resources/lang 仍保留在搜索列表中,且优先级高于根目录 lang/。
这意味着:只要 resources/lang 目录存在(即使为空),Laravel 就会首先尝试从此处加载语言包;若该目录下缺少对应 locale 文件(如 pt-BR/messages.php),则返回原始键名(如 "messages.welcome"),而非降级查找根目录 lang/ 下的同名文件。
✅ 正确迁移步骤如下:
-
彻底删除旧路径:
rm -rf resources/lang
-
确保新路径结构正确:
your-project/ ├── lang/ │ └── pt-BR/ │ └── messages.php ← 返回 ['welcome' => 'Welcome to the app!'] ├── config/ ├── app/ └── ...
-
验证配置无误:
// config/app.php 'locale' => 'pt-BR',
-
清除缓存(关键!):
php artisan config:clear php artisan cache:clear php artisan view:clear
⚠️ 注意事项:
- 不要同时保留 resources/lang 和 lang/ —— 冲突根源即在此;
- 若使用多语言包(如 auth.php, validation.php),需一并迁移至 lang/{locale}/ 下;
- 自定义语言路径(如通过 Lang::addNamespace() 或 TranslationServiceProvider 手动注册)可能覆盖默认行为,需同步检查;
- 在测试环境可临时启用调试:在控制器中添加 dd(app('translator')->getLoader()->paths); 查看实际加载路径顺序。
总结:Laravel 9 的语言目录迁移是“路径优先级调整”,而非“自动重定向”。成功的关键在于清理历史残留 + 清除配置缓存。完成上述操作后,Lang::get('messages.welcome') 将正确返回 'Welcome to the app!',无需额外配置或修改核心逻辑。










