How do I get a user's preferred language in the pre-rendered view in laravel's maintenance mode?

Updated: Mar 02, 2025

How do I get a user's preferred language in the pre-rendered view in laravel's maintenance mode?

To get a user's preferred language in Laravel's maintenance mode for a pre-rendered view, you'll need to use a combination of Laravel's localization and session features. Here's a step-by-step guide on how to achieve this:

  1. First, make sure you have Laravel's localization package installed. You can install it using Composer:
composer require laravel/locale
  1. Next, configure your config/app.php file to include the locale package and set your available locales:
'providers' => [
    // ...
    Laravel\LaravelLocalization\LaravelLocalizationServiceProvider::class,
],

'aliases' => [
    // ...
    'L' => Laravel\LaravelLocalization\Facades\LaravelLocalization::class,
],

'locale' => 'en',

'supported_locales' => [
    'en',
    'es',
],
  1. Create a middleware to check for the user's preferred language and set it in the session. Create a new middleware file in the app/Http/Middleware directory, e.g., SetLocaleFromCookie.php:
<?php

namespace App\Http\Middleware;

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

class SetLocaleFromCookie
{
    public function handle(Request $request, Closure $next)
    {
        if ($request->cookie('locale')) {
            Session::put('locale', $request->cookie('locale'));
        }

        return $next($request);
    }
}
  1. Register the middleware in the app/Http/Kernel.php file:
protected $routeMiddleware = [
    // ...
    'locale.cookie' => \App\Http\Middleware\SetLocaleFromCookie::class,
];
  1. Update the app/Http/Kernel.php file to apply the middleware to the web middleware group:
protected function routeMiddleware()
{
    return [
        // ...
        'web' => \App\Http\Middleware\WebMiddleware::class,
        'locale.cookie' => \App\Http\Middleware\SetLocaleFromCookie::class,
    ];
}
  1. Now, you can get the user's preferred language in your pre-rendered view by accessing the session('locale') variable. Make sure to set the locale in your view before using it, e.g., in the app/Views/welcome.blade.php file:
@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            @if (session('status'))
                <div class="alert alert-success" role="alert">
                    {{ session('status') }}
                </div>
            @endif

            <p>Your preferred language is: {{ session('locale') }}</p>
        </div>
    </div>
</div>
@endsection
  1. Finally, set the preferred language in your maintenance mode view, e.g., in the resources/views/maintenance.blade.php file:
@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <p>We are performing maintenance at the moment. Your preferred language is: {{ session('locale') }}</p>
        </div>
    </div>
</div>
@endsection
  1. Set the locale in your app/Http/Kernel.php file's handle method to ensure it's set before the middleware runs:
protected function handle(Request $request)
{
    if (app()->environment('maintenance')) {
        app()->setLocale('en'); // or the desired locale
        return view('maintenance');
    }

    $this->initializeGlobalMiddleware($request);

    return $this->app->make('router')->dispatch($request);
}

Now, when you visit the site in a supported language, the user's preferred language will be set in the session and displayed in the maintenance mode view.