Einfache i18n-Lokalisierung für Laravel, ein nützliches Tool zur Kombination mit Laravel-Lokalisierungsklassen.
Das Paket bietet Folgendes:
Laravel | Laravel-Lokalisierung |
---|---|
4.0.x | 0,13.x |
4.1.x | 0,13.x |
4.2.x | 0,15.x |
5.0.x/5.1.x | 1.0.x |
5.2.x-5.4.x (PHP 7 nicht erforderlich) | 1.2. |
5.2.0-6.x (PHP-Version >= 7 erforderlich) | 1.4.x |
6.x-10.x (PHP-Version >= 7 erforderlich) | 1.8.x |
10.x-11.x (PHP-Version >= 8.2 erforderlich) | 2.0.x |
Installieren Sie das Paket über Composer: composer require mcamara/laravel-localization
Für Laravel 5.4 und niedriger ist die Registrierung des Dienstanbieters erforderlich.
Um die Standardkonfiguration zu bearbeiten, können Sie Folgendes ausführen:
php artisan vendor:publish --provider="McamaraLaravelLocalizationLaravelLocalizationServiceProvider"
Danach wird config/laravellocalization.php
erstellt.
Die Konfigurationsoptionen sind:
Sie können die Paket-Middleware in der Datei app/Http/Kernel.php
registrieren:
<?php namespace App Http ;
use Illuminate Foundation Http Kernel as HttpKernel ;
class Kernel extends HttpKernel {
/**
* The application's route middleware.
*
* @var array
*/
protected $ middlewareAliases = [
/**** OTHER MIDDLEWARE ****/
' localize ' => Mcamara LaravelLocalization Middleware LaravelLocalizationRoutes::class,
' localizationRedirect ' => Mcamara LaravelLocalization Middleware LaravelLocalizationRedirectFilter::class,
' localeSessionRedirect ' => Mcamara LaravelLocalization Middleware LocaleSessionRedirect::class,
' localeCookieRedirect ' => Mcamara LaravelLocalization Middleware LocaleCookieRedirect::class,
' localeViewPath ' => Mcamara LaravelLocalization Middleware LaravelLocalizationViewPath::class
];
}
Wenn Sie Laravel 11 verwenden, können Sie sich abschließend withMiddleware
in der Datei bootstrap/app.php
registrieren:
return Application:: configure (basePath: dirname ( __DIR__ ))
// Other application configurations
-> withMiddleware ( function ( Middleware $ middleware ) {
$ middleware -> alias ([
/**** OTHER MIDDLEWARE ALIASES ****/
' localize ' => Mcamara LaravelLocalization Middleware LaravelLocalizationRoutes::class,
' localizationRedirect ' => Mcamara LaravelLocalization Middleware LaravelLocalizationRedirectFilter::class,
' localeSessionRedirect ' => Mcamara LaravelLocalization Middleware LocaleSessionRedirect::class,
' localeCookieRedirect ' => Mcamara LaravelLocalization Middleware LocaleCookieRedirect::class,
' localeViewPath ' => Mcamara LaravelLocalization Middleware LaravelLocalizationViewPath::class,
]);
})
Fügen Sie Ihrer Routendatei Folgendes hinzu:
// routes/web.php
Route:: group ([ ' prefix ' => LaravelLocalization:: setLocale ()], function ()
{
/** ADD ALL LOCALIZED ROUTES INSIDE THIS GROUP **/
Route:: get ( ' / ' , function ()
{
return View:: make ( ' hello ' );
});
Route:: get ( ' test ' , function (){
return View:: make ( ' test ' );
});
});
/** OTHER PAGES THAT SHOULD NOT BE LOCALIZED **/
Sobald diese Routengruppe zur Routendatei hinzugefügt wurde, kann ein Benutzer auf alle Gebietsschemata zugreifen, die zu supportedLocales
hinzugefügt wurden (standardmäßig en
und „ es
). Die obige Routendatei erstellt beispielsweise die folgenden Adressen:
// Set application language to English
http://url-to-laravel/en
http://url-to-laravel/en/test
// Set application language to Spanish
http://url-to-laravel/es
http://url-to-laravel/es/test
// Set application language to English or Spanish (depending on browsers default locales)
// if nothing found set to default locale
http://url-to-laravel
http://url-to-laravel/test
Das Paket legt Ihr Anwendungsgebietsschema App::getLocale()
entsprechend Ihrer URL fest. Das Gebietsschema kann dann für die Lokalisierungsfunktionen von Laravel verwendet werden.
Sie können Ihrer Gruppe wie folgt Middleware hinzufügen:
Route:: group (
[
' prefix ' => LaravelLocalization:: setLocale (),
' middleware ' => [ ' localeSessionRedirect ' , ' localizationRedirect ' , ' localeViewPath ' ]
], function (){ //...
});
1. : Es wird dringend empfohlen, eine umleitende Middleware zu verwenden. URLs ohne Gebietsschema sollten nur verwendet werden, um das Browser-/Standardgebietsschema zu bestimmen und zur lokalisierten URL umzuleiten. Andernfalls erhalten Suchmaschinen-Robots beim Crawlen von beispielsweise http://url-to-laravel/test
möglicherweise bei jedem Besuch unterschiedliche Sprachinhalte. Auch das Vorhandensein mehrerer URLs für denselben Inhalt führt zu einem SEO-Problem mit doppeltem Inhalt.
2. : Es wird dringend empfohlen, Ihre Links zu lokalisieren, auch wenn Sie eine Weiterleitungs-Middleware verwenden. Andernfalls wird jedes Mal, wenn ein Benutzer auf einen Link klickt, mindestens eine Weiterleitung ausgelöst. Außerdem muss jede Aktions-URL aus einem Post-Formular lokalisiert werden, um zu verhindern, dass sie zu einer Get-Anfrage umgeleitet wird.
Die folgende Umleitungs-Middleware hängt von den Einstellungen von hideDefaultLocaleInURL
und useAcceptLanguageHeader
in config/laravellocalization.php
ab:
Immer wenn ein Gebietsschema in der URL vorhanden ist, wird es von dieser Middleware in der Sitzung gespeichert.
Wenn in der URL kein Gebietsschema vorhanden ist, prüft diese Middleware Folgendes
useAcceptLanguageHeader
auf „true“ gesetzt ist, berechnen Sie das Gebietsschema vom Browser und leiten Sie mit dem Gebietsschema zur URL um.hideDefaultLocaleInURL
ist auf „true“ gesetzt. Wenn ein Benutzer beispielsweise zu http://url-to-laravel/test navigiert und en
das aktuelle Gebietsschema ist, wird er automatisch zu „http://url-to-laravel/en/test“ weitergeleitet.
Ähnlich wie LocaleSessionRedirect, speichert den Wert jedoch in einem Cookie statt in einer Sitzung.
Immer wenn ein Gebietsschema in der URL vorhanden ist, wird es von dieser Middleware im Cookie gespeichert.
Wenn in der URL kein Gebietsschema vorhanden ist, prüft diese Middleware Folgendes
useAcceptLanguageHeader
auf „true“ gesetzt ist, berechnen Sie das Gebietsschema vom Browser und leiten Sie mit dem Gebietsschema zur URL weiter.hideDefaultLocaleInURL
ist auf „true“ gesetzt. Wenn ein Benutzer beispielsweise zu http://url-to-laravel/test navigiert und de
das aktuelle Gebietsschema ist, wird er automatisch zu http://url-to-laravel/de/test weitergeleitet.
Wenn das Standardgebietsschema in der URL vorhanden ist und hideDefaultLocaleInURL
auf „true“ gesetzt ist, leitet die Middleware zur URL ohne Gebietsschema um.
Wenn es
beispielsweise das Standardgebietsschema ist, wird http://url-to-laravel/es/test zu http://url-to-laravel/test umgeleitet und App::getLocale()
festgelegt es
.
Dieses Paket enthält eine Reihe von Helfern.
Lokalisierte URLs berücksichtigen beim Generieren der lokalisierten Route die Routenmodellbindung sowie die Einstellungen hideDefaultLocaleInURL
und Translated Routes.
// If current locale is Spanish, it returns `/es/test`
<a href="{{ LaravelLocalization:: localizeUrl ( ' /test ' ) }}">@ lang ( ' Follow this link ' )</a>
Aktuelle URL in einem bestimmten Gebietsschema abrufen:
// Returns current url with English locale.
{{ LaravelLocalization:: getLocalizedURL ( ' en ' ) }}
Gibt eine URL ohne jegliche Lokalisierung zurück.
// Returns /about
{{ LaravelLocalization:: getNonLocalizedURL ( ' /es/about ' ) }}
Gibt eine Route zurück, lokalisiert für das gewünschte Gebietsschema. Wenn der Übersetzungsschlüssel im angegebenen Gebietsschema nicht vorhanden ist, gibt diese Funktion „false“ zurück.
// Returns /es/acerca
{{ LaravelLocalization:: getURLFromRouteNameTranslated ( ' es ' , ' routes.about ' ) }}
Beispiel für einen lokalisierten Link, der Routen mit Attributen verwendet
// An array of attributes can be provided.
// Returns /en/archive/ghosts, /fr/archive/fantômes, /pt/arquivo/fantasmas, etc.
<a href="{{ LaravelLocalization:: getURLFromRouteNameTranslated ( App:: currentLocale (), ' routes.archive ' , array ( ' category ' => ' ghosts ' )) }}">Ghost Stories</a>
Gibt alle unterstützten Gebietsschemas und ihre Eigenschaften als Array zurück.
{{ LaravelLocalization:: getSupportedLocales () }}
Gibt alle unterstützten Gebietsschemas zurück, jedoch in der in der Konfigurationsdatei angegebenen Reihenfolge. Mit dieser Funktion können Sie Gebietsschemata in der Sprachauswahl drucken.
{{ LaravelLocalization:: getLocalesOrder () }}
Gibt ein Array mit allen Schlüsseln für die unterstützten Gebietsschemas zurück.
{{ LaravelLocalization:: getSupportedLanguagesKeys () }}
Gibt den Schlüssel des aktuellen Gebietsschemas zurück.
{{ LaravelLocalization:: getCurrentLocale () }}
Gibt den Namen des aktuellen Gebietsschemas als Zeichenfolge zurück (Englisch/Spanisch/Arabisch/..usw.).
{{ LaravelLocalization:: getCurrentLocaleName () }}
Gibt den nativen Namen des aktuellen Gebietsschemas als Zeichenfolge zurück (Englisch/Español/عربى/ ..etc).
{{ LaravelLocalization:: getCurrentLocaleNative () }}
Gibt den regionalen Namen des aktuellen Gebietsschemas als Zeichenfolge zurück (en_GB/en_US/fr_FR/ ..etc).
{{ LaravelLocalization:: getCurrentLocaleRegional () }}
Gibt die Richtung des aktuellen Gebietsschemas als Zeichenfolge zurück (ltr/rtl).
{{ LaravelLocalization:: getCurrentLocaleDirection () }}
Gibt den ISO 15924-Code für das aktuelle Gebietsschemaskript als Zeichenfolge zurück; „Latn“, „Cyrl“, „Araber“ usw.
{{ LaravelLocalization:: getCurrentLocaleScript () }}
Registrieren Sie die Middleware LaravelLocalizationViewPath
um das aktuelle Gebietsschema als View-Base-Pfad festzulegen.
Jetzt können Sie Ihre Ansichten in sprachbasierte Ordner wie die Übersetzungsdateien einschließen.
resources/views/en/
, resources/views/fr
, ...
Da Sie die unterstützten Locales auch durch Umbenennen ihrer Schlüssel ändern können, ist es möglich, die Zeichenfolge uk
anstelle von en-GB
zu verwenden, um benutzerdefinierte Lang-URL-Segmente bereitzustellen. Natürlich müssen Sie Kollisionen mit bereits vorhandenen Schlüsseln vermeiden und sich so lange wie möglich an die Konvention halten. Wenn Sie jedoch einen solchen benutzerdefinierten Schlüssel verwenden, müssen Sie Ihre Zuordnung im Array localesMapping
speichern. Diese localesMapping
wird benötigt, damit der LanguageNegotiator die gewünschten Locales basierend auf dem HTTP Accept Language Header korrekt zuweisen kann. Hier ist ein kurzes Beispiel, wie man den HTTP Accept Language Header „en-GB“ dem URL-Segment „uk“ zuordnet:
// config/laravellocalization.php
' localesMapping ' => [
' en-GB ' => ' uk '
],
Danach wird http://url-to-laravel/uk/a/b/c
http://url-to-laravel/en-GB/a/b/c
laravel/uk/a/b/c .
LaravelLocalization:: getLocalizedURL ( ' en-GB ' , ' a/b/c ' ); // http://url-to-laravel/uk/a/b/c
LaravelLocalization:: getLocalizedURL ( ' uk ' , ' a/b/c ' ); // http://url-to-laravel/uk/a/b/c
Wenn Sie in Ihrem Projekt mehrere Gebietsschemata unterstützen, möchten Sie den Benutzern wahrscheinlich eine Möglichkeit bieten, die Sprache zu ändern. Nachfolgend finden Sie ein einfaches Beispiel für einen Blade-Vorlagencode, mit dem Sie Ihre eigene Sprachauswahl erstellen können.
< ul >
@foreach ( LaravelLocalization :: getSupportedLocales () as $localeCode => $properties )
< li >
< a rel = " alternate " hreflang = " {{ $localeCode } } " href = " {{ LaravelLocalization :: getLocalizedURL ( $localeCode , null , [], true ) } } " >
{{ $properties [ ' native ' ] } }
</ a >
</ li >
@endforeach
</ ul >
Hier wird in getLocalizedURL() erzwungen, dass die Standardsprache in der URL vorhanden ist, auch wenn hideDefaultLocaleInURL = true
.
Beachten Sie, dass die Routenmodellbindung unterstützt wird.
Sie können Ihre Routen übersetzen. Zum Beispiel http://url/en/about und http://url/es/acerca (acerca ist „about“ auf Spanisch) oder http://url/en/article/important-article und http://url/ es/articulo/important-article (Artikel heißt articulo auf Spanisch) würde wie folgt an denselben Controller/dieselbe Ansicht weitergeleitet:
Es ist erforderlich, dass mindestens die localize
Middleware in Ihrer Route::group
Middleware geladen ist (siehe Installationsanleitung).
Fügen Sie für jede Sprache eine routes.php
zum Ordner resources/lang/**/routes.php
hinzu. Die Datei enthält ein Array mit allen übersetzbaren Routen. Zum Beispiel so:
Beachten Sie: Ab Laravel 9 befindet sich der Ordner
resources/lang
jetzt im Stammprojektordner (lang
). Wenn Ihr Projektlang
-Ordner im Stammverzeichnis hat, müssen Sie eineroutes.php
zum Ordnerlang/**/routes.php
hinzufügen.
<?php
// resources/lang/en/routes.php
return [
" about " => " about " ,
" article " => " article/{article} " ,
];
<?php
// resources/lang/es/routes.php
return [
" about " => " acerca " ,
" article " => " articulo/{article} " ,
];
Sie können die Routen wie folgt in routes/web.php
hinzufügen:
Route:: group ([ ' prefix ' => LaravelLocalization:: setLocale (),
' middleware ' => [ ' localize ' ]], function () {
Route:: get (LaravelLocalization:: transRoute ( ' routes.about ' ), function () {
return view ( ' about ' );
});
Route:: get (LaravelLocalization:: transRoute ( ' routes.article ' ), function ( App Article $ article ) {
return $ article ;
});
//,...
});
Sobald die Dateien gespeichert sind, können Sie auf http://url/en/about, http://url/es/acerca, http://url/en/article/important-article und http://url/es/ zugreifen. articulo/important-article ohne Probleme.
Vielleicht ist Ihnen im vorherigen Beispiel der englische Slug in der spanischen URL aufgefallen:
http://url/es/articulo/important-article
Es ist möglich, Slugs übersetzt zu haben, zum Beispiel so:
http://url/en/article/important-change
http://url/es/articulo/cambio-importante
Dazu muss jedoch jeder Artikel viele Slugs haben (einen für jedes Gebietsschema). Es liegt an Ihnen, wie Sie diesen Zusammenhang umsetzen möchten. Die einzige Voraussetzung für übersetzbare Routenparameter ist, dass das entsprechende Modell die Schnittstelle LocalizedUrlRoutable
implementiert.
Um McamaraLaravelLocalizationInterfacesLocalizedUrlRoutable
zu implementieren, muss man die Funktion getLocalizedRouteKey($locale)
erstellen, die für ein bestimmtes Gebietsschema den übersetzten Slug zurückgeben muss. Im obigen Beispiel sollte getLocalizedRouteKey('en')
im Modellartikel important-change
und getLocalizedRouteKey('es')
cambio-importante
zurückgeben.
Um Route-Model-Binding zu verwenden, sollte man die Funktion resolveRouteBinding($slug)
im Modell überschreiben. Die Funktion sollte das Modell zurückgeben, das zum übersetzten Slug $slug
gehört. Zum Beispiel:
public function resolveRouteBinding ( $ slug )
{
return static :: findByLocalizedSlug ( $ slug )-> first () ?? abort ( 404 );
}
Vielleicht möchten Sie sich dieses Video ansehen, das zeigt, wie man übersetzbare Routenparameter einrichten kann.
Sie können die URL-Parameter während der Übersetzung erfassen, wenn Sie diese auch übersetzen möchten. Erstellen Sie dazu einfach einen Ereignis-Listener für das routes.translation
-Ereignis wie folgt:
Event:: listen ( ' routes.translation ' , function ( $ locale , $ attributes )
{
// Do your magic
return $ attributes ;
});
Stellen Sie sicher, dass Sie das Gebietsschema und die Attribute als Parameter an den Abschluss übergeben. Sie können auch Event-Abonnenten verwenden, siehe: http://laravel.com/docs/events#event-subscribers
Um Ihre Routen zwischenzuspeichern, verwenden Sie:
php artisan route:trans:cache
... anstelle des normalen Befehls route:cache
. Die Verwendung von artisan route:cache
funktioniert nicht korrekt!
Damit die Route-Caching-Lösung funktioniert, ist eine geringfügige Anpassung Ihrer Anwendungsroutenbereitstellung erforderlich.
vor Laravel 11
Verwenden Sie im RouteServiceProvider
Ihrer App das Merkmal LoadsTranslatedCachedRoutes
:
<?php
class RouteServiceProvider extends ServiceProvider
{
use Mcamara LaravelLocalization Traits LoadsTranslatedCachedRoutes;
nach Laravel 11
Verwenden Sie im AppServiceProvider
Ihrer App die CachedTranslatedRouteLoader
-Klasse in der Registermethode:
<?php
class AppServiceProvider extends ServiceProvider
{
use Mcamara LaravelLocalization Traits LoadsTranslatedCachedRoutes;
/**
* Bootstrap any application services.
*/
public function boot(): void
{
RouteServiceProvider:: loadCachedRoutesUsing ( fn () => $ this -> loadCachedRoutes ());
. . .
}
Weitere Einzelheiten finden Sie hier.
Dies kann passieren, wenn Sie Ihre Aktionsroute, die sich in Ihrer Routes::group
befindet, nicht lokalisieren. Dies kann zu einer Weiterleitung führen, die dann die Post-Anfrage in eine Get-Anfrage ändert. Um dies zu verhindern, verwenden Sie einfach den Localize-Helfer.
Wenn Sie beispielsweise Auth::routes()
verwenden und diese in Ihre Route::group
einfügen, dann
<form action="/logout" method="POST">
<button>Logout</button>
</form>
wird nicht funktionieren. Stattdessen muss man verwenden
<form action ="{{ LaravelLocalization:: localizeURL ( ' /logout ' ) }} " method= " POST ">
<button>Logout</button>
</form>
Eine andere Möglichkeit, dieses Problem zu lösen, besteht darin, die http-Methode zur Konfiguration auf „laravellocalization.httpMethodsIgnored“ zu setzen, um die Verarbeitung dieser Art von Anfragen zu verhindern
Wenn Sie Ihre Post-URL nicht lokalisieren und eine Weiterleitungs-Middleware verwenden, wird die Post-Anfrage als Get-Anfrage umgeleitet. Wenn Sie keine solche Get-Route definiert haben, wird diese Ausnahme verursacht.
Um die URL Ihres Beitrags zu lokalisieren, sehen Sie sich das Beispiel in POST funktioniert nicht an.
Dies passiert auch, wenn Sie die URL Ihres Beitrags nicht lokalisiert haben. Wenn Sie Ihre Beitrags-URL nicht lokalisieren, wird bei der Validierung das Standardgebietsschema festgelegt und bei der Rückkehr zu back()
wird die Validierungsmeldung im Standardgebietsschema angezeigt.
Um die URL Ihres Beitrags zu lokalisieren, sehen Sie sich das Beispiel in POST funktioniert nicht an.
Beim Testaufbau ist die aufgerufene Route noch nicht bekannt. Das bedeutet, dass keine Sprache eingestellt werden kann. Wenn während eines Tests eine Anfrage gestellt wird, führt dies zu einem 404-Fehler – ohne das festgelegte Präfix scheint die lokalisierte Route nicht zu existieren.
Um dies zu beheben, können Sie mit dieser Funktion das Sprachpräfix manuell festlegen:
// TestCase.php
protected function refreshApplicationWithLocale ( $ locale )
{
self :: tearDown ();
putenv (LaravelLocalization:: ENV_ROUTE_KEY . ' = ' . $ locale );
self :: setUp ();
}
protected function tearDown (): void
{
putenv (LaravelLocalization:: ENV_ROUTE_KEY );
parent :: tearDown ();
}
// YourTest.php
public function testBasicTest ()
{
$ this -> refreshApplicationWithLocale ( ' en ' );
// Testing code
}
Fragen Sie Mcamara, ob Sie einer von ihnen sein möchten!
Änderungsprotokoll hier ansehen -> Änderungsprotokoll
Laravel Localization ist ein Open-Source-Laravel-Paket, das unter der MIT-Lizenz lizenziert ist