Question

J'utilise la classe Laravel Lang pour la localisation de mon application Web.J'ai ajouté deux langues au tableau des langues dans application/config/application.php.Cela modifie la langue par défaut utilisée pour la localisation selon celle indiquée par la première partie de l'URI (par ex.bla.com/en/bla et bla.com/co/bla).Je dois maintenant pouvoir vérifier quelle est la langue par défaut actuelle, à mon avis.Cependant, pour autant que j'ai pu le comprendre, la classe Lang ne fournit aucun moyen de vérifier cela, comme le Lang::$language la variable est protégée.Existe-t-il un moyen de vérifier cela en dehors de l'analyse manuelle de l'URI ?

Était-ce utile?

La solution

La réponse de BenjaminRH est très bonne et son approche suggérée fonctionne parfaitement.J'ai un peu amélioré l'extrait.Il détecte désormais la langue du navigateur et vérifie si cette langue est prise en charge selon le fichier de configuration de l'application.

C'est un hack rapide, mais cela fonctionne sur mon application.Notez que la langue de l'application est également définie maintenant.N'hésitez pas à utiliser du minerai pour l'améliorer.

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

Autres conseils

Le moyen le plus simple de connaître la langue actuelle de votre site Web dans Laravel semble être :

Lang::locale();

https://laravel.com/api/5.8/Illuminate/Translation/Translator.html#method_locale

C'est différent de cette commande qui renverra la langue par défaut de votre site web :

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

Dans les versions les plus récentes de Laravel, vous pouvez obtenir la langue actuelle avec :

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

J'ai trouvé une solution au problème de langage (grâce à nickstr sur IRC et à la réponse acceptée à cette question).Cela implique de stocker la langue actuelle en tant que variable de session, qui est mise à jour lorsque le segment uri de langue est modifié.

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

Une alternative, un peu plus courte, pourrait consister à utiliser quelque chose comme ceci :

app()->getLocale()

L’avantage est que les IDE tels que PHPStorm reconnaissent cette fonction et peuvent vous aider à développer beaucoup plus rapidement.

Cela fonctionnerait bien

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

Cela pourrait aider.Config::get('application.langue')

Vous pouvez utiliser

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

La localisation Laravel utilise l'URL indiquée pour la requête.Afin d'atteindre cet objectif, un groupe doit être ajouté dans le fichier routes.php.Il filtrera toutes les pages qui doivent être localisées.

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

Une fois ce groupe ajouté au fichier de routes, un utilisateur peut accéder à toutes les langues ajoutées dans les « langues autorisées » (« en » et « es » par défaut, regardez la section de configuration pour modifier cette option).Par exemple, un utilisateur peut désormais accéder à deux langues différentes, en utilisant les adresses suivantes :

http://laravel.com/fr

http://laravel.com/es

http://laravel.com

j'utilise App::getLocale() ce qui est probablement le moyen le plus pris en charge car App::setLocale('EN') méthode est utilisée dans le Documentation.

Vous pouvez utiliser cette méthode partout.S'il y a une erreur quelque part, vous pouvez utiliser \App::... pour que ça marche.

J'utilise Laravel 5.0.

Le Lang la classe est spécifiquement destinée à produire la langue correcte et, comme vous le dites, gère la langue en interne.

En parcourant l'API, il n'existe aucune méthode pour vous aider directement et analyser l'URI pour obtenir la langue semble être la marche à suivre appropriée.

Vous pouvez toujours faire ceci pour récupérer la chaîne de langue dans l'URI :

$language = URI::segment(1);

Examen des requêtes Laravel

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top