Objectif de cette page
Il s’agit de distribuer les messages de votre package en plusieurs langues tout en permettant à l’application consommatrice de ne modifier que les libellés dont elle a besoin. Nous verrons aussi comment traiter les clés de traduction et les placeholders comme une API publique, afin de préserver les personnalisations lors des mises à jour du package. La page Localisation couvre les opérations de base dans une application, et Développement de packages Laravel les bases de l’enregistrement et de la publication. Cette page approfondit l’implémentation deServiceProvider, FileLoader et Translator dans Laravel 13.
loadTranslationsFrom() enregistre un emplacement de chargement, tandis que publishes() enregistre une destination de copie de fichiers. Les utilisateurs n’ont pas besoin d’exécuter vendor:publish pour utiliser les traductions.Distribuer des traductions PHP avec un namespace
Si vous souhaitez disposer de clés propres au package, utilisez le format tableau PHP et un namespace. Voici l’exemple d’un package nomméAcme\Courier.
lang/ja/messages.php.
lang/en/messages.php.
boot() du service provider.
ja. Il est distinct de jp, utilisé dans les URL de ce site de documentation.
courier correspond au deuxième argument de loadTranslationsFrom(). Il n’est pas déterminé automatiquement à partir du nom du package Composer.
Les traductions PHP ne remplacent pas le fichier entier
Dans l’application consommatrice, avec le répertoire de langues standard, il suffit d’écrire uniquement les clés à modifier danslang/vendor/courier/ja/messages.php. Si vous avez changé le répertoire de langues, utilisez l’emplacement situé sous $this->app->langPath('vendor/courier').
queued change ; failed utilise la traduction japonaise du package.
Ordre de chargement de FileLoader
ServiceProvider::loadTranslationsFrom() enregistre le namespace une fois le Translator résolu. La lecture effective des fichiers a lieu au moment où une traduction est demandée.
FileLoader::loadNamespaced() charge les fichiers de langue du package enregistré et transmet ce tableau à loadNamespaceOverrides(). Celle-ci lit vendor/{namespace}/{locale}/{group}.php dans chacun des chemins de langue du chargeur et effectue le remplacement avec array_replace_recursive().
Le TranslationServiceProvider standard transmet au chargeur le chemin de langues du framework puis celui de l’application, dans cet ordre. Même si une extension enregistre des chemins supplémentaires, le tableau de surcharge chargé en dernier l’emporte pour une même clé.
Les traductions JSON n’ont pas de namespace propre au package
Pour les traductions JSON, qui utilisent des phrases comme clés, enregistrez le répertoire comme suit. C’est une option distincte des traductions PHP présentées plus haut.lang/ja.json dans le package :
loadJsonTranslationsFrom() n’accepte pas d’argument de namespace. Les traductions JSON enregistrées partagent le même espace de clés que les autres packages et que l’application.
La surcharge JSON se fait dans le ja.json de l’application
FileLoader::loadJsonPaths() lit d’abord les chemins JSON enregistrés, puis les chemins de langue habituels, et les fusionne avec array_merge(). Dans la configuration standard, une même clé de chaîne dans le lang/ja.json de l’application remplace la valeur du package.
- Si plusieurs packages utilisent la même clé de chaîne, la valeur du JSON chargé en dernier l’emporte. Évitez une conception qui dépend de l’ordre des providers.
lang/vendor/courier/ja.jsonn’est pas une destination de surcharge pour le chargeur JSON standard. Même si vous réutilisez tel quel pour le JSON la configuration de publication prévue pour le PHP, cet emplacement n’est pas lu automatiquement.- Publier le JSON du package vers le
lang/ja.jsonde l’application avecpublishes()ne fusionne pas le contenu des fichiers. Pour ne pas casser les traductions existantes, indiquez aux utilisateurs une procédure consistant à n’ajouter que les clés nécessaires.
Translator::get() examine d’abord les clés JSON en correspondance exacte, définir dans le JSON une clé telle que courier::messages.delivery.queued la fait primer sur le côté PHP. En règle générale, adoptez une politique qui évite de mélanger clés-phrases et clés au format PHP.
Mettre à jour sans casser les traductions publiées
Aux utilisateurs qui souhaitent publier toutes les traductions PHP en une fois, vous pouvez indiquer une commande ciblée.- Conserver les clés et le namespace — Supprimer ou déplacer une clé affecte les appels
__()des utilisateurs et leurs destinations de surcharge. Envisagez une période de transition où vous ajoutez la nouvelle clé tout en conservant l’ancienne. - Conserver les placeholders — Remplacer
:namepar:recipientimpose aussi de modifier le tableau de remplacement côté appelant. Ne considérez pas cela comme une simple modification des fichiers de traduction. - Comparer les fichiers publiés — Comparez les surcharges de l’utilisateur avec les nouvelles valeurs par défaut. Supprimer les clés de surcharge devenues inutiles permet de revenir aux valeurs du package.
- Éviter la republication inconditionnelle — Une republication avec
--forceécrase les personnalisations de l’utilisateur. Avec une conception qui copie le JSON dans le fichier de l’application, d’autres traductions risquent aussi d’être perdues. - Vérifier avec les processus persistants —
Translator::load()conserve dans l’instance les tableaux par namespace, groupe et langue. Dans un processus où subsiste un Translator déjà chargé, une simple modification de fichier ne déclenche pas forcément de rechargement. Redémarrez les workers ou équivalents selon votre exploitation.
Points à vérifier dans l’application consommatrice
Dans une application de test où le service provider est enregistré, vérifiez les combinaisons suivantes. Pour la mise en place de l’environnement de test au sein du package, consultez Tester des packages Laravel avec Orchestra Testbench.
Dans les tests qui créent un fichier de surcharge après le chargement, veillez à ce que les résultats déjà chargés par le Translator n’interfèrent pas. Préparez les fichiers avant la récupération, ou utilisez une nouvelle instance d’application pour chaque cas.
Sources primaires consultées
La documentation officielle a été vérifiée sur la branche par défaut la plus récente13.x, et l’implémentation interne sur la dernière release disponible au moment de la consultation, v13.35.0.
- Documentation officielle de Laravel : fichiers de langue des packages
- Documentation officielle de Laravel : surcharge des traductions de packages
- ServiceProvider : enregistrement des traductions
- TranslationServiceProvider : chemins de langue standard
- FileLoader : remplacement récursif PHP et ordre de chargement JSON
- Translator : récupération prioritaire du JSON et tableaux déjà chargés
- Tests officiels : chargeur de traductions