Articles

Guide étape par étape de localisation de Laravel, tutoriel avec exemples

Comment localiser un projet Laravel, comment développer un projet en Laravel et le rendre utilisable en plusieurs langues. Dans cet article, nous voyons comment travailler avec des fichiers de traduction, créer un sélecteur de langue et plus encore avec des exemples.

Laravel est une application conçue pour être locale, pour s'adapter à diverses langues et cultures. La localisation adapte les applications internationalisées à une langue spécifique grâce à la traduction.

Conditions préalables

  • Dans cet article, nous ferons référence à Laravel version 8.x;
  • Pour suivre avec succès ce tutoriel, vous devez avoir les connaissances nécessaires du langage de programmation PHP et du framework Laravel.
  • Votre domaine est localhost. Si ce n'est pas le cas, remplacez localhost avec votre propre nom de domaine ou adresse IP (selon votre installation).

Travailler avec des fichiers de traduction

Dans Laravel, comme dans de nombreux autres frameworks, nous pouvons stocker des traductions pour différentes langues dans des fichiers séparés. Il existe deux manières d'organiser les fichiers de traduction Laravel :

  • Une approche plus ancienne qui stocke les fichiers à l'emplacement suivant : resources/lang/{en,fr,ru}/{myfile.php};
  • Une nouvelle approche qui stocke les fichiers à l'emplacement suivant : resources/lang/{fr.json, ru.json};

Pour les langues qui diffèrent selon le territoire, vous devez les nommer directory/file de la langue selon la norme ISO 15897. Par exemple, pour l'anglais britannique, vous utiliserez en_GB au lieu de en-gb. Dans cet article, nous nous concentrerons sur la deuxième approche, mais il en va de même pour la première (à l'exception de la manière dont les clés de traduction sont nommées et récupérées). 

Traductions simples

Passons maintenant au resources/views/welcome.blade.phpfichier et remplacer le contenu du bodytag avec le nôtre, comme ceci:

<body class="antialiased">
    <div class="relative flex items-top justify-center min-h-screen bg-gray-100 dark:bg-gray-900 sm:items-center py-4 sm:pt-0">
        <div class="max-w-6xl mx-auto sm:px-6 lg:px-8">
            <div class="flex justify-center pt-8 sm:justify-start sm:pt-0">
                Welcome to our website
            </div>
        </div>
    </div>
</body>

Nous allons commencer par préparer notre message de bienvenue pour la localisation, ce qui est vraiment facile dans Laravel. Il suffit de remplacer le texte « Bienvenue sur notre site » par le code suivant : {{ __('Welcome to our website') }}. Cela demandera à Laravel d'afficher "Bienvenue sur notre site Web" par défautdefinite et recherchez les traductions de cette chaîne si une langue autre que l'anglais est définie (nous y reviendrons plus tard). L'anglais sera défini comme langue par défautdefinish de notre application, donc par défautdefiÀ la fin, nous afficherons simplement le texte "Bienvenue sur notre site Web". Si les paramètres régionaux sont différents, nous essaierons de trouver la traduction correspondante et elle sera créée dans un instant.

Localisation Laravel

Mais comment Laravel sait-il quelle est la langue actuelle ou quelles langues sont disponibles dans l'application ? Il le fait en regardant la configuration locale dans l'application config/app.php. Ouvrez ce fichier et recherchez ces deux clés de tableau associatif :

/*
|--------------------------------------------------------------------------
| 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' => 'en',
/*
|--------------------------------------------------------------------------
| Application Fallback Locale
|--------------------------------------------------------------------------
|
| The fallback locale determines the locale to use when the current one
| is not available. You may change the value to correspond to any of
| the language folders that are provided through your application.
|
*/
'fallback_locale' => 'en',

Les descriptions présentées au-dessus des touches devraient être explicites, mais en bref, la clé locale contient le pré localdefinition de votre application (au moins, si aucune autre locale n'a été définie dans le code). Et le fallback_locale il est activé au cas où nous définirions une locale inexistante dans notre application.

Pendant que nous avons ce fichier ouvert, ajoutons une nouvelle clé pour notre commodité listant tous les paramètres régionaux que notre application prendra en charge. Nous l'utiliserons plus tard lors de l'ajout d'un mélangeur local. Cependant, il s'agit d'une tâche facultative car Laravel ne nous oblige pas à le faire.

/*
|--------------------------------------------------------------------------
| Available locales
|--------------------------------------------------------------------------
|
| List all locales that your application works with
|
*/
'available_locales' => [
  'English' => 'en',
  'Italian' => 'it',
  'French' => 'fr',
],

Maintenant, notre application prend en charge trois langues : anglais, italien et français.

Fichier de traduction

Maintenant que nous avons établi tous les paramètres régionaux avec lesquels nous allons travailler, nous pouvons continuer et passer à la traduction de notre message de pré-accueildefinuit.

Commençons par ajouter de nouveaux fichiers de localisation au dossier resources/lang. Tout d'abord, créez un fichier resources/lang/it.json et ajoutez les traductions correspondantes, comme suit :

{
  "Welcome to our website": "Benvenuto nel nostro sito web"
}

Ensuite, créez un fichier resources/lang/fr.json:

{

"Bienvenue sur notre site": "Bienvenue sur notre site"

}

Comme vous pouvez le voir, nous nous référons toujours au message préalabledefinito que nous avons ajouté dans le fichier welcome.blade.php (ce qui était {{ __('Welcome to our website') }}). La raison pour laquelle nous n'avons pas besoin de créer un fichier en.json c'est parce que Laravel sait déjà quels messages nous transmettons par préréglagedefiterminé à la fonction __() ils sont pour notre pré localdefinito fr.

Changement local à Laravel

À ce stade, Laravel ne sait pas comment changer les paramètres régionaux, donc pour l'instant, faisons les traductions directement à l'intérieur du chemin. Modifier le chemin d'accueil avantdefifini comme indiqué ci-dessous :

Route::get('/{locale?}', function ($locale = null) {
    if (isset($locale) && in_array($locale, config('app.available_locales'))) {
        app()->setLocale($locale);
    }
    
    return view('welcome');
});

Nous pouvons maintenant visiter notre site Web, en spécifiant l'une des langues disponibles comme premier segment de chemin : par exemple, localhost/rulocalhost/fr. Vous devriez voir le contenu localisé. Si vous spécifiez une locale non prise en charge ou si vous ne spécifiez pas de locale du tout, Laravel utilisera enpar défautdefinita.

Middleware

Changer les paramètres régionaux pour chaque lien de site peut ne pas être ce que vous voulez, et cela peut ne pas sembler aussi propre esthétiquement. C'est pourquoi nous allons régler la langue via un sélecteur de langue spécial et utiliser la session utilisateur pour afficher le contenu traduit. Par conséquent, créez un nouveau middleware à l'intérieur du app/Http/Middleware/Localization.phpfichier ou en exécutant artisan make:middleware Localization.

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Session;

class Localization
{
    /**
    * Handle an incoming request.
    *
    * @param  \Illuminate\Http\Request  $request
    * @param  \Closure  $next
    * @return mixed
    */
    public function handle(Request $request, Closure $next)
    {
        if (Session::has('locale')) {
            App::setLocale(Session::get('locale'));
        }
        return $next($request);
    }
}

Ce middleware demandera à Laravel d'utiliser les paramètres régionaux sélectionnés par l'utilisateur si cette sélection est présente dans la session.

Comme nous avons besoin que cela soit fait à chaque requête, nous devons également l'ajouter à la pile pré-middlewaredefiterminé en app/http/Kernel.phple webgroupe middleware :

* 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, /* <--- add this */
  ],

Changer de cours

Ensuite, nous devons ajouter un chemin pour changer les paramètres régionaux. Nous utilisons un chemin de fermeture, mais vous pouvez utiliser exactement le même code dans votre contrôleur si vous le souhaitez :

Route::get('language/{locale}', function ($locale) {
    app()->setLocale($locale);
    session()->put('locale', $locale);

    return redirect()->back();
});

N'oubliez pas non plus de supprimer la bascule de paramètres régionaux précédemment ajoutée dans notre chemin de pré-accueildefifini :

Route::get('/', function () {
    return view('welcome');
});

Une fois cela fait, la seule façon pour l'utilisateur de changer la langue actuellement définie est d'entrer localhost/language/{locale}. La localela sélection sera stockée dans la session et redirigera les utilisateurs vers d'où ils viennent (vérifier la Localizationmiddleware). Pour l'essayer, rendez-vous sur localhost/language/ru(tant que votre cookie de session est présent dans votre navigateur) et vous verrez le contenu traduit. Vous pouvez vous déplacer librement sur le site Web ou essayer de rafraîchir la page et voir que la langue sélectionnée est conservée.

Le commutateur

Nous devons maintenant créer quelque chose sur lequel l'utilisateur peut cliquer pour changer la langue au lieu de saisir manuellement les codes locaux dans l'URL. Pour ce faire, nous allons ajouter un vérificateur de langue très simple. Par conséquent, créez un nouveau resources/views/partials/language_switcher.blade.phpfichier avec le code suivant :

<div class="flex justify-center pt-8 sm:justify-start sm:pt-0">
    @foreach($available_locales as $locale_name => $available_locale)
        @if($available_locale === $current_locale)
            <span class="ml-2 mr-2 text-gray-700">{{ $locale_name }}</span>
        @else
            <a class="ml-1 underline ml-2 mr-2" href="language/{{ $available_locale }}">
                <span>{{ $locale_name }}</span>
            </a>
        @endif
    @endforeach
</div>

Incluez le switcher nouvellement créé dans la vue "welcome" :

<body class="antialiased">
    <div class="relative flex items-top justify-center min-h-screen bg-gray-100 dark:bg-gray-900 sm:items-center py-4 sm:pt-0">
        <div class="max-w-6xl mx-auto sm:px-6 lg:px-8">
            @include('partials/language_switcher')
            <div class="flex justify-center pt-8 sm:justify-start sm:pt-0">
                {{ __('Welcome to our website') }}
            </div>
        </div>
    </div>
</body>

Ouvrez le app/Providers/AppServiceProvider.phpfichier et ajoutez le code à partager lorsque notre sélecteur de langue sera composé. Plus précisément, nous partagerons les paramètres régionaux actuels accessibles en tant que fichier {{ $current_locale }}.

Bulletin d'innovation
Ne manquez pas les nouvelles les plus importantes sur l'innovation. Inscrivez-vous pour les recevoir par email.

Options de traduction avancées en PHP Laravel

Nous travaillerons principalement avec resources/views/welcome.blade.php, donc tout doit se passer dans notre vue de bienvenue, sauf indication contraire.

Paramètres dans les chaînes de traduction

Par exemple, disons bonjour à notre utilisateur imaginaire (Amanda) au lieu de simplement afficher un message générique :

{{ __('Welcome to our website, :Name', ['name' => 'caroline']) }}

Notez que nous avons utilisé le nom avec la première lettre en minuscule, mais l'espace réservé avec la première lettre en majuscule. De cette façon, Laravel peut vous aider à mettre automatiquement en majuscule le mot réel. Cela se produira si l'espace réservé commence par une lettre majuscule, par exemple, :Nameproduit "Caroline" ou un mot en majuscule,  :NAME, produit « CAROLINE ».

Nous mettons également à jour nos fichiers de traduction resources/lang/fr.jsonresources/lang/it.json , car pour le moment nous ne verrons que la version anglaise car les clés de traduction ne correspondent pas aux traductions.

Français:

{

   "Welcome to our website, :Name": "Bienvenue sur notre site, :Name"

}

italien:

{

   "Welcome to our website, :Name": "Benvenuto sul nostro sito web, :Name"

}

Pluralisation

Pour voir la pluralisation en action, ajoutons un nouveau paragraphe de texte. 

Pour effectuer la pluralisation, vous devez utiliser la fonction trans_choice au lieu de __(), par exemple:

{{ __('Welcome to our website, :Name', ['name' => 'caroline']) }}
<br>
{{ trans_choice('There is one apple|There are many apples', 2) }}

Comme vous pouvez le voir, les formes plurielles sont séparées par un |.

Maintenant, que se passe-t-il si nous avons besoin de plusieurs formes plurielles ? 

C'est aussi possible :

{{ trans_choice('{0} There :form no apples|{1} There :form just :count apple|[2,19] There :form :count apples', 24) }}

Dans ce cas, nous autorisons les nombres 01, Et 219, et enfin à partir de 20 ans. Bien entendu, vous pouvez ajouter autant de règles que nécessaire.

Alors que se passe-t-il si nous voulons les espaces réservés dans nos formes plurielles ? 

{{ trans_choice('{0} There :form no apples|{1} There :form just :count apple|[2,19] There :form :count apples', 24, ['form' => 'is']) }}

Nous pouvons également utiliser le nombre passé dans `trans_choice` si nécessaire en utilisant un espace réservé :count spécial:

{{ trans_choice('{0} There :form no apples|{1} There :form just :count apple|[2,19] There :form :count apples', 1, ['form' => 'is']) }}

Enfin, n'oubliez pas de mettre à jour vos fichiers de traduction avec toutes les modifications que vous avez apportées à la traduction de base.

italien:

{
  "Welcome to our website, :Name": "Benvenuto nel nostro sito, :Name",
  "{0} There :form no apples|{1} There :form just :count apple|[2,19] There :form :count apples": "{0} Nessuna mela|{1} C'è:count mela|[2,19] Ci sono :count mele"
}

Français:

{    
  "Welcome to our website, :Name": "Bienvenue sur notre site, :Name",
  "{0} There :form no apples|{1} There :form just :count apple|[2,19] There :form :count apples": "{0} Il n'y a pas de pommes|{1} Il n'y :form :count pomme|[2,19] Il y :form :count pommes"
}

Travailler avec des dates localisées dans Laravel

Pour localiser les dates, nous allons exploiter la puissance de Carbone , qui est fourni avec Laravel par défautdefinita. Vérifiez Documentation carbone ; vous pouvez faire beaucoup de choses intéressantes. Par exemple, nous pouvons définir nos paramètres régionaux avec des règles de date et d'heure.

Pour notre exemple simple, nous afficherons la date actuelle localisée pour la langue sélectionnée. Dans notre routes/web.php, nous mettons à jour le chemin de la page d'accueil et transmettons le message de date localisé au nôtre view accueillir:

<?php
Route::get('/', function () {
    $today = \Carbon\Carbon::now()
        ->settings(
            [
                'locale' => app()->getLocale(),
            ]
        );

    // LL is macro placeholder for MMMM D, YYYY (you could write same as dddd, MMMM D, YYYY)
    $dateMessage = $today->isoFormat('dddd, LL');

    return view('welcome', [
        'date_message' => $dateMessage
    ]);
});

mettons à jour resources/views/welcome.blade.php ajouter l'affichage de la date, comme ceci :

{{ __('Welcome to our website, :Name', ['name' => 'amanda']) }}
<br>
{{ trans_choice('{0} There :form :count apples|{1} There :form just :count apple|[2,19] There :form :count apples', 1, ['form' => 'is']) }}
<br>
{{ $date_message }}

Essayer de changer la langue sur la page d'accueil de localhost, nous verrons que les dates sont désormais localisées, par exemple :

Formater des nombres et des devises avec NumberFormatter

Dans différents pays, les gens utilisent différents formats pour représenter les nombres, par exemple :

  • États-Unis → 123.123,12 XNUMX
  • France → 123 123,12

Par conséquent, pour refléter ces différences dans votre application Laravel, vous pouvez utiliser Formateur de nombre de la manière suivante:

<?php
$num = NumberFormatter::create('en_US', NumberFormatter::DECIMAL);

$num2 = NumberFormatter::create('fr', NumberFormatter::DECIMAL);

Vous pouvez également écrire le nombre dans une langue particulière et afficher quelque chose comme « cent vingt-trois mille cent vingt-trois virgule un deux » :

<?php
$num = NumberFormatter::create('en_US', NumberFormatter::SPELLOUT);
$num2 = NumberFormatter::create('fr', NumberFormatter::SPELLOUT);

De plus, NumberFormatter vous permet de localiser facilement les devises, par exemple :

<?php
$currency1 = NumberFormatter::create('fr', NumberFormatter::CURRENCY);
$currency2 = NumberFormatter::create('en_US', NumberFormatter::CURRENCY);

Donc pour fr vous verrez Euros, tandis que pour en_US la devise sera en dollars américains.

Ercole Palmeri

Bulletin d'innovation
Ne manquez pas les nouvelles les plus importantes sur l'innovation. Inscrivez-vous pour les recevoir par email.

Articles récents

La nouvelle intelligence artificielle de Google peut modéliser l'ADN, l'ARN et « toutes les molécules de la vie »

Google DeepMind présente une version améliorée de son modèle d'intelligence artificielle. Le nouveau modèle amélioré offre non seulement…

9 mai 2024

Explorer l'architecture modulaire de Laravel

Laravel, célèbre pour sa syntaxe élégante et ses fonctionnalités puissantes, constitue également une base solide pour l'architecture modulaire. Là…

9 mai 2024

Cisco Hypershield et acquisition de Splunk La nouvelle ère de la sécurité commence

Cisco et Splunk aident leurs clients à accélérer leur transition vers le centre d'opérations de sécurité (SOC) du futur avec…

8 mai 2024

Au-delà du côté économique : le coût peu évident des ransomwares

Les ransomwares ont dominé l’actualité ces deux dernières années. La plupart des gens savent bien que les attaques…

6 mai 2024

Intervention innovante en réalité augmentée, avec une visionneuse Apple à la polyclinique de Catane

Une opération d'ophtalmoplastie à l'aide de la visionneuse commerciale Apple Vision Pro a été réalisée à la polyclinique de Catane…

3 mai 2024

Les avantages des pages à colorier pour les enfants - un monde de magie pour tous les âges

Développer la motricité fine grâce au coloriage prépare les enfants à des compétences plus complexes comme l’écriture. Colorier…

2 mai 2024

L’avenir est là : comment le secteur du transport maritime révolutionne l’économie mondiale

Le secteur naval est une véritable puissance économique mondiale, qui a navigué vers un marché de 150 milliards...

1 mai 2024

Les éditeurs et OpenAI signent des accords pour réguler les flux d'informations traitées par l'intelligence artificielle

Lundi dernier, le Financial Times a annoncé un accord avec OpenAI. FT autorise son journalisme de classe mondiale…

30 avril 2024