mcamara/laravel-localization
Laravel localization helper for multi-language apps: detect browser language, redirect and persist locale (session/cookie), define routes once with locale prefixes, translate routes, optionally hide default locale, plus helpers like language selector. Supports caching and testing.
Installation:
composer require mcamara/laravel-localization
Publish config:
php artisan vendor:publish --provider="Mcamara\LaravelLocalization\LaravelLocalizationServiceProvider"
Register Middleware in app/Http/Kernel.php (or bootstrap/app.php for Laravel 11):
'localize' => \Mcamara\LaravelLocalization\Middleware\LaravelLocalizationRoutes::class,
'localeSessionRedirect' => \Mcamara\LaravelLocalization\Middleware\LocaleSessionRedirect::class,
Configure Locales in config/laravellocalization.php:
'supportedLocales' => ['en', 'es', 'fr'],
Wrap Routes in routes/web.php:
Route::group(['prefix' => LaravelLocalization::setLocale()], function() {
Route::get('/', function() { return view('home'); });
});
/en/about, /es/about, etc.app()->setLocale().Route Grouping:
Route::group(['prefix' => LaravelLocalization::setLocale(), 'middleware' => ['localeSessionRedirect']], function() {
// All localized routes here
});
Middleware Stack:
localeSessionRedirect for session-based persistence.localeCookieRedirect for cookie-based persistence.localizationRedirect to hide default locale in URLs.Dynamic URL Generation:
// Blade template
<a href="{{ LaravelLocalization::localizeUrl('/about') }}">About</a>
resources/views/{locale}/ and use localeViewPath middleware.LaravelLocalization::localizeUrl() for form actions to avoid redirects.hideDefaultLocaleInURL to avoid duplicate content issues.@foreach(LaravelLocalization::getSupportedLocales() as $locale)
<a href="{{ LaravelLocalization::localizeUrl('/', $locale) }}">
{{ LaravelLocalization::getCurrentLocaleNative($locale) }}
</a>
@endforeach
POST Requests:
localizeUrl() to avoid MethodNotAllowedHttpException.<form action="{{ LaravelLocalization::localizeUrl('/submit') }}" method="POST">
Validation Messages:
lang file exists for the locale in resources/lang/{locale}/validation.php.app()->setLocale().Route Caching:
php artisan route:clear
URL Collisions:
uk for en-GB).localesMapping to handle custom URL segments.dd(app()->getLocale()); // Debug current locale
localize middleware runs before localeSessionRedirect or localeCookieRedirect.LaravelLocalization::setLocale() in tests to mock locales:
LaravelLocalization::setLocale('es');
Mcamara\LaravelLocalization\LanguageNegotiator to add custom logic for locale detection.Route::group(['middleware' => ['force.locale:fr']], function() { ... });
supportedLocales with fallback chains:
'supportedLocales' => [
'en' => ['en', 'en-US'],
'es' => ['es', 'en'],
],
php artisan route:cache
utf8suffix in config if using non-standard servers (e.g., CentOS).How can I help you explore Laravel packages today?