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

如何为Laravel 11实现会话持久化的语言选择器

在Laravel 11中实现语言选择持久化功能

1. 定义语言切换路由

在routes/web.php中添加处理语言切换的路由:

Route::post('/set-language', [LanguageController::class, 'set'])->name('language.set');

2. 创建语言切换控制器

先生成控制器:

php artisan make:controller LanguageController

在app/Http/Controllers/LanguageController.php中实现语言设置逻辑:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Session;

class LanguageController extends Controller
{
    public function set(Request $request)
    {
        $request->validate([
            'language' => 'required|in:en,es,zh-CN', // 替换为你的项目支持语言列表
        ]);

        $language = $request->language;

        // 登录用户:将语言保存到用户模型(需提前给users表添加language字段)
        if (Auth::check()) {
            Auth::user()->update(['language' => $language]);
        }

        // 访客:将语言保存到会话
        Session::put('locale', $language);

        // 立即应用当前语言设置
        App::setLocale($language);

        return back();
    }
}

3. 创建语言中间件

生成用于全局应用语言设置的中间件:

php artisan make:middleware SetLocale

在app/Http/Middleware/SetLocale.php中编写逻辑:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Session;

class SetLocale
{
    public function handle(Request $request, Closure $next)
    {
        // 优先使用登录用户的语言设置
        if (Auth::check() && Auth::user()->language) {
            App::setLocale(Auth::user()->language);
        } 
        // 其次使用会话中存储的访客语言
        elseif (Session::has('locale')) {
            App::setLocale(Session::get('locale'));
        } 
        // 最后回退到应用默认语言
        else {
            App::setLocale(config('app.locale'));
        }

        return $next($request);
    }
}

4. 注册全局中间件

在bootstrap/app.php中注册中间件,确保所有请求都经过语言设置处理:

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        $middleware->append(SetLocale::class);
    })
    ->create();

5. 前端添加语言切换控件

在视图中添加触发语言切换的表单,示例如下:

<form action="{{ route('language.set') }}" method="POST">
    @csrf
    <select name="language" onchange="this.form.submit()">
        <option value="en" {{ app()->getLocale() === 'en' ? 'selected' : '' }}>English</option>
        <option value="es" {{ app()->getLocale() === 'es' ? 'selected' : '' }}>Español</option>
        <option value="zh-CN" {{ app()->getLocale() === 'zh-CN' ? 'selected' : '' }}>中文</option>
    </select>
</form>

额外:支持登录用户永久存储语言

如果需要让登录用户的语言设置永久生效,需先给users表添加language字段:

  1. 生成迁移文件:
php artisan make:migration add_language_to_users_table
  1. 编写迁移内容:
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string('language')->default(config('app.locale'));
        });
    }

    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn('language');
        });
    }
};
  1. 运行迁移:
php artisan migrate

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 10:59:54