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

StackOverflow https://stackoverflow.com//questions/12706463

  •  13-12-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

Ответ 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);    
    }
});

Другие советы

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

Lang::locale();

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

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

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

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

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

Я нашел решение языковой проблемы (спасибо 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);
    }
});

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

app()->getLocale()

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

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

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

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

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

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

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

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

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

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

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

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

$language = URI::segment(1);

Изучение запросов Laravel

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top