Wat je op deze pagina bereikt
Je distribueert de berichten van een package in meerdere talen, zodat de gebruikende applicatie alleen de teksten kan wijzigen die nodig zijn. We behandelen vertaalsleutels en placeholders als publieke API en zetten op een rij hoe je aanpassingen behoudt wanneer het package wordt bijgewerkt. Lokalisatie behandelt de basisbewerkingen in een applicatie en Laravel-packages ontwikkelen de basis van registreren en publiceren. Deze pagina duikt in de implementatie vanServiceProvider, FileLoader en Translator in Laravel 13.
loadTranslationsFrom() registreert waar vertalingen worden geladen, publishes() registreert waarheen bestanden worden gekopieerd. Gebruikers hoeven niet per se vendor:publish uit te voeren om de vertalingen te kunnen gebruiken.PHP-vertalingen met een namespace distribueren
Wil je sleutels die specifiek bij het package horen, gebruik dan het PHP-arrayformaat met een namespace. Hieronder een voorbeeld van een package genaamdAcme\Courier.
lang/ja/messages.php.
lang/en/messages.php ook voor Engels als fallback.
boot() van de service provider het laden en het optionele publiceren.
ja, in overeenstemming met de Laravel-configuratie. Dit staat los van jp, dat in de URL’s van deze documentatiesite wordt gebruikt.
courier is het tweede argument van loadTranslationsFrom(). Deze wordt niet automatisch afgeleid van de Composer-packagenaam.
PHP-vertalingen vervangen niet het hele bestand
In de gebruikende applicatie kun je, bij de standaard taalmap, alleen de te wijzigen sleutels inlang/vendor/courier/ja/messages.php zetten. Ook als je de taalmap hebt gewijzigd, gebruik je de locatie onder $this->app->langPath('vendor/courier').
queued; voor failed wordt de Japanse vertaling van het package gebruikt.
Laadvolgorde van FileLoader
ServiceProvider::loadTranslationsFrom() registreert de namespace nadat de Translator is opgelost. Het daadwerkelijk ophalen van bestanden gebeurt pas wanneer een vertaling wordt opgevraagd.
FileLoader::loadNamespaced() laadt de taalbestanden van het geregistreerde package en geeft die array door aan loadNamespaceOverrides(). Daar wordt in elk taalpad van de loader vendor/{namespace}/{locale}/{group}.php gelezen en met array_replace_recursive() vervangen.
De standaard TranslationServiceProvider geeft het taalpad van het framework en dat van de applicatie in deze volgorde door aan de loader. Ook als een extensie extra paden registreert, krijgt de later geladen overschrijvingsarray voorrang voor dezelfde sleutel.
JSON-vertalingen hebben geen eigen namespace per package
Voor JSON-vertalingen met zinnen als sleutel registreer je de map als volgt. Dit is een alternatief voor de eerder getoonde PHP-vertalingen.lang/ja.json in het package:
loadJsonTranslationsFrom() heeft geen namespace-argument. Geregistreerde JSON-vertalingen delen dezelfde sleutelruimte met andere packages en de applicatie.
JSON wordt overschreven in de ja.json van de applicatie
FileLoader::loadJsonPaths() leest eerst de geregistreerde JSON-paden, daarna de gewone taalpaden, en voegt ze samen met array_merge(). In de standaardconfiguratie overschrijft dezelfde stringsleutel in lang/ja.json van de applicatie de waarde van het package.
- Gebruiken packages dezelfde stringsleutel, dan krijgt de waarde uit de later geladen JSON voorrang. Vermijd een ontwerp dat afhankelijk is van de volgorde van providers.
lang/vendor/courier/ja.jsonis geen overschrijvingslocatie voor de standaard JSON-loader. Ook als je de publicatieconfiguratie voor PHP ongewijzigd voor JSON hergebruikt, wordt deze locatie niet automatisch gelezen.- Ook als je de JSON van het package met
publishes()naarlang/ja.jsonvan de applicatie publiceert, wordt de inhoud van het bestand niet samengevoegd. Beschrijf een procedure waarbij gebruikers alleen de benodigde sleutels toevoegen, zodat bestaande vertalingen niet kapotgaan.
Translator::get() echter eerst exact overeenkomende JSON-sleutels controleert, krijgt een JSON-sleutel als courier::messages.delivery.queued voorrang op de PHP-kant. Hanteer normaal gesproken het beleid om zinnen als sleutel en sleutels in PHP-formaat niet te mengen.
Gepubliceerde vertalingen bijwerken zonder ze te breken
Gebruikers die de PHP-vertalingen in één keer willen publiceren, kun je een gericht commando aanraden.- Behoud sleutels en namespace — Het verwijderen of verplaatsen van sleutels raakt de
__()-aanroepen van gebruikers en hun overschrijvingen. Overweeg een overgangsperiode waarin je nieuwe sleutels toevoegt en de oude laat staan. - Behoud placeholders — Wijzig je
:namein:recipient, dan moet ook de vervangingsarray aan de aanroepende kant worden aangepast. Zie het niet als een wijziging die alleen het vertaalbestand betreft. - Controleer gepubliceerde bestanden op verschillen — Vergelijk de overschrijvingen van gebruikers met de nieuwe standaardwaarden. Door overbodige overschrijvingssleutels te verwijderen, val je terug op de waarden van het package.
- Vermijd onvoorwaardelijk opnieuw publiceren — Opnieuw publiceren met
--forceoverschrijft de aanpassingen van gebruikers. Bij een ontwerp dat JSON naar het bestand van de applicatie kopieert, kun je zelfs andere vertalingen kwijtraken. - Controleer in langlopende processen —
Translator::load()bewaart arrays per namespace, groep en taal in de instantie. In processen waarin een Translator met al geladen vertalingen blijft bestaan, wordt niet per se opnieuw geladen alleen doordat een bestand wijzigt. Herstart workers en dergelijke afhankelijk van je werkwijze.
Wat je in de gebruikende applicatie controleert
Controleer in een testapplicatie waarin de service provider is geregistreerd de volgende combinaties. Voor het opzetten van de testomgeving binnen het package zie je Laravel-packages testen met Orchestra Testbench.
Zorg er in tests die na het laden een overschrijvingsbestand aanmaken voor dat de al geladen resultaten van de Translator geen invloed hebben. Maak de bestanden aan voordat je ophaalt, of gebruik per geval een nieuwe applicatie-instantie.
Geraadpleegde primaire bronnen
De officiële documentatie is gecontroleerd op de nieuwste standaardbranch13.x, de interne implementatie op de op het moment van raadplegen nieuwste release v13.35.0.
- Officiële Laravel-documentatie: Taalbestanden van packages
- Officiële Laravel-documentatie: Packagevertalingen overschrijven
- ServiceProvider: vertalingen registreren
- TranslationServiceProvider: standaard taalpaden
- FileLoader: recursief vervangen voor PHP en laadvolgorde van JSON
- Translator: ophalen met JSON-voorrang en al geladen arrays
- Officiële tests: vertaalloader