In today's globalized world, websites need to support multiple languages to reach a wider audience. Laravel 12 provides built-in localization features that allow developers to create multi-language websites efficiently. This tutorial will guide you through setting up a multi-language website in Laravel 12 using language files, middleware, and dynamic content translation.
First, install a new Laravel 12 project:
composer create-project --prefer-dist laravel/laravel laravel-multilang
cd laravel-multilang
Configure your .env
file with database settings:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_multilang
DB_USERNAME=root
DB_PASSWORD=
Run the database migrations:
php artisan migrate
Laravel stores language files in the resources/lang/
directory. By default, it includes an en
folder for English.
Inside resources/lang/
, create new folders for the desired languages, e.g.:
mkdir -p resources/lang/en
mkdir -p resources/lang/es
mkdir -p resources/lang/fr
Inside each folder, create a messages.php
file:
English (resources/lang/en/messages.php
)
return [
'welcome' => 'Welcome to our website!',
'about' => 'About Us',
'contact' => 'Contact Us',
];
Spanish (resources/lang/es/messages.php
)
return [
'welcome' => '¡Bienvenido a nuestro sitio web!',
'about' => 'Sobre nosotros',
'contact' => 'Contáctenos',
];
French (resources/lang/fr/messages.php
)
return [
'welcome' => 'Bienvenue sur notre site!',
'about' => 'À propos de nous',
'contact' => 'Contactez-nous',
];
To manage language switching, create a middleware:
php artisan make:middleware LanguageSwitcher
Modify app/Http/Middleware/LanguageSwitcher.php
:
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Session;
class LanguageSwitcher
{
public function handle($request, Closure $next)
{
if (Session::has('locale')) {
App::setLocale(Session::get('locale'));
}
return $next($request);
}
}
Register the middleware in app/Http/Kernel.php
:
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\LanguageSwitcher::class,
],
];
Define a route in routes/web.php
to change the language:
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\App;
use Illuminate\Http\Request;
Route::get('/change-language/{lang}', function ($lang) {
Session::put('locale', $lang);
return redirect()->back();
});
Create a resources/views/layout.blade.php
file and add a language switcher:
<!DOCTYPE html>
<html lang="{{ app()->getLocale() }}">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ __('messages.welcome') }}</title>
</head>
<body>
<nav>
<a href="{{ url('/change-language/en') }}">English</a> |
<a href="{{ url('/change-language/es') }}">Español</a> |
<a href="{{ url('/change-language/fr') }}">Français</a>
</nav>
<h1>{{ __('messages.welcome') }}</h1>
<p>{{ __('messages.about') }}</p>
<p>{{ __('messages.contact') }}</p>
</body>
</html>
Laravel’s default locale is set in config/app.php
. Update it as needed:
'locale' => 'en',
To allow fallback to English if a translation is missing, add:
'fallback_locale' => 'en',
Start the Laravel development server:
php artisan serve
Open http://127.0.0.1:8000/
in your browser.
Click on Español or Français to see the page content change dynamically
We have successfully implemented a multi-language website in Laravel 12. With language files, middleware, and session-based locale switching, users can dynamically change the language without reloading the entire page. This is a crucial feature for global web applications