bibrokhim/laravel-language-header
Laravel middleware/package that detects and sets the application locale from the HTTP Accept-Language header. Helps automatically localize responses based on the user’s browser or client language preferences, with simple Laravel integration.
Installation
composer require bibrokhim/laravel-language-header
Publish the config file (if needed):
php artisan vendor:publish --provider="Bibrokhim\LanguageHeader\LanguageHeaderServiceProvider"
Basic Configuration
Edit config/language-header.php to define:
Accept-Language, X-Locale)['en', 'fr', 'es'])'en')First Use Case
In app/Http/Kernel.php, add the middleware to the $middleware array:
\Bibrokhim\LanguageHeader\Middleware\SetLocaleFromHeader::class,
Accept-Language: fr-FR).app()->setLocale('fr')), and adds the X-Locale header to responses.Request Processing
app()->getLocale() in controllers/views to access the dynamic locale.Fallback Logic
Accept-Language: xx-YY → falls back to config('language-header.default').Response Headers
X-Locale: {locale} to all responses (useful for APIs or frontend JS detection).'add_locale_header' => false.Testing
$response = $this->withHeaders(['Accept-Language' => 'fr-FR'])->get('/');
$this->assertEquals('fr', app()->getLocale());
Dynamic Locale Switching Combine with route middleware to override locale per route:
Route::middleware(['set.locale' => 'fr'])->group(...);
(Requires custom middleware extending SetLocaleFromHeader.)
API Versioning
Use the X-Locale header for API versioning (e.g., /v1 + X-Locale: es → Spanish v1).
Frontend Integration
Read X-Locale in JavaScript to set UI language:
const locale = document.querySelector('meta[name="locale"]').content;
// or fetch from headers in SPAs.
Header Parsing Quirks
AcceptLanguage::parse() (Laravel 9+). Edge cases:
Accept-Language: en-US,fr;q=0.9 → defaults to en.Caching Conflicts
Cache::forget('view::*') or disable caching for dynamic locales.Middleware Order
SetLocaleFromHeader before StartSession to avoid session bloat with locale data.TrustProxies if behind a proxy (to read original headers).Config Overrides
App::setLocale() but doesn’t override it.config(['language-header.default' => 'es']) to change defaults dynamically.\Log::debug('Parsed locale:', ['locale' => $locale]);
supported_locales matches your app’s config/app.locales.Accept-Language:Accept-Language: xx-YYAccept-Language: en-US,fr-FR;q=0.8Custom Header Names
Override config('language-header.header_name') to use X-Custom-Locale.
Locale Resolution Logic Extend the middleware:
class CustomLocaleMiddleware extends SetLocaleFromHeader {
protected function resolveLocaleFromRequest(): string {
// Custom logic (e.g., URL param fallback)
return parent::resolveLocaleFromRequest() ?? request()->route('locale');
}
}
Response Header Modification
Hook into Illuminate\Http\Middleware\AppendLocaleHeader to modify the X-Locale value:
public function handle($request, Closure $next) {
$response = $next($request);
$response->headers->set('X-Locale', strtoupper(app()->getLocale()));
return $response;
}
Locale Negotiation
Combine with laravel-i18n-routing for URL-based fallback:
// config/language-header.php
'fallback_to_route_locale' => true,
How can I help you explore Laravel packages today?