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

如何在Laravel中高效实现URL端点的多语言翻译?

Laravel实现URL端点多语言翻译的高效方案

1. 配置路由语言映射文件

在resources/lang目录下,为每种支持的语言创建routes.php文件,统一管理路由端点的翻译:

  • 英文(resources/lang/en/routes.php):
return [
    'home' => 'home',
    'about' => 'about-us',
    'contact' => 'contact'
];
  • 法语(resources/lang/fr/routes.php):
return [
    'home' => 'maison',
    'about' => 'a-propos',
    'contact' => 'contactez-nous'
];

2. 定义动态本地化路由

在routes/web.php中,使用翻译函数动态生成路由URI,同时为每个路由设置唯一名称(用于反向生成多语言URL):

use Illuminate\Support\Facades\Route;

Route::get(__('routes.home'), function () {
    return view('home');
})->name('home');

Route::get(__('routes.about'), function () {
    return view('about');
})->name('about');

Route::get(__('routes.contact'), function () {
    return view('contact');
})->name('contact');

3. 实现语言切换逻辑

添加语言切换路由,切换语言后自动跳转到当前页面的对应语言版本:

Route::get('/switch-lang/{lang}', function ($lang) {
    // 验证语言是否在支持列表内
    $supportedLangs = ['en', 'fr'];
    if (!in_array($lang, $supportedLangs)) {
        abort(404);
    }

    // 将选中语言存入会话
    session()->put('locale', $lang);

    // 生成当前页面的对应语言URL并跳转
    $currentRoute = Route::currentRouteName();
    $targetUri = __('routes.' . $currentRoute);
    return redirect()->to($targetUri);
})->name('switch-lang');

4. 自动设置应用语言

创建中间件自动读取会话中的语言设置,设置应用Locale:

php artisan make:middleware SetLocale

在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)
    {
        if (session()->has('locale')) {
            App::setLocale(session('locale'));
        }
        return $next($request);
    }
}

在app/Http/Kernel.php的web中间件组中注册该中间件:

protected $middlewareGroups = [
    'web' => [
        // ... 其他原有中间件
        \App\Http\Middleware\SetLocale::class,
    ],
];

5. 视图中生成多语言URL

在Blade视图中,通过路由名称生成对应语言的URL:

<a href="{{ route('home') }}">{{ __('nav.home') }}</a>
<a href="{{ route('switch-lang', ['lang' => 'en']) }}">English</a>
<a href="{{ route('switch-lang', ['lang' => 'fr']) }}">Français</a>

额外优化建议

  • 可以将语言切换逻辑封装到LanguageController中,替代闭包路由,让代码更易维护。
  • 若需要支持更多语言,只需新增对应语言的routes.php文件,并更新语言验证列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 13:37:31