Laravel生产环境稳定中英文切换需做对三件事:语言文件路径命名严格匹配框架规则、环境配置与运行时locale设置一致、切换动作在请求早期通过中间件统一生效;否则__('welcome')可能返回英文或空字符串。

要让 Laravel 在生产环境稳定支持中英文切换,关键不是堆功能,而是把三件事做对:语言文件路径和命名必须严格匹配框架规则、环境配置与运行时 locale 设置不能脱节、切换动作必须在请求生命周期早期统一生效。漏掉任一环,都会出现 __('welcome') 一直返回英文或空字符串的情况。
环境配置与缓存清理
先确保 .env 中这两项存在且格式正确:
-
APP_LOCALE=zh(推荐用短格式,不用zh_CN或zh-CN) -
APP_FALLBACK_LOCALE=en(缺失翻译时兜底,避免空白)
改完必须执行:
php artisan config:clear
否则 Laravel 会继续读取旧缓存,所有语言设置都无效。不要跳过这步。
语言文件结构与命名规范
所有翻译文件必须放在 resources/lang 下,按语言代码建小写子目录:
-
resources/lang/zh/messages.php→ 返回return ['welcome' => '欢迎']; -
resources/lang/en/messages.php→ 返回return ['welcome' => 'Welcome']; - 如需拆分模块,可加
auth.php、validation.php,调用时用__('auth.failed')
注意:zh-cn、ZH、zh_cn.php 这类写法 Laravel 直接忽略,不报错但静默失败。
动态切换必须靠中间件,不能靠控制器
在 app/Http/Middleware/SetUserLocale.php 中写:
public function handle($request, Closure $next)
{
$locale = $request->session()->get('locale') ?? config('app.fallback_locale');
app()->setLocale($locale);
return $next($request);
}
然后在 app/Http/Kernel.php 的 $middlewareGroups['web'] 中,把它放在 StartSession::class 之后、其他业务中间件之前。这样验证器、邮件、Blade 渲染才能真正用上当前语言。
前端切换语言的最小可行方案
写一个简单路由接收语言选择:
Route::post('/set-locale', function (Request $request) {
$locale = in_array($request->locale, ['zh', 'en'])
? $request->locale
: 'en';
session(['locale' => $locale]);
app()->setLocale($locale);
return response()->json(['status' => 'ok']);
});
前端点按钮发 POST 请求即可,无需刷新页面。Blade 中所有 {{ __('welcome') }} 会自动响应新语言。


















