Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I find the current language in a Laravel view?

I'm using the Laravel Lang class for localization of my web app. I've added two languages to the languages array in application/config/application.php. This changes the default language it uses for localization to whatever the first part of the URI indicates (e.g. bla.com/en/bla and bla.com/co/bla). Now I need to be able to check what the current default language is in my view. However, the Lang class provides no way of checking this as far as I've been able to figure out, as the Lang::$language variable is protected. Is there any way of checking this apart from manually parsing the URI?

like image 686
BenjaminRH Avatar asked Oct 03 '12 10:10

BenjaminRH


People also ask

How can I get Laravel language?

I use App::getLocale() which is probably the most supported way as the App::setLocale('EN') method is used in the documentation. You can use this method everywhere. If it throughs an error somewhere, you can use \App::... to make it work.

How do I get current Locale in Laravel?

To fetch current locale you should use App::getLocale() or App::isLocale('...') . Localization. You can also use app()->getLocale() which in Blade would be {{ app()->getLocale() }} .

Where is Lang in Laravel?

The default language for your application is stored in the config/app.

What language is Laravel?

Laravel is a framework built using PHP – an open-source programming language that has been at the forefront of the most popular backend languages for years.


3 Answers

The cleanest way to know the current language of your website in Laravel appears to be :

Lang::locale();

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

It's different than this command that will return the default language of your website :

Config::get('app.locale');
like image 54
Erwan Avatar answered Oct 20 '22 15:10

Erwan


An alternative, a bit shorter way could be using something like this:

app()->getLocale()

The advantage of this is that IDEs such as PHPStorm recognize this function and can help you develop much faster.

like image 24
ThatMSG Avatar answered Oct 20 '22 14:10

ThatMSG


BenjaminRH's answer is very good, and his suggested approach works perfectly. I've improved the snippet a bit. Now it detects the browser language and checks if that language is supported according to the application's config file.

It's a quick hack, but it works on my app. Note that the application language is also set now. Feel free to use ore improve it.

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);    
    }
});
like image 8
aebersold Avatar answered Oct 20 '22 14:10

aebersold