laravel-admin 菜单不翻译的主因是中文语言包未生效、菜单配置未走翻译逻辑或数据库存硬编码英文;需确认语言包发布、locale 设置、菜单键值化及中间件 locale 生效时机。

菜单名称不翻译,通常不是 Laravel-Admin 本身不支持多语言,而是中文语言包没生效、菜单配置没走翻译逻辑,或数据库里存的是硬编码英文字符串。重点不在“能不能”,而在“哪一层漏了翻译链路”。
确认中文语言包已正确发布并加载
执行命令手动发布 Laravel-Admin 官方中文语言包:
- php artisan vendor:publish --tag=laravel-admin-lang
- 检查是否生成了 resources/lang/zh-CN/admin.php(注意是 zh-CN,不是 zh_CN 或 zh)
- 确保 config/app.php 中
'locale' => 'zh-CN',且'fallback_locale' => 'en' - 清缓存:php artisan config:clear && php artisan view:clear
菜单项必须使用语言键,不能依赖数据库字段直出
Laravel-Admin 默认从 admin_menu 数据表读取菜单标题,而该表的 title 字段是纯文本——如果填的是 "dashboard",它不会自动查 __('dashboard');必须显式改用翻译键。
- 在菜单配置中(如
app/Admin/routes.php或app/Admin/bootstrap.php),把菜单定义改成:['title' => __('admin::menu.dashboard'), 'icon' => 'fa-bar-chart'] - 对应地,在
resources/lang/zh-CN/admin.php中添加:'menu' => ['dashboard' => '仪表盘', 'users' => '用户管理'] - 若使用
admin::menu.xxx命名空间,需确认语言文件路径为resources/lang/zh-CN/admin.php,且键结构匹配
修复数据库菜单标题的硬编码问题
如果已有菜单存于数据库且 title 是英文(如 "users"),Laravel-Admin 不会主动翻译它——它只原样输出字段值。
- 方案一(推荐):将
admin_menu.title字段内容改为翻译键,例如把users改成admin::menu.users,然后在grid或form渲染时用trans($item->title)或__($item->title) - 方案二:重写菜单构建逻辑,在
app/Admin/bootstrap.php中自定义Admin::menu()的回调,对每个菜单项调用__() - 方案三(快速见效):直接修改数据库,把
title字段批量更新为中文,但失去多语言灵活性,不建议长期使用
检查中间件与 locale 生效时机
即使语言包存在、菜单用了 __('xxx'),若 App::setLocale() 调用太晚,Blade 渲染时仍用默认 locale。
- 确认
app/Http/Middleware/SetLocale.php已注册在$middlewareGroups['web']中,且排在StartSession::class之后 - 中间件内应类似:
$locale = session('locale', config('app.locale'));<br>app()->setLocale($locale); - 避免在控制器或视图中临时改 locale,否则菜单渲染可能已结束











