mcamara/laravel-localization
Laravel localization package for i18n: detect locale from browser, redirect and persist locale via session/cookie, define routes once with localized URL prefixes and translatable routes, optional hiding of default locale, plus helpers like language selectors.
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,
'localizationRedirect' => \Mcamara\LaravelLocalization\Middleware\LaravelLocalizationRedirectFilter::class,
Configure Locales in config/laravellocalization.php:
'supportedLocales' => ['en', 'es', 'fr'],
'hideDefaultLocaleInURL' => true,
Wrap Routes in routes/web.php:
Route::group(['prefix' => LaravelLocalization::setLocale()], function() {
Route::get('/', function() { return view('home'); });
});
/ → Redirects to /en/ (or detected locale) via localizationRedirect middleware.LaravelLocalization::localizeUrl('/contact') in Blade templates.Route Grouping:
Route::group(['prefix' => LaravelLocalization::setLocale(), 'middleware' => ['localeSessionRedirect']], function() {
Route::get('/about', [AboutController::class, 'index']);
});
/en/about, /es/about, etc.Middleware Stack:
localize: Dynamically routes based on URL locale.localeSessionRedirect/localeCookieRedirect: Persist locale preference.localizationRedirect: Hide default locale in URLs (e.g., / instead of /en/).View Localization:
localeViewPath middleware to load views from resources/views/{locale}/.resources/views/en/home.blade.php for English.<form action="{{ LaravelLocalization::localizeUrl(route('contact.form')) }}" method="POST">
<a href="{{ LaravelLocalization::localizeUrl('/') }}?locale=es">Español</a>
Route::prefix('api')->group(function() {
Route::middleware('api')->group(base_path('routes/api.php'));
});
$this->actingAsUser()->withHeaders(['Accept-Language' => 'fr']);
$this->app->instance(\Mcamara\LaravelLocalization\Facades\LaravelLocalization::class, $mock);
Route Caching:
php artisan route:cache fails due to dynamic routes.niels-numbers/laravel-localizer for static routes.POST Requests:
<form action="{{ LaravelLocalization::localizeUrl(route('submit.form')) }}">
Validation Messages:
LaravelLocalization::setFallbackLocale() or ensure app.php config:
'fallback_locale' => LaravelLocalization::getCurrentLocale(),
SEO Duplicates:
/en/page and /page may return same content.hideDefaultLocaleInURL + canonical tags.dd(LaravelLocalization::getCurrentLocale());
'middleware' => ['localize'], // Remove redirect middleware
LaravelLocalization::getLocalizedURL('es', route('home'));
Custom Locale Detection:
Override AppServiceProvider:
LaravelLocalization::setLocaleResolver(function() {
return request()->input('locale') ?: config('app.locale');
});
Locale-Specific Assets: Use middleware to set asset paths:
LaravelLocalization::onLocaleChanged(function($locale) {
view()->share('assetLocale', $locale);
});
Fallback Logic:
Extend supportedLocales to include fallbacks:
'supportedLocales' => [
'en' => ['en', 'en_US', 'en_GB'],
'es' => ['es', 'es_ES', 'es_MX'],
],
urlsIgnored:
Exclude specific routes (e.g., API):
'urlsIgnored' => [
'api/*',
'admin/*',
],
'utf8suffix' => true,
How can I help you explore Laravel packages today?