Laravel : organiser ses fichiers de langue dans des sous-dossiers

Jeudi 22 avril

Dans un projet sur lequel je travaille, j’ai créé quelques composants Blade (ces trucs avec un bête préfixe « x- » obligatoire).

L’un de ceux-ci sert à résumer, en haut de page, une liste de points problématiques avec les données qu’une personne vient de tenter d’envoyer. Mon implémentation est très proche du « error summary » figurant dans le fameux GDS, le design system de l’administration britannique.

L’application étant disponible en plusieurs langues, je dois être en mesure de traduire tous les éléments d’interface. Y compris, donc, ceux qui proviennent de mes composants.

Par défaut, Laravel s’attend à ce que les fichiers de traductions pour chaque langue soient tous placés dans un répertoire unique pour chaque langue. En fait, c’est même la seule manière qui est documentée.

Imaginons que l’on mette toutes les chaînes dans un fichier nommé app.php. Les traductions françaises seraient ainsi dans le fichier /resources/lang/fr/app.php, tandis que celles en anglais seraient dans /resources/lang/en/app.php.

Et pour récupérer, par exemple, le morceau de texte correspondant au titre du résumé d’erreurs, on peut utiliser une clé de ce genre app.error_summary.title.

Utiliser des sous-dossiers

Il fut une époque, il y a fort longtemps, où il était possible de créer des sous-dossiers au sein d’un dossier de langue. Il se trouve que c’est encore faisable, bien que non documenté.

Je peux ainsi ranger les traductions se rapportant à mes composants de manière plus organisée :

/resources/lang/fr/components/error-summary.php

Cependant, si on tente d’utiliser une clé transposant directement ce chemin de fichier…

@lang('components.error-summary.title')

…ça ne fonctionne pas. Laravel ne parvient pas à trouver le texte correspondant.

Il faut juste changer un tout petit détail.

Dans cette clé, la partie components.error-summary décrit comment se rendre jusqu’au bon fichier, tandis que la partie title correspond à une clé à l’intérieur de celui-ci.

Pour faire marcher le bouzin, il faut donner un grand coup de pied dedans remplacer les points par des / dans la partie de la clé décrivant le chemin du fichier. Ce qui nous donne la clé suivante :

@lang('components/error-summary.title')

Et là, pouf, ça tombe en marche !