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
相关产品推荐
相关产品推荐

