__('welcome')不返回翻译内容,八成是目录结构或app_locale配置错误:resources/lang/{locale}目录名必须与app_locale值完全一致(大小写、分隔符),且需运行php artisan config:clear;app::setlocale()必须在视图渲染前调用,否则__('welcome')静默返回原键名。

__('welcome') 不返回翻译内容?八成是目录结构或 APP_LOCALE 配置错了。Laravel 5.5 的多语言机制本身稳定,但对路径、命名、时机三者极其敏感,错一个就静默失败。
language directory must match APP_LOCALE exactly
Laravel 5.5 只认 resources/lang/{locale} 下的子目录,且目录名必须和 APP_LOCALE 值完全一致(大小写+分隔符)。常见错误:
-
APP_LOCALE=zh-CN→ 目录必须是resources/lang/zh-CN/,不是zh_cn或zh -
APP_LOCALE=zh_CN→ 目录必须是resources/lang/zh_CN/,不能混用连字符和下划线 - 目录名含大写字母(如
ZH-CN)会导致加载失败,Laravel 5.5 不做大小写归一化 - JSON 文件也必须放同一级:例如
resources/lang/zh-CN/auth.json,不能放resources/lang/zh-CN/json/auth.json
APP_LOCALE in .env must be set and config:clear run
Laravel 5.5 不会自动重载 .env 变更,改完必须清缓存:
- 确认
.env中有APP_LOCALE=zh-CN和APP_FALLBACK_LOCALE=en - 运行
php artisan config:clear(注意不是cache:clear) - 如果已执行过
config:cache,仅改.env无效 —— 缓存中的config/app.php仍用旧值 - 临时验证:在
tinker中执行config('app.locale'),看是否返回你设的值
__(), @lang() only work after App::setLocale() is called
在 Laravel 5.5 中,__() 和 @lang() 读取的是当前运行时 locale,不是配置文件里的默认值。这意味着:
- 如果你没在中间件或控制器里调用
App::setLocale(),它们永远用config('app.locale')(即.env里的APP_LOCALE) - 中间件注册顺序很重要:必须在
StartSession之后(才能读 session),且在任何可能触发翻译逻辑的中间件之前(比如日志、验证) - 不要在 Blade 模板里写
@lang('welcome')然后指望它随用户切换 —— 它不感知动态 locale,只读当前上下文;统一用{{ __('welcome') }} - Artisan 命令中
__()默认不生效,需手动加app()->setLocale($this->option('locale'))
messages.php keys with dot notation require matching file structure
使用 __('auth.failed') 这类带点的键名时,Laravel 会去查 resources/lang/{locale}/auth.php 里的 'failed' => '...',而不是 messages.php。
- ✅ 正确:
resources/lang/zh-CN/auth.php内容为return ['failed' => '用户名或密码错误']; - ❌ 错误:
resources/lang/zh-CN/messages.php里写'auth.failed' => '...'—— Laravel 不解析键名里的点,只当普通字符串键 - 嵌套数组可以,比如
'auth' => ['failed' => '...'],但调用时仍得用__('auth.failed') - JSON 文件不支持点号键名解析:
{"auth.failed": "..."}会被忽略,必须拆成{"auth": {"failed": "..."} }并配合 PHP 文件结构
resources/lang/zh-CN/ 是否存在、APP_LOCALE 是否生效、App::setLocale() 是否在视图渲染前被调用 —— 这三点漏掉任何一个,__('welcome') 就只会原样返回 welcome。











