Wie die Erstellung von mehrsprachigen übersetzt Routen in Laravel
Ich würde gerne zum erstellen einer Anwendung mit vielen übersetzten Routen je nach gewählter Sprache. Ich habe mal beschrieben, ist es bei 3 Methoden zum erstellen von URLs für Mehrsprachige Webseiten.
In diesem Fall sollte es die erste Methode, die von der erwähnten Thema so:
- Ich habe eine default-Sprache
- Ich kann noch viele andere Sprachen
- Aktuelle Sprache berechnet werden soll, nur durch die URL (ohne cookies/sessions), um es wirklich freundlich, auch für Suchmaschinen
- Für die default-Sprache sollte es kein Präfix in der URL, zum anderen sollten Sprachen Sprache Präfix nach-Domäne
- Jeden Teil der url übersetzt werden sollten, entsprechend der aktuellen Sprache.
Nehmen wir an, ich habe die default Sprache pl
und 2 andere Sprachen en
und fr
. Ich habe nur 3 Seiten Hauptseite, Kontakt-Seite und über die Seite.
Urls für die Website Aussehen soll, dann so:
/
/[about]
/[contact]
/en
/en/[about]
/en/[contact]
/fr
/fr/[about]
/fr/[contact]
in der Erwägung, dass [about]
und [contact]
übersetzt werden sollten, entsprechend der gewählten Sprache, zum Beispiel im englischen belassen werden sollten contact
aber für polnische es sollte kontakt
und so weiter.
Wie kann es getan werden, so einfach wie möglich?
InformationsquelleAutor Marcin Nabiałek | 2014-08-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erste Schritt:
Gehen
app/lang
Verzeichnis und erstellen Sie hier die übersetzungen für Ihre Routen für jede Sprache. Sie müssen erstellen 3routes.php
- Dateien jeweils in separaten Sprachen-Verzeichnis (pl/de/fr), weil Sie verwenden möchten 3 SprachenFür Polnisch:
Für Englisch:
Für Französisch:
Zweite Schritt:
Gehen
app/config/app.php
Datei.Sollten Sie suchen Zeile:
ändern und es in Sprache, sollte Ihre primäre Sprache der Website (in deinem Fall Polnisch):
Müssen Sie auch in dieser Datei die folgenden Zeilen:
In
alt_langs
config legen Sie alternative Sprachen (in deinem Fallen
undfr
) - Sie sollte die gleiche wie Datei-Namen vom ersten Schritt, mit dem Sie erstellt Dateien mit den übersetzungen.Sowie
locale_prefix
ist das Präfix für Ihr Gebietsschema. Sie wollte kein Präfix für den default-locale, so dass es auf eine leere Zeichenfolge. Diese config wird geändert in runtime wenn eine andere Sprache als Standard ausgewählt wird.Dritten Schritt
Gehen Sie zu Ihrem
app/routes.php
- Datei ein und setzen Ihren Inhalt (das ist der ganze Inhaltapp/routes.php
- Datei):Wie Sie sehen, sind Sie zuerst überprüfen, ob das erste segment von url entspricht dem Namen der Sprachen - falls ja, ändern Sie das Gebietsschema und die aktuelle Sprache Präfix.
Dann in der kleinen Schleife, legen Sie die Anforderungen für Ihre alle route-Namen (Sie erwähnt, dass Sie wollen, haben
about
undcontact
übersetzt in URL), so stellen Sie hier ein, Sie als das gleiche wie definiert inroutes.php
- Datei für die aktuelle Sprache.Du endlich create Route-Gruppe, wird als Präfix den gleichen als Sie Ihre Sprache (nur für Standard-Sprache wird es leer sein) und innerhalb der Gruppe, die Sie erstellen Sie ganz einfach Wege, aber diese Parameter
about
undcontact
Sie behandeln, wievariables
so verwenden Sie{about}
und{contact}
syntax für Sie.Müssen Sie daran denken, dass in diesem Fall
{contact}
in allen Strecken wird überprüft, ob es das gleiche ist wie man es definiert im ersten Schritt für die aktuelle Sprache. Wenn Sie nicht möchten, dass von diesem Effekt und möchte Routen einrichten manuell für jede Strecke verwenden, wo gibt es alternativeapp\routes.php
Datei ohne Schleife, wo Siecontact
undabout
separat für jede Strecke:Vierter Schritt:
Haben Sie nicht erwähnt, aber es gibt eine zusätzliche Sache, die Sie in Betracht ziehen könnte. Wenn jemand mit url -
/en/something
wosomething
ist auch nicht die richtige Route, ich denke, die beste Lösung, um die Umleitung. Aber man sollte die Umleitung nicht/
weil es die Standard-Sprache, sondern/en
.So, jetzt können Sie öffnen
app/start/global.php
- Datei und erstellen Sie hier eine 301-Umleitung für die unbekannten urls:routes.php
- Datei, gibt ein assoziatives array mit Sprache nach ISO 639-1 als Schlüssel würde die Dinge einfacher.return array('en' => array(...), 'pl' => array(...) ...)
InformationsquelleAutor Marcin Nabiałek
Was Marcin Nabiałek uns mit in seine erste Antwort ist eine solide Lösung, um die Strecke das problem der Lokalisierung.
Der Kleine Popanz:
Der einzige wirkliche Nachteil mit seiner Lösung ist, dass wir nicht gecachten Routen, das kann manchmal von großem Vorteil, da pro
Laravel's
docs:Warum können wir nicht cache-Routen?
Weil Marcin Nabiałek ist Methode erzeugt neue Routen auf der Grundlage der
locale_prefix
dynamisch, caching, Sie würde einen404
Fehler auf den Besuch einer Präfix nicht gespeichert in derlocale_prefix
variable zum Zeitpunkt der Zwischenspeicherung.Was halten wir?
Die foundation scheint sehr solide und wir können halten die meisten es!
Können wir sicherlich halten die verschiedenen Lokalisierung-spezifische route-Dateien:
Können wir halten auch alle die
app/config/app.php
Variablen:Müssen wir auch das Stück code, der überprüft die route Segmente. Aber da der Punkt von diesem ist zu nutzen, um den cache müssen wir verschieben Sie Sie außerhalb der
routes.php
- Datei. Dass man nicht mehr verwendet werden, sobald wir die cache-Routen. Wir können für die Zeit, verschieben Sie es aufapp/Providers/AppServiceProver.php
zum Beispiel:Nicht vergessen:
Unsere Routen:
Mehrere Veränderungen innerhalb unserer
app/Http/routes.php
Datei.Erstens haben wir eine neue array enthält alle
alt_langs
sowie die Standard -locale_prefix
, die würde wahrscheinlich''
:Um der Lage sein, um cache all die verschiedenen lang-Präfixe mit übersetzten Parameter der route müssen wir registrieren Sie alle. Wie können wir das tun?
*** Laravel aside 1: ***
Werfen wir einen Blick auf die definition von
Lang::get(..)
:Den Dritten parameter der Funktion ist ein
$locale
variable! Toll - wir können sicher auch, dass zu unserem Vorteil! Diese Funktion tatsächlich lassen Sie uns wählen Sie das Gebietsschema wir möchten, erhalten Sie die übersetzung von!Die nächste Sache, die wir tun werden, ist die Iteration über die
$all_langs
array und erstellen Sie eine neueRoute
Gruppe für jede Sprache ein Präfix. Nicht nur das, sondern wir gehen auch, um loszuwerden, daswhere
Ketten undpatterns
, die wir bisher gebraucht, und nur registrieren die Strecken mit Ihren richtigen übersetzungen (andere werfen404
ohne vorher zu prüfen, für die es mehr):Houston, wir haben ein problem!
Wie Sie sehen können, dass ich lieber mit benannten Routen (die meisten Menschen tun das wohl):
Können Sie sehr leicht in Ihrer blade-templates:
Aber es gibt ein Problem mit meiner Lösung bisher: Route-Namen überschreiben sich gegenseitig. Die
foreach
Schleife oben wäre nur registrieren, das Letzte vorangestellt Routen mit Ihren Namen.In anderen Worten nur
example.com/
wäre gebunden an diehome
route alslocale_perfix
war das Letzte Element in der$all_langs
array.Wir können dies umgehen, indem route-Namen mit der Sprache
$prefix
. Zum Beispiel:Wir haben dazu für jede der Strecken innerhalb unserer Schleife. Dies schafft ein weiteres kleines Hindernis.
Aber mein großes Projekt ist fast fertig!
Gut, wie Sie wahrscheinlich schon erraten, die Sie jetzt haben, um zurück zu gehen, um alle Ihre Dateien und Präfix jedes
route
Helfer-Aufruf mit den aktuellenlocale_prefix
geladen, aus derapp
config.Außer Sie nicht!
*** Laravel aside 2: ***
Lassen Sie uns nehmen einen Blick an, wie Laravel implementiert es
route
Helfer-Methode.Wie Sie sehen können, Laravel, wird erst überprüft, wenn ein
route
Funktion existiert bereits. Es registriert seineroute
Funktion nur, wenn eine andere noch nicht vorhanden ist!Was bedeutet, dass wir bekommen können, um unser problem sehr einfach ohne schreiben jeden einzelnen
route
nennen, die bisher in unsererBlade
Vorlagen.Let ' s machen ein
app/helpers.php
- Datei ganz schnell.Stellen wir sicher, dass Laravel lädt die Datei, bevor es lädt seine
helpers.php
indem Sie die folgende Zeile inbootstrap/autoload.php
Alles, was wir jetzt tun müssen, ist unsere eigene
route
Funktion innerhalb unsererapp/helpers.php
- Datei. Wir verwenden die ursprüngliche Implementierung als Grundlage:Das ist es!
So, was wir getan haben, ist im wesentlichen registrierten alle, die Präfix-Gruppen zur Verfügung. Erstellt jeder Weg übersetzt und mit es der name vorangestellt. Und dann Art überschrieben die Laravel
route
Funktion als Präfix die gesamte route mit Namen (außer ein paar) mit den aktuellenlocale_prefix
so, dass die entsprechenden urls erstellt werden, in unserer blade-templates, ohneconfig('app.locale_prefix')
jede einzelne Zeit.Ach ja:
Caching-Routen sollte eigentlich nur einmal gemacht werden, die Sie bereitstellen, Ihr Projekt, da es sehr wahrscheinlich ist Sie Durcheinander wird mit Ihnen während devlopement. Aber Sie können immer den cache löschen:
Nochmals vielen Dank an Marcin Nabiałek für seine ursprüngliche Antwort. Es war wirklich hilfreich für mich.
InformationsquelleAutor PeterTheLobster
Den gleichen Ergebnissen angewandt werden kann, mit einem einfacheren Ansatz.. nicht perfekt, aber bietet eine schnelle und einfache Lösung. In diesem Szenario, Sie haben allerdings schreiben die einzelnen Strecken, so könnte es es nicht für große websites.
nur definieren Sie die route von Namen in der Lokalisierungs-Datei, etwa so:
Dann können Sie Sie in Ihrer blade-Vorlagen erzeugt locale-Variablen, wie z.B. so:
__('rte_contact')
übersetzen zu'rte_contact'
bei Sprache 'en' und'rte_contact_fr'
bei der Sprache ist 'fr'InformationsquelleAutor JeanMGirard