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

Laravel 5.6本地化路由创建技术咨询(含代码示例)

Laravel 5.6 本地化路由实现指导

我来帮你梳理并优化本地化路由的实现,先分析现有代码的问题,再给出更可靠的方案:

一、现有代码的核心问题

  1. 前缀逻辑倒置:你希望默认语言(en)无前缀(如/about),法语(fr)带前缀(如/fr/sur),但现有代码中$locale != 'fr'时才加前缀,这会导致en路由变成/en/about,不符合需求。
  2. 路由翻译时机错误:路由定义阶段还未执行中间件设置语言,直接用__('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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:21:29