Laravel 5.6本地化路由创建技术咨询(含代码示例)
Laravel 5.6 本地化路由实现指导
我来帮你梳理并优化本地化路由的实现,先分析现有代码的问题,再给出更可靠的方案:
一、现有代码的核心问题
- 前缀逻辑倒置:你希望默认语言(
en)无前缀(如/about),法语(fr)带前缀(如/fr/sur),但现有代码中$locale != 'fr'时才加前缀,这会导致en路由变成/en/about,不符合需求。 - 路由翻译时机错误:路由定义阶段还未执行中间件设置语言,直接用
__('urlabout')会始终读取默认语言的翻译值,无法生成法语的sur路径。
二、优化后的路由配置(routes/web.php)
先在config/app.php中补充配置:
'fallback_locale' => 'en', // 默认语言 'locales' => ['en', 'fr'], // 支持的语言列表
然后编写路由:
// 1. 默认语言(en)路由:无前缀 Route::group(['middleware' => 'LanguageCheck'], function () { Route::get('/', 'HomeController@index')->name('home'); Route::get('/about', 'HomeController@about')->name('about'); }); // 2. 其他语言(fr)路由:带语言前缀 foreach (array_except(config('app.locales'), [config('app.fallback_locale')]) as $locale) { Route::group([ 'prefix' => $locale, 'middleware' => 'LanguageCheck' ], function () use ($locale) { // 临时设置当前路由组的语言,确保翻译正确 App::setLocale($locale); Route::get('/', 'HomeController@index')->name("{$locale}.home"); // 指定语言获取路由路径翻译 Route::get('/' . trans('urls.urlabout', [], $locale), 'HomeController@about')->name("{$locale}.about"); }); }
三、创建路由路径翻译文件
在resources/lang下创建语言文件夹和对应文件:
resources/lang/en/urls.php:
return [ 'urlabout' => 'about' ];
resources/lang/fr/urls.php:
return [ 'urlabout' => 'sur' ];
四、完善LanguageCheck中间件
补全中间件逻辑,负责识别请求语言并设置应用locale:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\Session; class LanguageCheck { public function handle($request, Closure $next) { // 优先从路由前缀识别语言 if ($request->segment(1) && in_array($request->segment(1), config('app.locales'))) { $locale = $request->segment(1); Session::put('locale', $locale); App::setLocale($locale); } // 其次从session读取用户之前选择的语言 elseif (Session::has('locale')) { App::setLocale(Session::get('locale')); } // 最后回退到默认语言 else { App::setLocale(config('app.fallback_locale')); } return $next($request); } }
记得在app/Http/Kernel.php中注册中间件:
protected $routeMiddleware = [ // ... 'LanguageCheck' => \App\Http\Middleware\LanguageCheck::class, ];
五、视图中使用本地化路由
用命名路由生成链接更可靠,避免硬编码:
<!-- 默认语言关于页 --> <a href="{{ route('about') }}">About Us</a> <!-- 法语关于页 --> <a href="{{ route('fr.about') }}">À propos</a>
内容的提问来源于stack exchange,提问作者user1719993
相关产品推荐
相关产品推荐

