视图后缀修改不影响多语言功能,但需同步更新config/view.php的'extensions'配置、保留Blade语法、清除缓存;切换语言需通过session设置locale并配合Localization中间件,且必须在StartSession之后注册。

在 Laravel 项目中,当视图文件后缀被修改(如从 .blade.php 改为 .html 或 .tpl)后,多语言切换功能突然失效——__('welcome') 输出空字符串或原始键名,页面语言不再随 session('locale') 变化而更新。
确认视图后缀是否影响多语言
视图后缀本身不影响 __('xxx') 解析,Laravel 的翻译系统与 Blade 编译器完全解耦;但若你手动修改了 config/view.php 中的 'extensions' 配置,却未同步更新资源路径约定,会导致 __() 查找语言文件时因路径拼接错误而静默失败。
检查 resources/lang/zh/messages.php 是否存在且返回有效数组,再运行 php artisan view:clear —— 修改后缀后缓存可能残留旧编译逻辑,不清理会持续复现错误。
修改视图后缀后保持多语言正常工作的前提
第一步:确保 config/view.php 中 'extensions' 数组包含你实际使用的后缀,例如:
【'extensions' => ['html', 'blade.php']】
第二步:所有视图文件必须保留原 blade 指令语法,仅改后缀不改内容;.html 文件仍需写 {{ __('welcome') }},不能写成 HTML 原生模板语法。
第三步:执行 php artisan config:clear && php artisan cache:clear,否则 config/view.php 的 extensions 修改不会生效。
多语言切换接口实现(Session 方式)
方法一:创建 LanguageController 切换入口
运行 php artisan make:controller LanguageController,然后在控制器中写:
public function switch(string $locale)
{
if (in_array($locale, ['zh', 'en'])) {
session(['locale' => $locale]);
return redirect()->back();
}
abort(400);
}
方法二:直接在路由中定义(适合简单场景)
在 routes/web.php 中添加:
Route::get('/lang/{locale}', function (string $locale) {
if (in_array($locale, ['zh', 'en'])) {
session(['locale' => $locale]);
}
return redirect()->back();
});
关键中间件:Localization.php
创建 app/Http/Middleware/Localization.php:
use Illuminate\Support\Facades\App;
public function handle($request, Closure $next)
{
$locale = session('locale', config('app.locale'));
App::setLocale($locale);
return $next($request);
}
【该中间件必须注册在 app/Http/Kernel.php 的 $middlewareGroups['web'] 中,且位置必须在 \Illuminate\Session\Middleware\StartSession::class 之后】
注册方式示例:
'web' => [
...
\Illuminate\Session\Middleware\StartSession::class,
\App\Http\Middleware\Localization::class,
...
],
前端语言切换按钮写法
在 Blade 视图中(无论后缀是 .blade.php 还是 .html)写:
这一步操作起来很简单,直接把链接嵌入导航栏就行。注意不要用 JavaScript 拦截跳转并尝试用 fetch + 不刷新页面——Laravel 的语言切换依赖 session 写入和页面重载,否则视图渲染仍用旧 locale。


















