如何为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字段:
- 生成迁移文件:
php artisan make:migration add_language_to_users_table
- 编写迁移内容:
<?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'); }); } };
- 运行迁移:
php artisan migrate
内容的提问来源于stack exchange,提问作者JuanJota
相关产品推荐
相关产品推荐

