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

如何在Laravel Jetstream中为所有路由设置全局语言前缀

Laravel 全局路由添加语言前缀实现方案

1. 先配置支持的语言列表

打开config/app.php,加入允许的语言配置:

// 原有locale配置保留
'locale' => 'es', // 默认语言
'fallback_locale' => 'en',
// 新增支持的语言列表
'available_locales' => ['en', 'es'],

2. 修改路由注册逻辑

你原来的写法思路是对的,但是只包裹了首页路由,需要把所有web路由(包括第三方包生成的Fortify、Sanctum、Livewire路由)都放到语言前缀组中。
你可以直接修改app/Providers/RouteServiceProvider.php的boot方法,统一给所有web路由加前缀:

public function boot()
{
    $this->configureRateLimiting();

    $this->routes(function () {
        Route::middleware('api')
            ->prefix('api')
            ->group(base_path('routes/api.php'));

        // 给所有web路由套语言前缀
        foreach (config('app.available_locales') as $locale) {
            Route::middleware('web')
                ->prefix($locale)
                ->name("{$locale}.") // 统一给路由名加前缀,避免重名
                ->group(base_path('routes/web.php'));
        }

        // 根路径重定向
        Route::get('/', function () {
            return redirect(config('app.locale'));
        });
    });
}

这样你原来web.php里的路由就不需要再写循环了,直接正常写即可,系统会自动给每个语言生成对应前缀的路由,比如你写Route::get('/login', ...)会自动生成en/login和es/login两个路由,路由名分别是en.login和es.login。

3. 添加语言自动设置中间件

创建中间件自动根据路由前缀设置当前应用语言:
执行命令生成中间件:
php artisan make:middleware SetLocale
打开app/Http/Middleware/SetLocale.php修改代码:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class SetLocale
{
    public function handle(Request $request, Closure $next): Response
    {
        $locale = $request->segment(1);
        if (in_array($locale, config('app.available_locales'))) {
            app()->setLocale($locale);
        }
        return $next($request);
    }
}

然后把中间件注册到web中间件组,打开app/Http/Kernel.php:

protected $middlewareGroups = [
    'web' => [
        // 原有其他中间件保留,把SetLocale加到最前面
        \App\Http\Middleware\SetLocale::class,
        \App\Http\Middleware\EncryptCookies::class,
        // ... 其他中间件
    ],
];

4. 适配第三方包路由

Livewire资源路径配置

打开config/livewire.php修改asset_url配置,让js资源自动适配当前语言前缀:

'asset_url' => request()->segment(1) ? request()->segment(1) : null,

Fortify/Sanctum路由

不需要额外配置,因为我们已经把所有web路由都套了前缀,这两个包的路由会自动生成对应语言前缀的版本。

5. 路由生成优化

如果不想每次生成路由都手动传语言参数,可以在RouteServiceProvider的boot方法里加一行默认参数配置:

public function boot()
{
    // 加这一行,自动把当前语言作为路由的默认前缀参数
    Route::defaultParameter('locale', app()->getLocale());

    parent::boot();
}

之后你用route('login')生成链接的时候,会自动带上当前语言前缀,不用额外传参。

验证效果

执行php artisan route:list --compact即可看到所有路由都已经生成了en和es两个前缀的版本,和你预期的效果一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 22:27:05