You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel多语言站点URL前缀切换问题求助

解决Laravel多语言站点URL前缀替换问题

核心问题

你的语言切换逻辑当前是通过查询字符串传递语言参数,而非替换路由中的{locale}前缀,只需调整链接生成方式即可解决。

解决方案步骤

  1. 确认路由分组配置
    确保所有需要多语言的路由都包裹在{locale}前缀的分组中,且绑定了语言处理中间件:
// routes/web.php
Route::prefix('{locale}')->middleware('setlocale')->group(function () {
    Route::get('/blogs', [App\Http\Controllers\BlogController::class, 'index'])->name('blogs.index');
    // 其他页面路由...
});
  1. 修改语言切换按钮的链接生成逻辑
    在视图中,不要用查询参数传递语言,而是基于当前路由生成替换locale参数的新URL:
{{-- 视图中的语言切换按钮示例 --}}
<div class="language-switcher">
    @foreach(['en', 'ka'] as $locale)
        <a href="{{ route(Route::currentRouteName(), array_merge(Route::current()->parameters(), ['locale' => $locale])) }}"
           class="{{ App::getLocale() === $locale ? 'active' : '' }}">
            {{ strtoupper($locale) }}
        </a>
    @endforeach
</div>
  • Route::currentRouteName():获取当前页面的路由名称
  • Route::current()->parameters():获取当前路由的所有参数(比如博客ID等)
  • array_merge(...):将新的locale参数合并到现有参数中,生成带正确前缀的URL
  1. 验证语言中间件逻辑
    确保setlocale中间件正确处理路由中的locale参数,示例代码:
// app/Http/Middleware/SetLocale.php
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;

class SetLocale
{
    public function handle(Request $request, Closure $next)
    {
        // 验证传入的locale是否在允许的列表中
        if (in_array($request->locale, config('app.available_locales'))) {
            App::setLocale($request->locale);
        } else {
            // fallback到默认语言
            App::setLocale(config('app.fallback_locale'));
        }

        return $next($request);
    }
}

同时在config/app.php中配置允许的语言列表:

// config/app.php
'available_locales' => ['en', 'ka'],
'locale' => 'en',
'fallback_locale' => 'en',
  1. 处理路由缓存
    如果之前执行过php artisan route:cache,需要清除路由缓存以确保动态路由名称能正确获取:
php artisan route:clear

效果验证

点击语言切换按钮后,URL会从example.com/en/blogs变为example.com/ka/blogs,而非带查询字符串的格式。

内容的提问来源于stack exchange,提问作者Irakli Qiria

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 10:32:37