Automatically detect and set an app locale that matches your visitor's preference.
codezero/laravel-localizer is a Laravel package for automatically detect and set an app locale that matches your visitor's preference..
It currently has 50 GitHub stars and 401.269 downloads on Packagist (latest version 3.0.0).
Install it with composer require codezero/laravel-localizer.
Discover more Laravel packages by codezero
or browse all Laravel packages to compare alternatives.
Last updated
Automatically detect and set an app locale that matches your visitor's preference.
Upgrading to a new major version? Check our upgrade guide for instructions.
Install this package with Composer:
composer require codezero/laravel-localizer
Laravel will automatically register the ServiceProvider.
By default, the app locale will always be what you configured in config/app.php.
To automatically update the app locale, you need to register the middleware in the web middleware group.
Make sure to add it after StartSession and before SubstituteBindings.
The order of the middleware is important if you are using localized route keys (translated slugs)! The session needs to be active when setting the locale, and the locale needs to be set when substituting the route bindings.
Add the middleware to the web middleware group in bootstrap/app.php.
// bootstrap/app.php
->withMiddleware(function (Middleware $middleware) {
$middleware->web(remove: [
\Illuminate\Routing\Middleware\SubstituteBindings::class,
]);
$middleware->web(append: [
\CodeZero\Localizer\Middleware\SetLocale::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
]);
})
Add the middleware to the web middleware group in app/Http/Kernel.php.
// app/Http/Kernel.php
protected $middlewareGroups = [
'web' => [
//...
\Illuminate\Session\Middleware\StartSession::class, // <= after this
//...
\CodeZero\Localizer\Middleware\SetLocale::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class, // <= before this
],
];
php artisan vendor:publish --provider="CodeZero\Localizer\LocalizerServiceProvider" --tag="config"
You will now find a localizer.php file in the config folder.
Add any locales you wish to support to your published config/localizer.php file:
'supported_locales' => ['en', 'nl'];
By default, the UrlDetector will look for these locales in the URL.
You can also use one or more custom slugs for a locale:
'supported_locales' => [
'en' => 'english-slug',
'nl' => ['dutch-slug', 'nederlandse-slug'],
];
Or you can use one or more custom domains for a locale:
'supported_locales' => [
'en' => 'english-domain.test',
'nl' => ['dutch-domain.test', 'nederlands-domain.test'],
];
By default, the middleware will use the following detectors to check for a supported locale in:
| # | Detector | Description |
|:---:|-------------------------|------------------------------------------------------------------------|
| 1. | RouteActionDetector | Checks for a locale in a custom route action. |
| 2. | UrlDetector | Tries to find a locale based on the URL slugs or domain. |
| 3. | OmittedLocaleDetector | Required if an omitted locale is configured. This will always be used. |
| 4. | UserDetector | Checks a configurable locale attribute on the authenticated user. |
| 5. | SessionDetector | Checks the session for a previously stored locale. |
| 6. | CookieDetector | Checks a cookie for a previously stored locale. |
| 7. | BrowserDetector | Checks the preferred language settings of the visitor's browser. |
| 8. | AppDetector | Checks the default app locale as a last resort. |
Update the detectors array in the config file to choose which detectors to run and in what order.
You can create your own detector by implementing the
CodeZero\Localizer\Detectors\Detectorinterface and add a reference to it in the config file. The detectors are resolved from Laravel's IOC container, so you can add any dependencies to your constructor.
The first supported locale that is returned by a detector will automatically be stored in:
| # | Store | Description |
|:---:|----------------|-------------------------------------------|
| 1. | SessionStore | Stores the locale in the session. |
| 2. | CookieStore | Stores the locale in a cookie. |
| 3. | AppStore | Sets the locale as the active app locale. |
Update the stores array in the config file to choose which stores to use.
You can create your own store by implementing the
CodeZero\Localizer\Stores\Storeinterface and add a reference to it in the config file. The stores are resolved from Laravel's IOC container, so you can add any dependencies to your constructor.
omitted_localeIf you don't want your main locale to have a slug, you can set it as the omitted_locale (not the custom slug).
If you do this, no additional detectors will run after the UrlDetector and OmittedLocaleDetector.
This makes sense, because the locale will always be determined by those two in this scenario.
Example:
'omitted_locale' => 'en',
Result:
Default: null
trusted_detectorsAdd any detector class name to this array to make it trusted. (do not remove it from the detectors array)
When a trusted detector returns a locale, it will be used as the app locale, regardless if it's a supported locale or not.
Default: []
url_segmentThe index of the URL segment that has the locale, when using the UrlDetector.
Default: 1
route_actionThe custom route action that holds the locale, when using the RouteActionDetector.
Default: locale
To use the custom route action locale, you register a route like this:
Route::group(['locale' => 'nl'], function () {
//Route::get(...);
});
user_attributeThe attribute on the user model that holds the locale, when using the UserDetector.
If the user model does not have this attribute, this detector check will be skipped.
Default: locale
session_keyThe session key that holds the locale, when using the SessionDetector and SessionStore.
Default: locale
cookie_nameThe name of the cookie that holds the locale, when using the CookieDetector and CookieStore.
Default: locale
cookie_minutesThe lifetime of the cookie that holds the locale, when using the CookieStore.
Default: 60 * 24 * 365 (1 year)
composer test
If you discover any security related issues, please e-mail me instead of using the issue tracker.
A complete list of all notable changes to this package can be found on the releases page.
The MIT License (MIT). Please see License File for more information.