Laravel 10 et les fichiers de traductions

Avant il y avait le package "caouecs/laravel-lang" qui a changé en "laravel-lang/lang" et puis le package "overtrue/laravel-lang". Et maintenant c'est différent.

Contexte historique

Donc au début nous avions à disposition un package qui contenait toutes les traductions de Laravel dans pleins de langues c’était « caouecs/laravel-lang ». Pour l’utiliser il fallait publier les langues dans l’application. Mais nous avions trouvé mieux : le package « overtrue/laravel-lang ». Ce dernier allait chercher les traductions dans « caouecs/laravel-lang » selon la langue de l’application, pas besoin de publier.

C’était le bon vieux temps 👴 😁

Après « caouecs/laravel-lang » est devenu « laravel-lang/lang » pour diverses raisons que j’ignore. Peut-être pour le « libérer à la communauté », qu’il y ai plus de personnes pour le maintenir et susciter plus de contributions. Mais cela continuait de fonctionner en associant « laravel-lang/lang » et « overtrue/laravel-lang ».

Au final il y 1 contributeur essentiellement qui a mis les mains dans le camboui. On ne peux pas lui reprocher mais tellement il a contribué et changé les choses que le combo « laravel-lang/lang » et « overtrue/laravel-lang » ne fonctionne plus avec Laravel 10. Le développeur de « overtrue/laravel-lang » a arrêté le support à la version 9 de Laravel (à mon avis lassé des nombreux et profonds changements dans « laravel-lang/lang »).

Laravel 10 & laravel-lang

Maintenant il faut utiliser laravel-lang/common qui est l’évolution de « laravel-lang/lang » et qui nécessite de publier les fichiers de traductions. C’est en fait un ensemble de packages comprenant toujours « laravel-lang/lang » mais aussi « laravel-lang/publisher » et un système de plugins.

Nous « revenons au point de départ » : il faut publier manuellement les fichiers de traductions.

Au premier abord j’étais réticent car je ne souhaitais pas « surveiller » les mises à jours pour publier lorsqu’il y avait des changements ; auparavent un simple composer update faisait le job. Mais ce nouveau système est, certe plus complexe, mais aussi plus évolué, il offre plus de possibilités notamment à travers son système de plugins.

Voyons comment faire.

Installation

Installer simplement le package avec composer mais contrairement à ce qu’indique la documentation pas en « require dev » ; autrement dit la documentation indique :

1composer require laravel-lang/common --dev

Mais ne faites pas cela, installez-le dans les dépendances « requises » :

1composer require laravel-lang/common

Ceci est nécessaire car le fichier de configuration fait appel à des constantes situées dans les packages. De fait, lors du déploiement en production (sans les dev requirement donc), si vous suivez la doc vous aurez un bug.

Si vous ne souhaitez pas publier le fichier de configuration alors faites comme la documentation le préconise.

Personnellement j’ai besoin de modifier ce qu’il y a dans ce fichier de configuration. Je publie donc le fichier de configuration :

1php artisan vendor:publish --provider="LaravelLang\Publisher\ServiceProvider" --tag="config"

Dans ce fichier je modifie deux choses :

36//...
37 /*
38 * Do arrays need to be aligned by keys before processing arrays?
39 *
40 * By default, true
41 */
42 
43 'align' => true,
43 'align' => false,
44 
45 /*
46 * This option determines the mechanism for converting translation
47 * keys into a typographic version.
48 *
49 * For example:
50 * for `false`:
51 * "It's super-configurable... you can even use additional extensions to expand its capabilities -- just like this one!"
52 * for `true`:
53 * “It’s super-configurable… you can even use additional extensions to expand its capabilities – just like this one!”
54 *
55 * By default, false
56 */
57 
58 'smart_punctuation' => [
59 'enable' => false,
59 'enable' => true,
60//...

L’alignement des valeurs selon la longueur des clés des tableaux PHP est désactivé car cela ne correspond pas à mon « coding standard ». Et de toutes façons Laravel Pint le remet systématiquement comme je le souhaite. Pour moi cette feature n’a aucun intéret, enfin c’est selon les goûts… 😉

Le second est plus important pour moi car il permet de remplacer les caractères de ponctuation ASCII par des caractères typographiques. C’est quand même beaucoup plus élégant « N’est-il pas ? » que "N'est-il pas ?" 🤵

Après vous pouvez installer les fichiers de traduction dans la langue souhaitée :

1php artisan lang:add fr

Notez que : « laravel-lang/common » n’est qu’un simple « meta package » qui installe les packages suivants :

Vous pouvez vous contenter de n’installer que « laravel-lang/lang » (qui a « laravel-lang/publisher » en dépendance).

Les deux autres (« laravel-lang/attributes » et « laravel-lang/http-statuses ») étant des plugins non requis. Mais bon, ces derniers peuvent êtres utiles et il est plus simple d’installer directement le package principal « laravel-lang/common » et laisser l’auteur gérer les compatibilitées entre tous ces packages.

Mettre à jour

Concernant la mise à jour des packages, réalisez l’installation décrite ci-avant et supprimez dans le fichier composer.json tous les anciens packages.

Mais je voulais ici surtout évoquer la mise à jour des fichiers de traductions. Pour cela vous devez lancer la commande :

1php artisan lang:update

Cela mettra à jour les fichiers de traductions dans toutes les langues si il y a des modifications à appliquer.

Ok mais on en viens là où cela me déplais : il faut lancer la commande manuellement non ?

– Oui.
– Ok mais quand ?
– A chaque modification d’un fichier de langue.
– Ah ! Il faut que je vérifie régulièrement alors ?
– Oui…
– Hey mais c’est relou ce truc, ça sera mis à jour au petit bonheur la chance !
– Euh… Hum… oui c’est possible…

Pas de panique ! L’astuce c’est de lancer cette mise à jour automatiquement grâce aux scripts composer. En l’occurence nous souhaitons mettre à jour les fichiers de traduction si les fichiers du package « laravel-lang/lang » ont changés ; donc après un composer update.

Il suffit donc d’ajouter la commande comme ceci :

1"scripts": {
2 "post-autoload-dump": [
3 "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
4 "@php artisan package:discover --ansi"
5 ],
6 "post-update-cmd": [
7 "@php artisan vendor:publish --tag=laravel-assets --ansi --force"
8 ],
9 "post-root-package-install": [
10 "@php artisan lang:update --quiet",
11 "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
12 ],
13 "post-create-project-cmd": [
14 "@php artisan key:generate --ansi"
15 ]
16},

Et voilà, le tour est joué ! 🎉 Nous n’avons plus à nous soucier de vérifier si il y a des fichiers de traductions à publier, cela sera fait automatiquement. L’option --quiet permet d’éviter que la commande ne soit « trop bavarde ».

Termes génériques

Comme il y a la possibilité de créer des plugins, vous pouvez utiliser mon package Generic term translations for Laravel qui est un plugin pour « laravel-lang/lang ».

Il fournit de nombreux termes génériques que l’on retrouvent dans toutes les applications. Regardez le glossaire, il y a de quoi éviter de se repéter non ?

Seul inconvéniant mais qui peut être rédhibitoire pour certains : il contient plusieurs fichiers (10 au moment d’écrire ces lignes) et cela fait beaucoup dans les répertoires lang.