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

Laravel语言切换时分类Slug未跳转对应语言版本问题求助

解决Laravel多语言分类Slug切换跳转问题

这个问题我之前处理过不少,核心是要把分类的多语言Slug存储、路由解析和语言切换的跳转逻辑结合起来,下面一步步来实现:

1. 确保分类模型支持多语言Slug存储

首先你的分类表需要能存储不同语言的Slug,有两种常见方案:

方案A:直接添加多语言Slug字段

在categories表中添加对应语言的字段,比如slug_en(英文)、slug_ru(俄文),然后在Category模型中添加辅助方法来获取当前语言的Slug:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    // 定义可填充字段(根据你的实际情况调整)
    protected $fillable = ['name_en', 'name_ru', 'slug_en', 'slug_ru'];

    // 获取当前语言的Slug
    public function getCurrentSlugAttribute()
    {
        $locale = app()->getLocale();
        return $this->{"slug_$locale"};
    }

    // 根据指定语言和Slug查找分类
    public static function findBySlug($slug, $locale = null)
    {
        $locale = $locale ?? app()->getLocale();
        return self::where("slug_$locale", $slug)->firstOrFail();
    }
}

方案B:使用翻译包(推荐复杂场景)

如果你的项目有大量多语言字段,推荐用spatie/laravel-translatable包来统一管理翻译:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Spatie\Translatable\HasTranslations;

class Category extends Model
{
    use HasTranslations;

    // 指定可翻译的字段
    public $translatable = ['name', 'slug'];

    // 获取当前语言的Slug
    public function getCurrentSlugAttribute()
    {
        return $this->getTranslation('slug', app()->getLocale());
    }

    // 根据指定语言和Slug查找分类
    public static function findBySlug($slug, $locale = null)
    {
        $locale = $locale ?? app()->getLocale();
        return self::whereJsonContains("slug->$locale", $slug)->firstOrFail();
    }
}

2. 修改路由与控制器,支持多语言Slug解析

路由保持简洁,使用动态参数接收Slug:

// routes/web.php
Route::get('/category/{category}', [\App\Http\Controllers\CategoryController::class, 'show'])->name('category.show');

然后在控制器的show方法中,使用我们定义的findBySlug方法来获取分类:

namespace App\Http\Controllers;

use App\Models\Category;

class CategoryController extends Controller
{
    public function show($slug)
    {
        $category = Category::findBySlug($slug);
        return view('categories.show', compact('category'));
    }
}

3. 处理语言切换时的跳转逻辑

关键就在这里:当用户切换语言时,判断当前是否在分类页面,如果是,就跳转到对应语言的Slug页面。

首先确保你的语言切换路由是这样的:

// routes/web.php
Route::get('/switch-language/{locale}', [\App\Http\Controllers\LanguageController::class, 'switch'])->name('language.switch');

然后在LanguageController的switch方法中添加跳转逻辑:

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Route;

class LanguageController extends Controller
{
    public function switch($locale)
    {
        // 验证语言是否合法
        if (!array_key_exists($locale, Config::get('langs'))) {
            abort(404);
        }

        // 存储当前语言到Session
        Session::put('applocale', $locale);

        // 判断当前是否在分类详情页
        if (Route::currentRouteName() === 'category.show') {
            // 获取当前路由中的分类实例
            $category = Route::current()->parameter('category');
            // 获取目标语言的Slug(用翻译包的话改成$category->getTranslation('slug', $locale))
            $targetSlug = $category->{"slug_$locale"};
            // 生成对应语言的分类URL
            $redirectUrl = route('category.show', ['category' => $targetSlug]);
        } else {
            // 其他页面跳回上一页
            $redirectUrl = url()->previous();
        }

        return redirect()->to($redirectUrl);
    }
}

4. 视图中生成正确的多语言分类链接

在视图里生成分类链接时,记得使用当前语言的Slug:

{{-- 示例:分类列表中的链接 --}}
@foreach($categories as $category)
    <a href="{{ route('category.show', ['category' => $category->current_slug]) }}">
        {{ $category->getTranslation('name', app()->getLocale()) }} {{-- 对应多语言名称 --}}
    </a>
@endforeach

最后检查你的Language中间件

你的中间件代码基本没问题,确保它能正确设置应用locale:

public function handle($request, Closure $next)
{
    if (Session::has('applocale') && array_key_exists(Session::get('applocale'), Config::get('langs'))) {
        app()->setLocale(Session::get('applocale'));
    } else {
        // 设置默认语言(比如Config::get('app.fallback_locale'))
        app()->setLocale(Config::get('app.fallback_locale'));
    }

    return $next($request);
}

这样设置后,当用户在site.com/category/auto(英文)切换到俄文时,就会自动跳转到site.com/category/mashini,反之亦然。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:19:49