Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

trakaismangusts's avatar

Laravel 5.4 set locale in session

I would like to know how to set locale in session.

my language picker isnt' input type, but just text. here is blade fragment - this is language picker:

    <div class = "col-lg-5 col-md-5" id = "lang">
        <ul id = "lang_menu">
            <li class = "language active">Latviešu</a></li>
            <li class = "language">Pусский</a></li>
            <li class = "language">English</a></li>
        </ul>
    </div>

Here are routes:

Route::get('/', 'PagesController@index');

    Route::get('/mafia', 'PagesController@mafia');

    Route::get('/games', 'PagesController@games');

    Route::get('/discounts', 'PagesController@discounts');

    Route::get('/tournaments', 'PagesController@tournaments');

    Route::get('/gallery', 'PagesController@gallery');

    Route::get('/aboutus', 'PagesController@aboutus');

also i have transladet files who works fine when i changing locale in config

0 likes
8 replies
trakaismangusts's avatar

Now i got so far but still its not working. I made this code from one tutorial where all works. I did the same and its not working.

Here is lang choosing Blade :

<ul id = "lang_menu">
    <li class = "language active"><a href ="{{ url('/locale/lv') }}">Latviešu</a></li>
    <li class = "language"><a href ="{{ url('/locale/ru') }}">Pусский</a></li>
    <li class = "language"><a href ="{{ url('/locale/en') }}">English</a></li>
</ul>

Here is routes:

Route::get('locale/{locale?}', array('as'=>'set-locale', 
'uses'=>'LanguageController@setLocale'));

Here is my LanguageController:

use Illuminate\Http\Request;
use Session;
use URL;

class LanguageController extends Controller
{
public function setLocale($locale='en'){
    if (!in_array($locale, ['en', 'ru', 'lv'])){
        $locale = 'en';
    }
    Session::put('locale', $locale);
    return redirect(url(URL::previous()));
    }
}

And here is middleware "Locale":

use Closure;
use Session;
use Config;
use App;

class Locale
{
/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @return mixed
 */
public function handle($request, Closure $next)
    {
    $locale=Session::get('locale', Config::get('app.locale'));
    App::setLocale($locale);
    return $next($request);
    }
}

And added in Kernel.php:

    \App\Http\Middleware\Locale::class,
    \Illuminate\Session\Middleware\StartSession::class,
2 likes
trakaismangusts's avatar

OK I did dd an it gives me back en locale so the problem is that locale is not setting up.... I am a little bit confused right now...

bobbybouwmann's avatar

So it seems that the session is empty! Are you sure the session is set correctly?

ekhlas's avatar

I've implemented a system that looks like what you need.

Here's an example route group:

web.php

// Main GET routes with locale
Route::prefix('{lang?}')->middleware('locale')->group(function() {

    Route::get('/', function () {
        return view('index');
    });
});

The rest happens in a middleware:

App/Http/Middleware/Locale.php

<?php

namespace App\Http\Middleware;

use Closure;

class Locale
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($request->method() === 'GET') {
            $segment = $request->segment(1);

            if (!in_array($segment, config('app.locales'))) {
                $segments = $request->segments();
                $fallback = session('locale') ?: config('app.fallback_locale');
                $segments = array_prepend($segments, $fallback);

                return redirect()->to(implode('/', $segments));
            }

            session(['locale' => $segment]);
            app()->setLocale($segment);
        }

        return $next($request);
    }
}

I've set up some new keys in the config/app.php array:

    'locale' => 'fr',

    'locales' => ['fr', 'en'],

    'fallback_locale' => 'fr',

Or

use this plugin https://github.com/mcamara/laravel-localization

AhmadFazliIsmail's avatar

@trakaismangusts I am using Laravel 5.8 and use Middleware to achieve localization. Below are my codes;

$lang = 'en'; # The default language.

    if(isset($_GET['lang']) && $_GET['lang'] != null) # If the user specify language.
        $lang = $request->session()->put('lang', $_GET['lang']);

    if($request->session()->has('lang'))
        $lang = session('lang', session('lang'));

    App::setLocale($lang);

Please or to participate in this conversation.