Laravel multi language site
- Authors
- Name
- Jignesh Sanghani
- @jignesh19961020
Today I'll share my knowledge in laravel localization. setting up a multi-language site is not an easy task. somehow laravel makes it very easy for you. so let's dive into further in laravel localization.
- Localization middleware
- Set laravel app language
- Add middleware in kernel file
- Add route method to change languages
- Use in laravel
Overview
As you can see below directory structure. we have already resources/land
directory. This directory has all the translation files. There are two ways you can add/store translation string.
- You can create a
language_code.json
file.- For example you want to add the French language. Then add
fr.json
inresources/lang/fr.json
- For example you want to add the French language. Then add
- You can manage translation string your
resources/views
directory structure-wise- We need to create language code name-based directory then add your translation file You can check more details about the translation file in laravel official documentation: https://laravel.com/docs/7.x/localization
Add Multilanguage Feature Now let's see how we can add multilanguage features to the site.
Localization middleware
Create a localization middleware. to create via command use below command
php artisan make:middleware Localization
It'll create Localization middleware in /app/Http/Middleware/Localization.php
<?php
namespace AppHttpMiddleware;
use Closure;
class Localization
{
/**
* Handle an incoming request.
*
* @param IlluminateHttpRequest $request
* @param Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
return $next($request);
}
}
Set laravel app language
Laravel has two methods to manage the current language getLocale()
and setLocale()
. also we can put locale keyword on session and store current language code.
<?php
namespace AppHttpMiddleware;
use Closure;
class Localization
{
/**
* Handle an incoming request.
*
* @param IlluminateHttpRequest $request
* @param Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if(!empty($request->la)) {
App::setlocale($request->la);
Session::put('locale', $request->la);
}
return $next($request);
}
}
Here $request->la
, where la will have language code on which need to be translated.
Add middleware in kernel file
now we need to add Localization middleware to application's route middleware groups. so every time request is sent we check for language-related parameters and set language.
in /app/Http/Kernel.php
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
AppHttpMiddlewareEncryptCookies::class,
IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class,
IlluminateSessionMiddlewareStartSession::class,
// IlluminateSessionMiddlewareAuthenticateSession::class,
IlluminateViewMiddlewareShareErrorsFromSession::class,
AppHttpMiddlewareVerifyCsrfToken::class,
IlluminateRoutingMiddlewareSubstituteBindings::class,
AppHttpMiddlewareLocalization::class,
],
];
Add route method to change languages
Route::get('locale/{locale}', function ($locale){
Session::put('locale', $locale);
return redirect()->back();
})->name('lang.switcher');
Here I have written a clouser function but you shouldn't write a clouser function.
Use in laravel
Now your site become multi-language. you can switch language by
route('lang.switcher', [ 'locale' => 'fr' ]);
route('lang.switcher', [ 'locale' => 'hi' ]);
or you can pass la query parameter as we have taken care of middleware task.
route('home').'?la=fr';
route('home').'?la=hi';