MultiLingual in Laravel 5 sau cum facem un website cu mai ulte limbi

Nu cu mult timp in urma, am descoperit pentru mine un nou si “prea-frumos” php-framework – Laravel (înțeleg, poate pentru voi e vechi, dar pentru mine-i nou cool )
Așa cum țara noastra are nevoie ca 90% din site-uri sa aiba cel puțin 2 limbi (româna și rusa) cu siguranță că dacă ești programator php – ai sau ai avut sau vei avea nevoia de a face proiectul tau sa fie multi-lingual.

Mai jos am să încerc sa deslușesc realizația facută în Laravel 5 (cel puin la mine acum e versiunea 5.1)

Din start va spun că nu vom folosi în adresa URI limba în care este încărcat site-ul, pentru ca în general te poate duce în eroare cu denumirea Controller-ului sau metodei folosite, știu că e bine pentru motoarele de căutare (aici vorbesc de Google, Yahoo, etc…) dar asta o puteți face și singuri, prin adaugare rooter-urilor ))

Ok, începem, mai întâi modificam puțin configurația aplicației, fișierul config/app.php 
– căutam linia ‘locale’ => ‘en’ și o modificam în ‘locale’=>’ro’ asta pentru a avea limba implicită a site-ului,
– puțin mai jos modificam ‘fallback_locale’ =>’en’ în ‘fallback_locale’ =>’ro’  asta pentru limba implicita în caz de eroare,
– mai adăugăm o linie de cod pentru a stoca toate limbile ‘languages’ => [ ‘ro’ => ‘Româna’, ‘en’ => ‘English’, ‘ru’ => ‘Русский’ ] , vom primi urmatorul cod

// config/app.php

'locale' => 'ro',
'languages' =>  [
    'ro'=>'Româna',
    'en'=>'English',
    'ru'=>'Русский'
],
'fallback_locale' => 'ro',

Bun, acum putem adăuga un controller nou LanguageController, o putem face manual sau cu ajutorul liniei de comanda, php artisan make:controller LanguageController  după care-l modificam cu urmatorul cod

<?php

//app/Http/Controllers/LanguageController.php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Config;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Redirect;

class LanguageController extends Controller
{


    public function switchLang($lang)
    {
        if(array_key_exists($lang, Config::get('app.languages'))){
            Session::set('lang',$lang);
        }
        return Redirect::back();
    }

}

Acum pentru a folosi acest controller, avem nevoie de un route care să-l cheme

//app/Http/routes.php

Route::get('lang/{lang}', ['as'=>'lang.switch', 'uses'=>'LanguageController@switchLang']);

Pentru a ajunge la aces route și la acest controller, evident avem nevoie de a desena partea UI în views, o puteți face în ce metodă doriți, eu am folosit Bootstrap  si am facut-o în felul urmator

<a class="dropdown-toggle" href="#" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
	<img src="{{ asset('/assets/img/flag_'.App::getLocale().'.png') }}" > 
	{{ Config::get('app.languages')[App::getLocale()] }}
</a>
<div class="dropdown-menu">
	@foreach (Config::get('app.languages') as $lang => $language)
		<a class="dropdown-item" href="/lang/{{$lang}}">
			<img src="{{ asset('/assets/img/flag_'.$lang.'.png') }}" > {{$language}}
		</a>
	@endforeach
</div>

Ne-a mai rămas să adaugam un Middleware pe care-l vom numi Language

<?php
//app/Http/Middleware/Language.php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Contracts\Routing\Middleware;
use Illuminate\Foundation\Application;
use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Session;

class Language  {
    public function handle($request, Closure $next)
    {
        if (Session::has('lang') && array_key_exists(Session::get('lang'), Config::get('app.languages'))) {
            App::setLocale(Session::get('lang'));
        }
        else {
            App::setLocale(Config::get('app.fallback_locale'));
        }
        return $next($request);
    }
}

și nu uitam sa adăugăm Middleware-ul nostru in Kernel.php

protected $middleware = [
.....................................
    \App\Http\Middleware\Language::class,
];

Cam asta, sper să vă fie de ajutor