Obiettivo di questa pagina
Distribuire i messaggi di un pacchetto in più lingue, permettendo all’applicazione che lo utilizza di modificare solo i testi necessari. Vedremo anche come trattare chiavi di traduzione e placeholder come API pubblica e come preservare le personalizzazioni quando il pacchetto viene aggiornato. Localizzazione tratta le operazioni di base nell’applicazione, mentre Sviluppo di pacchetti Laravel tratta le basi della registrazione e della pubblicazione. Questa pagina entra nell’implementazione diServiceProvider, FileLoader e Translator di Laravel 13.
loadTranslationsFrom() registra il percorso da cui caricare le traduzioni, mentre publishes() registra la destinazione in cui copiare i file. Per usare le traduzioni, l’utente non deve necessariamente eseguire vendor:publish.Distribuire traduzioni PHP con un namespace
Se vuoi chiavi dedicate al pacchetto, usa il formato ad array PHP con un namespace. Di seguito l’esempio di un pacchetto chiamatoAcme\Courier.
lang/ja/messages.php.
lang/en/messages.php.
boot() del service provider.
ja, che è diverso da jp usato negli URL di questo sito di documentazione.
courier è il secondo argomento di loadTranslationsFrom(). Non viene determinato automaticamente dal nome del pacchetto Composer.
Le traduzioni PHP non sostituiscono l’intero file
Nell’applicazione che utilizza il pacchetto, con la directory delle lingue standard, puoi scrivere inlang/vendor/courier/ja/messages.php solo le chiavi da modificare. Anche se hai cambiato la directory delle lingue, usa il percorso sotto $this->app->langPath('vendor/courier').
queued, mentre failed usa la traduzione giapponese del pacchetto.
Ordine di caricamento di FileLoader
ServiceProvider::loadTranslationsFrom() registra il namespace dopo la risoluzione del Translator. Il recupero effettivo dei file avviene quando viene richiesta una traduzione.
FileLoader::loadNamespaced() legge i file di lingua del pacchetto registrato e passa l’array a loadNamespaceOverrides(). Qui vengono letti i file vendor/{namespace}/{locale}/{group}.php presenti in ciascun percorso delle lingue del loader e i valori vengono sostituiti con array_replace_recursive().
Il TranslationServiceProvider standard passa al loader il percorso delle lingue del framework e quello dell’applicazione, in quest’ordine. Anche se un’estensione registra percorsi aggiuntivi, per la stessa chiave prevale l’array di sovrascrittura caricato per ultimo.
Le traduzioni JSON non hanno un namespace dedicato al pacchetto
Per le traduzioni JSON, che usano il testo come chiave, registra la directory come segue. Si tratta di un’alternativa rispetto alle traduzioni PHP viste sopra.lang/ja.json del pacchetto.
loadJsonTranslationsFrom() non ha un argomento per il namespace. Le traduzioni JSON registrate condividono lo stesso spazio delle chiavi con gli altri pacchetti e con l’applicazione.
La destinazione della sovrascrittura JSON è il ja.json dell’applicazione
FileLoader::loadJsonPaths() legge prima i percorsi JSON registrati, poi i normali percorsi delle lingue, e li unisce con array_merge(). Nella configurazione standard, la stessa chiave stringa nel file lang/ja.json dell’applicazione sovrascrive il valore del pacchetto.
- Se più pacchetti usano la stessa chiave stringa, prevale il valore del JSON caricato per ultimo. Evita progettazioni che dipendono dall’ordine dei provider.
lang/vendor/courier/ja.jsonnon è una destinazione di sovrascrittura del loader JSON standard. Anche riutilizzando per il JSON la configurazione di pubblicazione pensata per il PHP, questo percorso non viene letto automaticamente.- Pubblicare con
publishes()il JSON del pacchetto nellang/ja.jsondell’applicazione non unisce il contenuto dei file. Per non rompere le traduzioni esistenti, indica una procedura in cui l’utente aggiunge solo le chiavi necessarie.
Translator::get() cerca prima una corrispondenza esatta nel JSON, se nel JSON definisci una chiave come courier::messages.delivery.queued, questa avrà la precedenza sul lato PHP. Di norma conviene non mescolare chiavi testuali e chiavi in formato PHP.
Aggiornare senza rompere le traduzioni pubblicate
Agli utenti che vogliono pubblicare in blocco le traduzioni PHP puoi indicare un comando con un ambito ristretto.- Mantieni chiavi e namespace — Eliminare o spostare una chiave influisce sulle chiamate
__()degli utenti e sulle destinazioni di sovrascrittura. Valuta di aggiungere nuove chiavi mantenendo le vecchie per un periodo di transizione. - Mantieni i placeholder — Se cambi
:namein:recipient, deve cambiare anche l’array di sostituzione del chiamante. Non considerarla una modifica che riguarda solo i file di traduzione. - Confronta le differenze con i file pubblicati — Confronta le sovrascritture dell’utente con i nuovi valori predefiniti. Eliminando le chiavi di sovrascrittura non più necessarie si torna ai valori del pacchetto.
- Evita le ripubblicazioni incondizionate — La ripubblicazione con
--forcesovrascrive le personalizzazioni dell’utente. Con una progettazione che copia il JSON nel file dell’applicazione, potresti perdere anche altre traduzioni. - Verifica nei processi persistenti —
Translator::load()mantiene nell’istanza gli array per namespace, gruppo e lingua. Nei processi in cui resta un Translator che ha già caricato le traduzioni, la sola modifica dei file non garantisce che vengano ricaricate. Riavvia i worker o processi simili in base al tuo ambiente.
Cosa verificare nell’applicazione che utilizza il pacchetto
In un’applicazione di verifica in cui è registrato il service provider, controlla le seguenti combinazioni. Per configurare l’ambiente di test all’interno del pacchetto, consulta Testare pacchetti Laravel con Orchestra Testbench.
Nei test che creano file di sovrascrittura dopo il caricamento, fai in modo che i risultati già caricati dal Translator non influiscano. Prepara prima i file e poi recupera le traduzioni, oppure usa una nuova istanza dell’applicazione per ogni caso.
Fonti primarie consultate
Per la documentazione ufficiale è stato verificato l’ultimo branch predefinito13.x, mentre per l’implementazione interna l’ultima release disponibile al momento della consultazione, v13.35.0.
- Documentazione ufficiale di Laravel: file di lingua dei pacchetti
- Documentazione ufficiale di Laravel: sovrascrittura delle traduzioni dei pacchetti
- ServiceProvider: registrazione delle traduzioni
- TranslationServiceProvider: percorsi delle lingue standard
- FileLoader: sostituzione ricorsiva PHP e ordine di caricamento JSON
- Translator: recupero con priorità al JSON e array già caricati
- Test ufficiali: loader delle traduzioni