Wie finde ich die aktuelle Sprache in einer Laravel-Ansicht?
-
13-12-2019 - |
Frage
Ich verwende die Laravel Lang-Klasse für die Lokalisierung meiner Web-App.Ich habe dem Sprachenarray in zwei Sprachen hinzugefügt application/config/application.php
.Dies ändert die Standardsprache, die für die Lokalisierung verwendet wird, in die im ersten Teil des URI angegebene Sprache (z.bla.com/en/bla und bla.com/co/bla ).Jetzt muss ich in der Lage sein zu überprüfen, was die aktuelle Standardsprache aus meiner Sicht ist.Die Lang-Klasse bietet jedoch keine Möglichkeit, dies zu überprüfen, soweit ich es herausfinden konnte, da die Lang::$language
variable ist geschützt.Gibt es eine Möglichkeit, dies zu überprüfen, außer den URI manuell zu analysieren?
Lösung
Benjaminrhs Antwort ist sehr gut und sein vorgeschlagener Ansatz funktioniert perfekt.Ich habe das Snippet ein wenig verbessert.Jetzt erkennt es die Browsersprache und prüft, ob diese Sprache gemäß der Konfigurationsdatei der Anwendung unterstützt wird.
Es ist ein schneller Hack, aber er funktioniert in meiner App.Beachten Sie, dass jetzt auch die Anwendungssprache eingestellt ist.Fühlen Sie sich frei, Erz zu verwenden, um es zu verbessern.
Route::filter('before', function()
{
// current uri language ($lang_uri)
$lang_uri = URI::segment(1);
// Set default session language if none is set
if(!Session::has('language'))
{
// use lang in uri, if provided
if(in_array($lang_uri, Config::get('application.languages')))
{
$lang = $lang_uri;
}
// detect browser language
elseif(isset(Request::server('http_accept_language')))
{
$headerlang = substr(Request::server('http_accept_language'), 0, 2);
if(in_array($headerlang, Config::get('application.languages')))
{
// browser lang is supported, use it
$lang = $headerlang;
}
// use default application lang
else
{
$lang = Config::get('application.language');
}
}
// no lang in uri nor in browser. use default
else
{
// use default application lang
$lang = Config::get('application.language');
}
// set application language for that user
Session::put('language', $lang);
Config::set('application.language', $lang);
}
// session is available
else
{
// set application to session lang
Config::set('application.language', Session::get('language'));
}
// prefix is missing? add it
if(!in_array($lang_uri, Config::get('application.languages')))
{
return Redirect::to(URI::current());
}
// a valid prefix is there, but not the correct lang? change app lang
elseif(in_array($lang_uri, Config::get('application.languages')) AND $lang_uri != Config::get('application.language'))
{
Session::put('language', $lang_uri);
Config::set('application.language', $lang_uri);
}
});
Andere Tipps
Der sauberste Weg, die aktuelle Sprache Ihrer Website in Laravel zu kennen, scheint zu sein :
Lang::locale();
https://laravel.com/api/5.8/Illuminate/Translation/Translator.html#method_locale
Es unterscheidet sich von diesem Befehl, der die Standardsprache Ihrer Website zurückgibt :
Config::get('app.locale');
In den neueren Laravel-Versionen können Sie die aktuelle Sprache mit abrufen:
Config::get('app.locale');
Ich habe eine Lösung für das Sprachproblem gefunden (danke an nickstr im IRC und die akzeptierte Antwort auf diese Frage).Dabei wird die aktuelle Sprache als Sitzungsvariable gespeichert, die aktualisiert wird, wenn das Sprach-URI-Segment geändert wird.
Route::filter('before', function()
{
// Do stuff before every request to your application...
// Default language ($lang) & current uri language ($lang_uri)
$lang = 'he';
$lang_uri = URI::segment(1);
// Set default session language if none is set
if(!Session::has('language'))
{
Session::put('language', $lang);
}
// Route language path if needed
if($lang_uri !== 'en' && $lang_uri !== 'he')
{
Return Redirect::to($lang.'/'.URI::current());
}
// Set session language to uri
elseif($lang_uri !== Session::get('language'))
{
Session::put('language', $lang_uri);
}
});
Ein alternativer, etwas kürzerer Weg könnte so etwas sein:
app()->getLocale()
Dies hat den Vorteil, dass IDEs wie PhpStorm diese Funktion erkennen und Ihnen helfen können, viel schneller zu entwickeln.
Das würde gut funktionieren
lang="{{ app()->getLocale() }}"
Das könnte helfen.Config::get('Anwendung.sprache')
Sie können verwenden
https://github.com/mcamara/laravel-localization
Die Laravel-Lokalisierung verwendet die für die Anfrage angegebene URL.Um diesen Zweck zu erreichen, sollte eine Gruppe in die Routen aufgenommen werden.php-Datei.Es werden alle Seiten gefiltert, die lokalisiert werden müssen.
// app/routes.php
Route::group(array('prefix' => LaravelLocalization::setLanguage()), 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 Gruppe zur Routendatei hinzugefügt wurde, kann ein Benutzer auf alle Sprachen zugreifen, die zu 'languagesAllowed' hinzugefügt wurden (standardmäßig 'en' und 'es', siehe Abschnitt Konfiguration, um diese Option zu ändern).Beispielsweise kann ein Benutzer jetzt über die folgenden Adressen auf zwei verschiedene Sprachen zugreifen:
Ich benutze App::getLocale()
welches ist wahrscheinlich der am meisten unterstützte Weg als der App::setLocale('EN')
methode wird in der verwendet Dokumentation.
Sie können diese Methode überall anwenden.Wenn irgendwo ein Fehler auftritt, können Sie verwenden \App::...
damit es funktioniert.
Ich benutze Laravel 5.0.
Der Lang
der Unterricht dient speziell der Ausgabe der richtigen Sprache und verwaltet, wie Sie sagen, die Sprache intern.
Wenn Sie die API durchsehen, gibt es keine Methode, die Ihnen direkt dabei hilft, und das Parsen des URI, um die Sprache zu erhalten, scheint die geeignete Vorgehensweise zu sein.
Sie können dies immer einfach tun, um die Sprachzeichenfolge im URI abzurufen:
$language = URI::segment(1);