Skip to main content

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 van ServiceProvider, 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 genaamd Acme\Courier.
Zet de Japanse standaardwaarden in lang/ja/messages.php.
Zorg in lang/en/messages.php ook voor Engels als fallback.
Registreer in de boot() van de service provider het laden en het optionele publiceren.
Bij gebruik geef je de namespace, de bestandsnaam en de arraysleutel op. Als taalcode gebruik je ja, in overeenstemming met de Laravel-configuratie. Dit staat los van jp, dat in de URL’s van deze documentatiesite wordt gebruikt.
De namespace 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 in lang/vendor/courier/ja/messages.php zetten. Ook als je de taalmap hebt gewijzigd, gebruik je de locatie onder $this->app->langPath('vendor/courier').
In dit voorbeeld verandert alleen 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.
Als de namespace niet is geregistreerd, geeft FileLoader::loadNamespaced() een lege array terug. Alleen bestanden in lang/vendor/courier plaatsen compenseert geen ontbrekende registratie in de service provider. Registreert een ander package dezelfde namespace, dan wordt de registratielocatie vervangen; kies daarom een naam die niet botst.

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.
Een voorbeeld van 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.json is 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() naar lang/ja.json van 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() controleert eerst de JSON van de gevraagde taal en zoekt, als daar niets wordt gevonden, verder als sleutel in PHP-formaat. Er wordt niet, zoals bij PHP-vertalingen, ook de JSON van de fallbacktaal doorzocht. Gebruik je Engelse zinnen als JSON-sleutels, onderscheid dit dan van het standaardgedrag waarbij de originele sleutel wordt getoond als er geen vertaling is.
De namespace van PHP-vertalingen scheidt de PHP-sleutels van andere packages. Omdat 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.
Let wel: als je alle standaardwaarden kopieert, is die kopie voortaan ook een overschrijvingswaarde. Corrigeert het package een typfout, dan zie je de nieuwe waarde niet zolang dezelfde sleutel in het gepubliceerde bestand staat. Nieuwe sleutels die niet in de kopie staan, worden daarentegen aangevuld vanuit het package.
Wil je maar een paar teksten wijzigen, publiceer dan niet alle bestanden, maar zet alleen de benodigde sleutels in het overschrijvingsbestand. Zo neem je updates makkelijker over. Deze werkwijze maakt gebruik van het gedeeltelijk overschrijven van PHP-vertalingen.
Voor langetermijnonderhoud ontwerp je updates in de volgende volgorde.
  1. 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.
  2. Behoud placeholders — Wijzig je :name in :recipient, dan moet ook de vervangingsarray aan de aanroepende kant worden aangepast. Zie het niet als een wijziging die alleen het vertaalbestand betreft.
  3. 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.
  4. Vermijd onvoorwaardelijk opnieuw publiceren — Opnieuw publiceren met --force overschrijft de aanpassingen van gebruikers. Bij een ontwerp dat JSON naar het bestand van de applicatie kopieert, kun je zelfs andere vertalingen kwijtraken.
  5. 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.
Het kiezen van het bereik bij publiceren en de overschrijfopties worden aangevuld in Publieke assets van packages publiceren en bijwerken, en de compatibiliteitsafwegingen bij versie-updates in Versiecompatibiliteit van packages beheren.

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 standaardbranch 13.x, de interne implementatie op de op het moment van raadplegen nieuwste release v13.35.0.
Laatst gewijzigd op 8 oktober 2026