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

Laravel 5.6多语言路由适配咨询:路由参数翻译方案

最优实现方案

针对你的需求,结合Laravel 5.6的特性,我推荐以下分步实现的方案,兼顾灵活性和SEO需求:

1. 完善语言中间件,确保locale正确设置

首先修复你的中间件,补上请求传递逻辑,同时增加支持语言的校验,避免非法域名设置无效locale:

<?php

namespace App\Http\Middleware;

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

class Language {
    public function handle($request, Closure $next) {
        $host = parse_url($request->url(), PHP_URL_HOST);
        $urlSegments = explode('.', $host);
        $topLevelDomain = end($urlSegments);
        
        // 配置支持的语言列表(建议在config/app.php里定义)
        $supportedLocales = config('app.locales', ['en', 'pt', 'es']);
        
        // 映射顶级域名到语言:com对应en,其他顶级域名直接作为locale
        $locale = $topLevelDomain === 'com' ? 'en' : $topLevelDomain;
        
        if (in_array($locale, $supportedLocales)) {
            App::setLocale($locale);
        }
        
        // 必须传递请求到下一个中间件/控制器
        return $next($request);
    }
}

记得在config/app.php里添加支持的语言配置:

'locales' => ['en', 'pt', 'es'],

然后在app/Http/Kernel.php的web中间件组里注册这个中间件:

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

2. 创建路由翻译文件

为每种语言创建路由片段的翻译文件,方便统一管理本地化路由:

  • resources/lang/en/routes.php
return [
    'near-me' => 'near-me',
    // 后续新增的路由翻译都可以放在这里
];
  • resources/lang/pt/routes.php
return [
    'near-me' => 'perto-de-mim',
];
  • resources/lang/es/routes.php
return [
    'near-me' => 'cerca-de-mi',
];

3. 动态生成多语言路由

通过循环支持的语言,自动为每个域名生成对应的本地化路由,避免重复编写路由代码:

在routes/web.php中:

<?php

use Illuminate\Support\Facades\Route;

$supportedLocales = config('app.locales');

foreach ($supportedLocales as $locale) {
    // 构建对应语言的域名:en对应mydomain.com,其他语言对应mydomain.xx
    $domain = 'mydomain.' . ($locale === 'en' ? 'com' : $locale);
    
    Route::domain($domain)->group(function () use ($locale) {
        // 获取当前语言的路由片段翻译
        $nearMeRoute = trans('routes.near-me', [], $locale);
        
        // 定义路由并命名,命名带语言前缀方便反向生成
        Route::get('{category}/' . $nearMeRoute, 'ServicesController@nearMe')
            ->name("{$locale}.services.near-me")
            ->where('category', '[a-z0-9-]+'); // 添加参数约束,增强安全性
    });
}

4. 反向生成多语言路由URL

在模板或代码中,根据当前locale生成对应语言的路由URL:

{{-- 生成当前语言的"near me"页面链接 --}}
<a href="{{ route(app()->getLocale() . '.services.near-me', ['category' => 'dynamic']) }}">
    {{ __('services.near-me') }}
</a>

在控制器中生成URL:

$url = route(app()->getLocale() . '.services.near-me', ['category' => 'dynamic']);

方案优势

  • 统一管理:路由翻译集中在语言文件里,新增语言或修改路由片段只需修改翻译文件
  • 灵活性:通过循环自动生成所有语言的路由,无需重复编写相同逻辑
  • SEO友好:每个语言版本的路由都是本地化的字符串,符合搜索引擎的收录规则
  • 可扩展性:后续新增路由只需在翻译文件中添加对应项,再在循环中新增路由定义即可

内容的提问来源于stack exchange,提问作者João Dias

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:02:47