Как найти текущий язык в представлении Laravel?

Я использую класс Laravel Lang для локализации моего веб-приложения. Я добавил два языка в массив языков в application/config/application.php. Это изменяет язык по умолчанию, который он использует для локализации, независимо от того, что указывает первая часть URI (например, bla.com/en/bla и bla.com/co/bla). Теперь мне нужно иметь возможность проверить, что текущий язык по умолчанию на мой взгляд. Однако класс Lang не дает возможности проверить это, насколько мне удалось выяснить, поскольку переменная Lang::$language защищена. Есть ли способ проверить это отдельно от ручного анализа URI?

Ответ 1

Ответ BenjaminRH очень хорош, и его предложенный подход работает отлично. Я немного улучшил фрагмент. Теперь он обнаруживает язык браузера и проверяет, поддерживается ли этот язык в соответствии с конфигурационным файлом приложения.

Это быстрый взлом, но он работает на моем приложении. Обратите внимание, что язык приложения также установлен. Не используйте руду, чтобы улучшить ее.

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

Ответ 2

Самый простой способ узнать текущий язык вашего сайта в Laravel:

Lang::locale();

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

Он отличается от этой команды, которая возвращает язык по умолчанию вашего сайта:

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

Ответ 3

В новых версиях Laravel вы можете получить текущий язык:

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

Ответ 4

Я выяснил решение проблемы языка (спасибо nickstr на IRC и принятый ответ на этот вопрос). Он включает сохранение текущего языка в качестве переменной сеанса, которая обновляется при изменении языка uri.

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

Ответ 5

Это может помочь.   Config:: получить ( 'application.language')

Ответ 6

Это будет нормально работать

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

Ответ 7

Вы можете использовать

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

Локализация Laravel использует URL-адрес, указанный для запроса. Для достижения этой цели группа должна быть добавлена ​​в файл routes.php. Он будет фильтровать все страницы, которые должны быть локализованы.

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

После добавления этой группы в файл маршрутов пользователь может получить доступ ко всем языкам, добавленным в "languagesAllowed" ( "en" и "es" по умолчанию, посмотрите в разделе конфигурации, чтобы изменить этот параметр). Например, теперь пользователь может получить доступ к двум различным языкам, используя следующие адреса:

http://laravel.com/en

http://laravel.com/es

http://laravel.com

Ответ 8

Альтернатива, немного более короткий способ может использовать что-то вроде этого:

app()->getLocale()

Преимущество этого заключается в том, что IDE, такие как PHPStorm, распознают эту функцию и могут помочь вам развиваться намного быстрее.

Ответ 9

Я использую App::getLocale(), который, вероятно, наиболее поддерживается, поскольку метод App::setLocale('EN') используется в документации.

Этот метод можно использовать везде. Если это где-то ошибка, вы можете использовать \App::..., чтобы заставить ее работать.

Я использую Laravel 5.0.

Ответ 10

Класс Lang предназначен специально для вывода правильного языка и, как вы говорите, управляет языком внутри.

Просматривая API, нет способа помочь вам напрямую с этим и проанализировать URI, чтобы язык выглядел соответствующим образом.

Вы всегда можете сделать это, чтобы получить строку языка в URI:

$language = URI::segment(1);

Проверка запросов Laravel