Laravel - Créer un site multilingue

13 décembre 2018 - : MVC Laravel Tutoriel - : Pas de commentaire

 10 1

Il peut s'avérer nécessaire de fournir un site en plusieurs langues. Laravel nous fournit plusieurs outils qui nous permettront d'y parvenir.

Il est important de noter que la traduction simple ne suffit généralement pas, il faudra plutôt parler de localisation, qui est plus pointue puisqu'elle adapte le langage utilisé au contexte culturel de la population ciblée.

Dans cet article, je vais traiter uniquement de la partie traduction.

Définir la langue par défaut de Laravel

Nous allons nous assurer que la langue par défaut de Laravel est bien celle que nous souhaitons utiliser.

Pour ce faire, nous allons ouvrir le fichier config/app.php et modifier le paramètre ci-dessous.

 
    /*
    |--------------------------------------------------------------------------
    | Application Locale Configuration
    |--------------------------------------------------------------------------
    |
    | The application locale determines the default locale that will be used
    | by the translation service provider. You are free to set this value
    | to any of the locales which will be supported by the application.
    |
    */
 
    'locale' => 'fr',
 
 

Dans l'exemple ci-dessus, le site considérera le français comme langue par défaut.

Les fichiers de traduction

Avant de mettre en place la traduction, il sera nécessaire de nous assurer que nous disposons des fichiers de traduction dans les langues ciblées.

Le Français (dans notre exemple) sera directement écrit dans les vues.

Les autres langues devront fournir la traduction des textes sous la forme d'un fichier json qui se situera dans resources/lang.

Il sera nommé en fonction de la langue cible, ainsi la traduction Anglaise sera dans un fichier en.json.

La structure du fichier sera la suivante

{
    "Accueil": "Home",
    "Proposer": "Submit",
    "Liste": "List",
    "Contact": "Contact"
}

Routes et contrôleur

Afin de pouvoir connaître la langue choisie et la modifier, nous allons créer des routes et un contrôleur de localization.

Le contrôleur

Nous allons créer le contrôleur en exécutant la commande suivante

php artisan make:controller LocalizationController

Nous obtiendrons le fichier suivant

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class LocalizationController extends Controller
{
    //
}

Dans ce fichier nous allons créer 2 méthodes, l'une pour obtenir la langue active, l'autre pour modifier la langue.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class LocalizationController extends Controller
{
    public function getLang() {
        return \App::getLocale();
    });

    public function setLang($lang){
        \Session::put('lang', $lang);
        return redirect()->back();
    }
}

Les routes

Une fois ces méthodes existantes, nous pouvons les appeler depuis nos routes.

Nous allons donc ajouter 2 routes à routes/web.php.

// Route qui permet de connaître la langue active
Route::get('locale', 'LocalizationController@getLang')->name('getlang');

// Route qui permet de modifier la langue
Route::get('locale/{lang}', 'LocalizationController@setLang')->name('setlang');

Le middleware

Afin d'effectuer la gestion des langues, nous avons enfin besoin d'un middleware.

Pour le créer, exécuter la commande suivante

php artisan make:middleware Localization

Vous obtiendrez le fichier Localization.php dans app/Http/Middleware, nous allons le modifier comme suit

<?php
 
namespace App\Http\Middleware;
 
use Closure;
 
class Localization
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ( \Session::has('lang')) {
            // Récupération de la 'lang' dans Session et activation
            \App::setLocale(\Session::get('lang'));
        }
 
        return $next($request);
    }
}

Après avoir créé le middleware, il ne faut pas oublier de l'ajouter dans app/Http/Kernel.php

    /**
     * The application's route middleware groups.
     *
     * @var array
     */
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
            \App\Http\Middleware\Localization::class,
 
        ],

Utilisation

Une fois tout ceci fait, nous sommes prêts à utiliser le système.

Afin de modifier la langue, il suffira d'appeler la route comme ceci

<a href="locale/en">English</a>

Pour insérer dans le html une chaîne de caractères à traduite, elle s'écrira comme ceci

<!-- Cette ligne affichera "Accueil" en Français et "Home" en Anglais -->
<p>{{ __("Accueil") }}</p>

Voilà qui devrait être fonctionnel.

Commentaires

Ecrire un commentaire

Pas encore de commentaire

Laisser un commentaire