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?

War es hilfreich?

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:

http://laravel.com/en

http://laravel.com/es

http://laravel.com

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);

Laravel-Anfragen prüfen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top