Laravel provides its own localization library to handle the multi language feature in application. Laravel stores each languages translations in resource/lang
. If you are going to build a full featured multi language website then you are at right place to end your search. In this article i will show you to translate the website in different languages using the Laravel localization library. I will pick 3 languages to change English, French and Spanish. You will be able to switch the language by selecting three of one.
So let’s begin the tutorial step by step
Step 1: Create a laravel project
First step is to create the Laravel 8 project using composer command or you can also read the How to install laravel 8 ? and Laravel artisan command to generate controllers, Model, Components and Migrations
composer create-project laravel/laravel example-app
Step 2: Create a Languges files
Next step is to create the each language files in resources/lang
folder. In this example we are taking example of three languages so we need to create 3 sub directory in resources/lang
folder. below is the example
/resources
/lang
/en
messages.php
/fr
messages.php
/es
messages.php
Therefore, as above creating 3 files .
English
<?php
return [
"title"=>"Hello Guest, This is readerstacks. how are you today"
];
Spanish
<?php
return [
"title"=>"Hola invitado, estas son las pilas de lectores. cómo estás hoy"
];
French
<?php
return [
"title"=>"Bonjour Invité, Ceci est readerstacks. Comment vas-tu aujourd'hui"
];
Step 3: Create routes
Create route to show the html and change language route
<?php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
$this->group([ 'middleware' => 'Language'], function () {
Route::get('/home',"\App\Http\Controllers\HomeController@index");
Route::get('/change-language/{lang}',"\App\Http\Controllers\HomeController@changeLang");
});
Here, we created two routes one for view and other for change language and we used a Middleware Language
which is used to set the selected language on each request. so let’s create the middleware
Step 4 : Create a language middleware
We are creating middleware to set the selected language on every request . so create the middleware by running the artisan command
php artisan make:middleware Language
and the change the content as below
<?php
namespace App\Http\Middleware;
use Closure;
use App;
class Language
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if(session()->has("lang_code")){
App::setLocale(session()->get("lang_code"));
}
return $next($request);
}
}
Register our new middleware in app\Http\kernel.php
<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
.....
protected $routeMiddleware = [
....
"Language"=>\App\Http\Middleware\Language::class
];
}
Step 5 : Create a controller
Create the controller and add the necessary imports and class. You can create by Laravel artisan or manually.
php artisan make:controller HomeController
And put the below content
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App;
class HomeController extends Controller
{
function index(){
return view("home");
}
function changeLang($langcode){
App::setLocale($langcode);
session()->put("lang_code",$langcode);
return redirect()->back();
}
}
here, we created two methods one for render the view and second for change the language. We also set session so we can use the same language in other request. To handle the other requests we have already created middleware. App::setLocale($langcode);
is used to set the language file for current request but we want it in our all request so i store the language code in session as well.
Step 5 : Create view
Now, create a view where we can show the translation and can change the language using select box
<body>
<h1>Laravel multi language web with example -readerstacks.com </h1>
<div>
Langauge : <select onchange="changeLanguage(this.value)" >
<option {{session()->has('lang_code')?(session()->get('lang_code')=='en'?'selected':''):''}} value="en">English</option>
<option {{session()->has('lang_code')?(session()->get('lang_code')=='fr'?'selected':''):''}} value="fr">French</option>
<option {{session()->has('lang_code')?(session()->get('lang_code')=='es'?'selected':''):''}} value="es">Spanish</option>
</select>
</div>
<h2>{{__("messages.title")}}</h2>
</body>
<script>
function changeLanguage(lang){
window.location='{{url("change-language")}}/'+lang;
}
</script>
here, we have created a select box to choose the language and we have used __()
function to render the respective selected language .
Screenshot of implementation: