Laravel 9 语言文件目录迁移常见问题与解决方案

升级到 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/ 下的同名文件。

✅ 正确迁移步骤如下:

  1. 彻底删除旧路径

    rm -rf resources/lang
  2. 确保新路径结构正确

    your-project/
    ├── lang/
    │   └── pt-BR/
    │       └── messages.php  ← 返回 ['welcome' => 'Welcome to the app!']
    ├── config/
    ├── app/
    └── ...
  3. 验证配置无误

    // config/app.php
    'locale' => 'pt-BR',
  4. 清除缓存(关键!)

    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!',无需额外配置或修改核心逻辑。