MultiLingual in Laravel 5 sau cum facem un website cu mai multe 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

2 thoughts on “MultiLingual in Laravel 5 sau cum facem un website cu mai multe limbi

  1. valentin

    Salut, super tutorial insa packetul nu tb descarcat, il are el default RO, nu se intampla nimic cand modific in app

    • La moment cand am facut acest tutorial, se pare ca packetul nu era inclus in Laravel

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>