Localisation i18n facile pour Laravel, un outil utile à combiner avec les classes de localisation Laravel.
Le forfait offre les éléments suivants :
Laravel | localisation laravel |
---|---|
4.0.x | 0.13.x |
4.1.x | 0.13.x |
4.2.x | 0.15.x |
5.0.x/5.1.x | 1.0.x |
5.2.x-5.4.x (PHP 7 non requis) | 1.2. |
5.2.0-6.x (version PHP >= 7 requise) | 1.4.x |
6.x-10.x (version PHP >= 7 requise) | 1.8.x |
10.x-11.x (version PHP >= 8.2 requise) | 2.0.x |
Installez le package via composer : composer require mcamara/laravel-localization
Pour Laravel 5.4 et versions antérieures, il est nécessaire d'enregistrer le fournisseur de services.
Afin de modifier la configuration par défaut, vous pouvez exécuter :
php artisan vendor:publish --provider="McamaraLaravelLocalizationLaravelLocalizationServiceProvider"
Après cela, config/laravellocalization.php
sera créé.
Les options de configuration sont :
Vous pouvez enregistrer le middleware du package dans le fichier app/Http/Kernel.php
:
<?php namespace App Http ;
use Illuminate Foundation Http Kernel as HttpKernel ;
class Kernel extends HttpKernel {
/**
* The application's route middleware.
*
* @var array
*/
protected $ middlewareAliases = [
/**** OTHER MIDDLEWARE ****/
' localize ' => Mcamara LaravelLocalization Middleware LaravelLocalizationRoutes::class,
' localizationRedirect ' => Mcamara LaravelLocalization Middleware LaravelLocalizationRedirectFilter::class,
' localeSessionRedirect ' => Mcamara LaravelLocalization Middleware LocaleSessionRedirect::class,
' localeCookieRedirect ' => Mcamara LaravelLocalization Middleware LocaleCookieRedirect::class,
' localeViewPath ' => Mcamara LaravelLocalization Middleware LaravelLocalizationViewPath::class
];
}
Si vous utilisez Laravel 11, vous pouvez vous inscrire dans le fichier bootstrap/app.php
en fermeture withMiddleware
:
return Application:: configure (basePath: dirname ( __DIR__ ))
// Other application configurations
-> withMiddleware ( function ( Middleware $ middleware ) {
$ middleware -> alias ([
/**** OTHER MIDDLEWARE ALIASES ****/
' localize ' => Mcamara LaravelLocalization Middleware LaravelLocalizationRoutes::class,
' localizationRedirect ' => Mcamara LaravelLocalization Middleware LaravelLocalizationRedirectFilter::class,
' localeSessionRedirect ' => Mcamara LaravelLocalization Middleware LocaleSessionRedirect::class,
' localeCookieRedirect ' => Mcamara LaravelLocalization Middleware LocaleCookieRedirect::class,
' localeViewPath ' => Mcamara LaravelLocalization Middleware LaravelLocalizationViewPath::class,
]);
})
Ajoutez ce qui suit à votre fichier d'itinéraires :
// routes/web.php
Route:: group ([ ' prefix ' => LaravelLocalization:: setLocale ()], function ()
{
/** ADD ALL LOCALIZED ROUTES INSIDE THIS GROUP **/
Route:: get ( ' / ' , function ()
{
return View:: make ( ' hello ' );
});
Route:: get ( ' test ' , function (){
return View:: make ( ' test ' );
});
});
/** OTHER PAGES THAT SHOULD NOT BE LOCALIZED **/
Une fois ce groupe de routes ajouté au fichier de routes, un utilisateur peut accéder à tous les paramètres régionaux ajoutés dans supportedLocales
( en
et es
par défaut). Par exemple, le fichier de route ci-dessus crée les adresses suivantes :
// Set application language to English
http://url-to-laravel/en
http://url-to-laravel/en/test
// Set application language to Spanish
http://url-to-laravel/es
http://url-to-laravel/es/test
// Set application language to English or Spanish (depending on browsers default locales)
// if nothing found set to default locale
http://url-to-laravel
http://url-to-laravel/test
Le package définit les paramètres régionaux de votre application App::getLocale()
en fonction de votre URL. Les paramètres régionaux peuvent ensuite être utilisés pour les fonctionnalités de localisation de Laravel.
Vous pouvez ajouter un middleware à votre groupe comme ceci :
Route:: group (
[
' prefix ' => LaravelLocalization:: setLocale (),
' middleware ' => [ ' localeSessionRedirect ' , ' localizationRedirect ' , ' localeViewPath ' ]
], function (){ //...
});
1. : Il est fortement recommandé d'utiliser un middleware de redirection. Les URL sans paramètres régionaux ne doivent être utilisées que pour déterminer les paramètres régionaux du navigateur/par défaut et pour rediriger vers l'URL localisée. Sinon, lorsque les robots des moteurs de recherche explorent par exemple http://url-to-laravel/test
ils peuvent obtenir un contenu dans une langue différente à chaque visite. Le fait d'avoir plusieurs URL pour le même contenu crée également un problème de contenu en double SEO.
2. : Il est fortement recommandé de localiser vos liens, même si vous utilisez un middleware de redirection. Sinon, vous provoquerez au moins une redirection à chaque fois qu'un utilisateur clique sur un lien. De plus, toute URL d'action provenant d'un formulaire de publication doit être localisée, pour éviter qu'elle ne soit redirigée vers une demande d'obtention.
Le middleware de redirection suivant dépend des paramètres de hideDefaultLocaleInURL
et useAcceptLanguageHeader
dans config/laravellocalization.php
:
Chaque fois qu'une locale est présente dans l'url, elle sera stockée dans la session par ce middleware.
S'il n'y a pas de paramètres régionaux présents dans l'URL, alors ce middleware vérifiera les éléments suivants
useAcceptLanguageHeader
est défini sur true, calculez les paramètres régionaux à partir du navigateur et redirigez vers l'URL avec les paramètres régionaux.hideDefaultLocaleInURL
soit défini sur true. Par exemple, si un utilisateur accède à http://url-to-laravel/test et en
est la langue actuelle, cela le redirigera automatiquement vers http://url-to-laravel/en/test.
Semblable à LocaleSessionRedirect, mais il stocke la valeur dans un cookie au lieu d'une session.
Chaque fois qu'une locale est présente dans l'url, elle sera stockée dans le cookie par ce middleware.
S'il n'y a pas de paramètres régionaux présents dans l'URL, ce middleware vérifiera les éléments suivants
useAcceptLanguageHeader
est défini sur true, calculez les paramètres régionaux à partir du navigateur et redirigez vers l'URL avec les paramètres régionaux.hideDefaultLocaleInURL
soit défini sur true. Par exemple, si un utilisateur accède à http://url-to-laravel/test et de
est la langue actuelle, cela le redirigera automatiquement vers http://url-to-laravel/de/test.
Lorsque les paramètres régionaux par défaut sont présents dans l'URL et que hideDefaultLocaleInURL
est défini sur true, le middleware redirige vers l'URL sans paramètres régionaux.
Par exemple, si es
est la langue par défaut, alors http://url-to-laravel/es/test sera redirigé vers http://url-to-laravel/test et App::getLocale()
sera défini. es
.
Ce package est livré avec un tas d’aides.
Les URL localisées prennent en compte la liaison du modèle de route lors de la génération de la route localisée, ainsi que les paramètres hideDefaultLocaleInURL
et Translated Routes.
// If current locale is Spanish, it returns `/es/test`
<a href="{{ LaravelLocalization:: localizeUrl ( ' /test ' ) }}">@ lang ( ' Follow this link ' )</a>
Obtenez l'URL actuelle dans des paramètres régionaux spécifiques :
// Returns current url with English locale.
{{ LaravelLocalization:: getLocalizedURL ( ' en ' ) }}
Renvoie une URL propre de toute localisation.
// Returns /about
{{ LaravelLocalization:: getNonLocalizedURL ( ' /es/about ' ) }}
Renvoie un itinéraire, localisé dans les paramètres régionaux souhaités. Si la clé de traduction n'existe pas dans les paramètres régionaux donnés, cette fonction retournera false.
// Returns /es/acerca
{{ LaravelLocalization:: getURLFromRouteNameTranslated ( ' es ' , ' routes.about ' ) }}
Exemple de lien localisé utilisant des routes avec des attributs
// An array of attributes can be provided.
// Returns /en/archive/ghosts, /fr/archive/fantômes, /pt/arquivo/fantasmas, etc.
<a href="{{ LaravelLocalization:: getURLFromRouteNameTranslated ( App:: currentLocale (), ' routes.archive ' , array ( ' category ' => ' ghosts ' )) }}">Ghost Stories</a>
Renvoie tous les paramètres régionaux pris en charge et leurs propriétés sous forme de tableau.
{{ LaravelLocalization:: getSupportedLocales () }}
Renvoie tous les paramètres régionaux pris en charge mais dans l'ordre spécifié dans le fichier de configuration. Vous pouvez utiliser cette fonction pour imprimer les paramètres régionaux dans le sélecteur de langue.
{{ LaravelLocalization:: getLocalesOrder () }}
Renvoie un tableau avec toutes les clés des paramètres régionaux pris en charge.
{{ LaravelLocalization:: getSupportedLanguagesKeys () }}
Renvoie la clé de la locale actuelle.
{{ LaravelLocalization:: getCurrentLocale () }}
Renvoie le nom de la locale actuelle sous forme de chaîne (anglais/espagnol/arabe/ ..etc).
{{ LaravelLocalization:: getCurrentLocaleName () }}
Renvoie le nom natif de la locale actuelle sous forme de chaîne (English/Español/عربى/ ..etc).
{{ LaravelLocalization:: getCurrentLocaleNative () }}
Renvoie le nom régional de la locale actuelle sous forme de chaîne (en_GB/en_US/fr_FR/ ..etc).
{{ LaravelLocalization:: getCurrentLocaleRegional () }}
Renvoie la direction des paramètres régionaux actuels sous forme de chaîne (ltr/rtl).
{{ LaravelLocalization:: getCurrentLocaleDirection () }}
Renvoie le code ISO 15924 du script de paramètres régionaux actuel sous forme de chaîne ; "Latn", "Cyrl", "Arabe", etc.
{{ LaravelLocalization:: getCurrentLocaleScript () }}
Enregistrez le middleware LaravelLocalizationViewPath
pour définir les paramètres régionaux actuels comme view-base-path.
Vous pouvez désormais regrouper vos vues dans des dossiers basés sur la langue, comme les fichiers de traduction.
resources/views/en/
, resources/views/fr
, ...
Comme vous pouvez modifier les paramètres locaux pris en charge même en renommant leurs clés, il est possible d'utiliser la chaîne uk
au lieu de en-GB
pour fournir des segments d'URL de langue personnalisés. Bien entendu, vous devez éviter toute collision avec des clés déjà existantes et respecter la convention le plus longtemps possible. Mais si vous utilisez une telle clé personnalisée, vous devez stocker votre mappage dans le tableau localesMapping
. Ce localesMapping
est nécessaire pour permettre à LanguageNegoator d'attribuer correctement les paramètres régionaux souhaités en fonction de l'en-tête de langue HTTP Accept. Voici un exemple rapide de la manière de mapper l'en-tête de langue d'acceptation HTTP « en-GB » au segment d'URL « uk » :
// config/laravellocalization.php
' localesMapping ' => [
' en-GB ' => ' uk '
],
Après cela, http://url-to-laravel/en-GB/a/b/c
devient http://url-to-laravel/uk/a/b/c
.
LaravelLocalization:: getLocalizedURL ( ' en-GB ' , ' a/b/c ' ); // http://url-to-laravel/uk/a/b/c
LaravelLocalization:: getLocalizedURL ( ' uk ' , ' a/b/c ' ); // http://url-to-laravel/uk/a/b/c
Si vous prenez en charge plusieurs paramètres régionaux dans votre projet, vous souhaiterez probablement fournir aux utilisateurs un moyen de changer de langue. Vous trouverez ci-dessous un exemple simple de code de modèle de lame que vous pouvez utiliser pour créer votre propre sélecteur de langue.
< ul >
@foreach ( LaravelLocalization :: getSupportedLocales () as $localeCode => $properties )
< li >
< a rel = " alternate " hreflang = " {{ $localeCode } } " href = " {{ LaravelLocalization :: getLocalizedURL ( $localeCode , null , [], true ) } } " >
{{ $properties [ ' native ' ] } }
</ a >
</ li >
@endforeach
</ ul >
Ici, la langue par défaut sera forcée dans getLocalizedURL() d'être présente dans l'URL même hideDefaultLocaleInURL = true
.
Notez que la liaison de modèle de route est prise en charge.
Vous pouvez traduire vos itinéraires. Par exemple, http://url/en/about et http://url/es/acerca (acerca signifie environ en espagnol) ou http://url/en/article/important-article et http://url/ es/articulo/important-article (l'article est articulo en espagnol) serait redirigé vers le même contrôleur/vue comme suit :
Il est nécessaire qu'au moins le middleware localize
soit chargé dans votre middleware Route::group
(voir les instructions d'installation).
Pour chaque langue, ajoutez un routes.php
dans le dossier resources/lang/**/routes.php
. Le fichier contient un tableau avec toutes les routes traduisibles. Par exemple, comme ceci :
Gardez à l'esprit : à partir de Laravel 9, le dossier
resources/lang
se trouve désormais dans le dossier racine du projet (lang
). Si votre projet a un dossierlang
à la racine, vous devez ajouter unroutes.php
dans le dossierlang/**/routes.php
.
<?php
// resources/lang/en/routes.php
return [
" about " => " about " ,
" article " => " article/{article} " ,
];
<?php
// resources/lang/es/routes.php
return [
" about " => " acerca " ,
" article " => " articulo/{article} " ,
];
Vous pouvez ajouter les routes dans routes/web.php
comme ceci :
Route:: group ([ ' prefix ' => LaravelLocalization:: setLocale (),
' middleware ' => [ ' localize ' ]], function () {
Route:: get (LaravelLocalization:: transRoute ( ' routes.about ' ), function () {
return view ( ' about ' );
});
Route:: get (LaravelLocalization:: transRoute ( ' routes.article ' ), function ( App Article $ article ) {
return $ article ;
});
//,...
});
Une fois les fichiers enregistrés, vous pouvez accéder à http://url/en/about , http://url/es/acerca , http://url/en/article/important-article et http://url/es/ articulo/important-article sans aucun problème.
Peut-être avez-vous remarqué dans l'exemple précédent le slug anglais dans l'URL espagnole :
http://url/es/articulo/important-article
Il est possible d'avoir des slugs traduits, par exemple comme ceci :
http://url/en/article/important-change
http://url/es/articulo/cambio-importante
Cependant, pour ce faire, chaque article doit avoir plusieurs slugs (un pour chaque paramètre régional). C'est à vous de décider comment vous souhaitez mettre en œuvre cette relation. La seule exigence pour les paramètres de route traduisibles est que le modèle concerné implémente l'interface LocalizedUrlRoutable
.
Pour implémenter McamaraLaravelLocalizationInterfacesLocalizedUrlRoutable
, il faut créer la fonction getLocalizedRouteKey($locale)
, qui doit renvoyer pour une locale donnée le slug traduit. Dans l'exemple ci-dessus, à l'intérieur de l'article modèle, getLocalizedRouteKey('en')
devrait renvoyer important-change
et getLocalizedRouteKey('es')
devrait renvoyer cambio-importante
.
Pour utiliser route-model-binding, il faut écraser la fonction resolveRouteBinding($slug)
dans le modèle. La fonction doit renvoyer le modèle qui appartient au slug $slug
traduit. Par exemple:
public function resolveRouteBinding ( $ slug )
{
return static :: findByLocalizedSlug ( $ slug )-> first () ?? abort ( 404 );
}
Vous souhaiterez peut-être visionner cette vidéo qui montre comment configurer des paramètres d'itinéraire traduisibles.
Vous pouvez capturer les paramètres d'URL pendant la traduction si vous souhaitez également les traduire. Pour ce faire, créez simplement un écouteur d'événement pour l'événement routes.translation
comme ceci :
Event:: listen ( ' routes.translation ' , function ( $ locale , $ attributes )
{
// Do your magic
return $ attributes ;
});
Assurez-vous de transmettre les paramètres régionaux et les attributs en tant que paramètres à la fermeture. Vous pouvez également utiliser des abonnés aux événements, voir : http://laravel.com/docs/events#event-subscribers
Pour mettre en cache vos itinéraires, utilisez :
php artisan route:trans:cache
... au lieu de la commande route:cache
normale. L’utilisation de artisan route:cache
ne fonctionnera pas correctement !
Pour que la solution de mise en cache des routes fonctionne, il est nécessaire de procéder à un ajustement mineur de la fourniture des routes de votre application.
avant Laravel 11
Dans le RouteServiceProvider
de votre application, utilisez le trait LoadsTranslatedCachedRoutes
:
<?php
class RouteServiceProvider extends ServiceProvider
{
use Mcamara LaravelLocalization Traits LoadsTranslatedCachedRoutes;
après Laravel 11
Dans AppServiceProvider
de votre application, utilisez la classe CachedTranslatedRouteLoader
dans la méthode de registre :
<?php
class AppServiceProvider extends ServiceProvider
{
use Mcamara LaravelLocalization Traits LoadsTranslatedCachedRoutes;
/**
* Bootstrap any application services.
*/
public function boot(): void
{
RouteServiceProvider:: loadCachedRoutesUsing ( fn () => $ this -> loadCachedRoutes ());
. . .
}
Pour plus de détails, voir ici.
Cela peut se produire si vous ne localisez pas votre route d'action qui se trouve à l'intérieur de votre Routes::group
. Cela peut provoquer une redirection, qui transforme ensuite la demande de publication en demande d'obtention. Pour éviter cela, utilisez simplement l'assistant de localisation.
Par exemple, si vous utilisez Auth::routes()
et que vous les placez dans votre Route::group
Alors
<form action="/logout" method="POST">
<button>Logout</button>
</form>
ne fonctionnera pas. Il faut plutôt utiliser
<form action ="{{ LaravelLocalization:: localizeURL ( ' /logout ' ) }} " method= " POST ">
<button>Logout</button>
</form>
Une autre façon de résoudre ce problème est de configurer la méthode http sur « laravellocalization.httpMethodsIgnored » pour éviter de traiter ce type de requêtes.
Si vous ne localisez pas l'URL de votre publication et n'utilisez pas de middleware de redirection, la demande de publication est redirigée en tant que demande d'obtention. Si vous n'avez pas défini une telle route d'obtention, vous provoquerez cette exception.
Pour localiser l'URL de votre publication, voir l'exemple dans POST ne fonctionne pas.
Cela se produit également si vous n'avez pas localisé l'URL de votre publication. Si vous ne localisez pas l'URL de votre message, les paramètres régionaux par défaut sont définis lors de la validation et lorsque vous revenez à back()
, le message de validation apparaît dans les paramètres régionaux par défaut.
Pour localiser l'URL de votre publication, voir l'exemple dans POST ne fonctionne pas.
Lors de la configuration du test, la route appelée n'est pas encore connue. Cela signifie qu'aucune langue ne peut être définie. Lorsqu'une requête est faite lors d'un test, cela se traduit par un 404 - sans le préfixe défini, la route localisée ne semble pas exister.
Pour résoudre ce problème, vous pouvez utiliser cette fonction pour définir manuellement le préfixe de langue :
// TestCase.php
protected function refreshApplicationWithLocale ( $ locale )
{
self :: tearDown ();
putenv (LaravelLocalization:: ENV_ROUTE_KEY . ' = ' . $ locale );
self :: setUp ();
}
protected function tearDown (): void
{
putenv (LaravelLocalization:: ENV_ROUTE_KEY );
parent :: tearDown ();
}
// YourTest.php
public function testBasicTest ()
{
$ this -> refreshApplicationWithLocale ( ' en ' );
// Testing code
}
Demandez à Mcamara si vous voulez être l'un d'entre eux !
Afficher le journal des modifications ici -> journal des modifications
Laravel Localization est un package Laravel open source sous licence MIT