Ziel dieser Seite
Sie liefern die Meldungen Ihres Pakets in mehreren Sprachen aus und ermöglichen es der nutzenden Anwendung, nur die benötigten Texte zu ändern. Dabei behandeln Sie Übersetzungsschlüssel und Platzhalter als öffentliche API und klären, wie Anpassungen bei Paket-Updates erhalten bleiben. Die Lokalisierung behandelt die grundlegende Verwendung in der Anwendung, die Laravel-Paketentwicklung die Grundlagen von Registrierung und Veröffentlichung. Diese Seite geht auf die Implementierung vonServiceProvider, FileLoader und Translator in Laravel 13 ein.
loadTranslationsFrom() registriert den Ladeort, publishes() das Ziel einer Dateikopie. Damit Übersetzungen verwendet werden können, müssen Nutzer nicht zwingend vendor:publish ausführen.PHP-Übersetzungen mit Namensraum ausliefern
Wenn Ihr Paket eigene Schlüssel haben soll, verwenden Sie das PHP-Array-Format zusammen mit einem Namensraum. Das folgende Beispiel zeigt ein Paket namensAcme\Courier.
lang/ja/messages.php legen Sie die japanischen Standardwerte ab.
lang/en/messages.php stellen Sie zusätzlich Englisch als Fallback bereit.
boot() des Service Providers das Laden und optional die Veröffentlichung.
ja verwendet. Das ist etwas anderes als das jp in den URLs dieser Dokumentationsseite.
courier ist das zweite Argument von loadTranslationsFrom(). Er wird nicht automatisch aus dem Composer-Paketnamen abgeleitet.
PHP-Übersetzungen ersetzen nicht die ganze Datei
In der nutzenden Anwendung können Sie – beim Standard-Sprachverzeichnis – inlang/vendor/courier/ja/messages.php nur die zu ändernden Schlüssel eintragen. Auch wenn das Sprachverzeichnis geändert wurde, verwenden Sie den Pfad unterhalb von $this->app->langPath('vendor/courier').
queued; für failed wird weiterhin die japanische Übersetzung des Pakets verwendet.
Ladereihenfolge des FileLoader
ServiceProvider::loadTranslationsFrom() registriert den Namensraum, nachdem der Translator aufgelöst wurde. Die Dateien selbst werden erst gelesen, wenn eine Übersetzung angefordert wird.
FileLoader::loadNamespaced() liest die Sprachdatei des registrierten Pakets und übergibt das Array an loadNamespaceOverrides(). Dort wird in jedem Sprachpfad des Loaders vendor/{namespace}/{locale}/{group}.php gelesen und per array_replace_recursive() ersetzt.
Der Standard-TranslationServiceProvider übergibt dem Loader den Sprachpfad des Frameworks und den der Anwendung in dieser Reihenfolge. Auch wenn eine Erweiterung zusätzliche Pfade registriert, hat bei gleichen Schlüsseln das später geladene Überschreibungs-Array Vorrang.
JSON-Übersetzungen haben keinen paketeigenen Namensraum
Für JSON-Übersetzungen, bei denen Sätze als Schlüssel dienen, registrieren Sie das Verzeichnis wie folgt. Dies ist eine Alternative zu den oben gezeigten PHP-Übersetzungen.lang/ja.json im Paket:
loadJsonTranslationsFrom() hat kein Argument für einen Namensraum. Registrierte JSON-Übersetzungen teilen sich denselben Schlüsselraum mit anderen Paketen und der Anwendung.
Ziel für JSON-Überschreibungen ist die ja.json der Anwendung
FileLoader::loadJsonPaths() liest zuerst die registrierten JSON-Pfade, danach die regulären Sprachpfade, und führt sie per array_merge() zusammen. In der Standardkonfiguration überschreibt derselbe Textschlüssel in der lang/ja.json der Anwendung den Wert des Pakets.
- Verwenden mehrere Pakete denselben Textschlüssel, hat der Wert aus der später geladenen JSON-Datei Vorrang. Vermeiden Sie ein Design, das sich auf die Reihenfolge der Provider verlässt.
lang/vendor/courier/ja.jsonist kein Überschreibungsziel des Standard-JSON-Loaders. Wenn Sie die Veröffentlichungseinstellung für PHP unverändert für JSON übernehmen, wird dieser Ort nicht automatisch gelesen.- Wenn Sie die JSON-Datei des Pakets per
publishes()in dielang/ja.jsonder Anwendung kopieren, werden die Dateiinhalte nicht zusammengeführt. Damit bestehende Übersetzungen nicht beschädigt werden, beschreiben Sie ein Vorgehen, bei dem Nutzer nur die benötigten Schlüssel ergänzen.
Translator::get() jedoch zuerst exakt übereinstimmende JSON-Schlüssel prüft, hat ein in JSON definierter Schlüssel wie courier::messages.delivery.queued Vorrang vor der PHP-Seite. In der Regel sollten Sie Satzschlüssel und Schlüssel im PHP-Format nicht vermischen.
Veröffentlichte Übersetzungen aktualisieren, ohne sie zu beschädigen
Nutzern, die die PHP-Übersetzungen vollständig veröffentlichen möchten, können Sie einen auf das Ziel eingeschränkten Befehl empfehlen.- Schlüssel und Namensraum beibehalten — Das Löschen oder Verschieben von Schlüsseln wirkt sich auf die
__()-Aufrufe der Nutzer und auf die Überschreibungsziele aus. Erwägen Sie eine Übergangsphase, in der neue Schlüssel hinzugefügt und alte beibehalten werden. - Platzhalter beibehalten — Wird
:namein:recipientgeändert, muss auch das Ersetzungs-Array auf der aufrufenden Seite angepasst werden. Betrachten Sie dies nicht als reine Änderung der Übersetzungsdatei. - Veröffentlichte Dateien per Diff prüfen — Vergleichen Sie die Überschreibungen der Nutzer mit den neuen Standardwerten. Durch das Entfernen nicht mehr benötigter Überschreibungsschlüssel kehren Sie zum Wert des Pakets zurück.
- Bedingungsloses erneutes Veröffentlichen vermeiden — Erneutes Veröffentlichen mit
--forceüberschreibt die Anpassungen der Nutzer. Bei einem Design, das JSON in die Datei der Anwendung kopiert, können sogar andere Übersetzungen verloren gehen. - In langlebigen Prozessen prüfen —
Translator::load()hält die Arrays pro Namensraum, Gruppe und Sprache in der Instanz. In Prozessen, in denen ein bereits geladener Translator weiterbesteht, wird nach einer Dateiänderung nicht zwangsläufig neu geladen. Starten Sie Worker usw. je nach Betrieb neu.
Prüfpunkte in der nutzenden Anwendung
Prüfen Sie in einer Testanwendung, in der der Service Provider registriert ist, die folgenden Kombinationen. Zum Aufbau einer Testumgebung innerhalb des Pakets siehe Laravel-Pakete mit Orchestra Testbench testen.
In Tests, die eine Überschreibungsdatei erst nach dem Laden anlegen, stellen Sie sicher, dass bereits geladene Ergebnisse des Translators keinen Einfluss haben. Legen Sie die Datei vor dem Abruf an oder verwenden Sie für jeden Fall eine neue Anwendungsinstanz.
Herangezogene Primärquellen
Geprüft wurden die offizielle Dokumentation im aktuellen Standard-Branch13.x und die interne Implementierung im zum Zeitpunkt der Prüfung neuesten Release v13.35.0.
- Offizielle Laravel-Dokumentation: Sprachdateien in Paketen
- Offizielle Laravel-Dokumentation: Paketübersetzungen überschreiben
- ServiceProvider: Registrierung von Übersetzungen
- TranslationServiceProvider: Standard-Sprachpfade
- FileLoader: rekursives Ersetzen bei PHP und Ladereihenfolge bei JSON
- Translator: JSON-vorrangiger Abruf und geladene Arrays
- Offizielle Tests: Übersetzungslader