Domanda

Sto usando la classe Lang Lang per la localizzazione della mia app web.Ho aggiunto due lingue per l'array di lingue in application/config/application.php.Ciò modifica la lingua predefinita utilizzata per la localizzazione a qualsiasi parte della prima parte dell'URI indica (ad esempio bla.com/en/bla e bla.com/co/bla).Ora ho bisogno di essere in grado di controllare ciò che la lingua di default corrente è a mio avviso.Tuttavia, la classe LANG non fornisce alcun modo di controllarlo per quanto sono stato in grado di capire, poiché la variabile Lang::$language è protetta.C'è un modo per controllarlo a parte di analizzare manualmente l'URI?

È stato utile?

Soluzione

La risposta di Benjaminrh è molto buona, e il suo approccio suggerito funziona perfettamente.Ho migliorato un po 'lo snippet.Ora rileva la lingua del browser e controlla se tale lingua è supportata in base al file di configurazione dell'applicazione.

È un rapido hack, ma funziona sulla mia app.Si noti che anche la lingua dell'applicazione è impostata.Sentiti libero di usare Ore Migliorarlo.

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

Altri suggerimenti

Il modo più pulito per conoscere la lingua corrente del tuo sito web a Laravel sembra essere:

Lang::locale();
.

https://laravel.com/api/5.8/Illumina/Translation/translator.html#method_locale

È diverso da questo comando che restituirà la lingua predefinita del tuo sito web:

Config::get('app.locale');
.

Nelle versioni di laravel più recenti, è possibile ottenere la lingua corrente con:

Config::get('app.locale');
.

Ho capito una soluzione al problema della lingua (grazie a Nickstr sull'IRC e alla risposta accettata a questa domanda).Si tratta di memorizzare la lingua corrente come variabile di sessione, che viene aggiornata quando viene modificato il segmento URI della lingua.

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

Un'alternativa, un po 'più breve potrebbe usare qualcosa del genere:

app()->getLocale()
.

Il vantaggio di questo è che IDES come Phpstorm riconosce questa funzione e può aiutarti a sviluppare molto più veloce.

Questo funzionerebbe bene

lang="{{ app()->getLocale() }}"
.

Questo potrebbe aiutare. Config :: Get ('application.language')

Puoi usare

https://github.com/mcamara/laravel-localization
.

La localizzazione Laravel utilizza l'URL fornito per la richiesta.Per raggiungere questo scopo, un gruppo dovrebbe essere aggiunto nel file rottes.php.Filtrerà tutte le pagine che devono essere localizzate.

    // 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 **/
.

Una volta aggiunto che questo gruppo viene aggiunto al file di rotte, un utente può accedere a tutte le lingue aggiunte nelle "lingue" ("EN" e "ES" per impostazione predefinita, guarda la sezione Config per modificare tale opzione).Ad esempio, un utente può ora accedere a due lingue diverse, utilizzando i seguenti indirizzi:

http://laravel.com/en

http://laravel.com/es

http://laravel.com

Io uso App::getLocale() che è probabilmente il modo più supportato del metodo App::setLocale('EN') in Documentazione .

È possibile utilizzare questo metodo ovunque.Se attraverso un errore da qualche parte, è possibile utilizzare \App::... per farlo funzionare.

Sto usando Laravel 5.0.

La classe Lang è specificatamente per l'emissione della lingua corretta e come si dice gestisce la lingua internamente.

Guardando attraverso l'API non c'è metodo per aiutarti direttamente con questo e analizzare l'URI per ottenere la lingua sembrerebbe la linea d'azione appropriata.

Puoi sempre farlo per recuperare la stringa di lingua nell'URI:

$language = URI::segment(1);
.

Esaminando le richieste di laravel

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top