Pergunta

Estou usando a classe Laravel Lang para localização do meu aplicativo web.Adicionei dois idiomas ao array de idiomas em application/config/application.php.Isso altera o idioma padrão usado para localização para o que a primeira parte do URI indicar (por exemplo,bla.com/en/bla e bla.com/co/bla).Agora preciso verificar qual é o idioma padrão atual na minha opinião.No entanto, a classe Lang não oferece nenhuma maneira de verificar isso, pelo que consegui descobrir, já que o Lang::$language variável está protegida.Existe alguma maneira de verificar isso além de analisar manualmente o URI?

Foi útil?

Solução

A resposta de BenjaminRH é muito boa e a abordagem sugerida funciona perfeitamente.Melhorei um pouco o trecho.Agora ele detecta o idioma do navegador e verifica se esse idioma é suportado de acordo com o arquivo de configuração do aplicativo.

É um hack rápido, mas funciona no meu aplicativo.Observe que o idioma do aplicativo também está definido agora.Sinta-se à vontade para usar o minério para melhorá-lo.

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

Outras dicas

A maneira mais limpa de saber o idioma atual do seu site no Laravel parece ser:

Lang::locale();

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

É diferente deste comando que retornará o idioma padrão do seu site:

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

Nas versões mais recentes do Laravel, você pode obter o idioma atual com:

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

Eu descobri uma solução para o problema de idioma (graças ao nickstr no IRC e à resposta aceita para esta pergunta).Envolve armazenar o idioma atual como uma variável de sessão, que é atualizada quando o segmento uri do idioma é alterado.

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

Uma alternativa, um pouco mais curta, poderia ser usando algo assim:

app()->getLocale()

A vantagem disso é que IDEs como o PHPStorm reconhecem essa função e podem ajudá-lo a desenvolver muito mais rápido.

Isso funcionaria bem

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

Isso pode ajudar.Config::get('application.idioma')

Você pode usar

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

A localização do Laravel usa a URL fornecida para a solicitação.Para atingir este propósito, um grupo deve ser adicionado ao arquivo Routes.php.Ele filtrará todas as páginas que devem ser localizadas.

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

Depois que este grupo for adicionado ao arquivo de rotas, um usuário poderá acessar todos os idiomas adicionados em 'idiomasPermitidos' ('en' e 'es' por padrão, consulte a seção de configuração para alterar essa opção).Por exemplo, um usuário agora pode acessar dois idiomas diferentes, usando os seguintes endereços:

http://laravel.com/en

http://laravel.com/es

http://laravel.com

eu uso App::getLocale() que é provavelmente a forma mais suportada como o App::setLocale('EN') método é usado no documentação.

Você pode usar esse método em qualquer lugar.Se ocorrer um erro em algum lugar, você pode usar \App::... para fazer funcionar.

Estou usando o Laravel 5.0.

O Lang class é especificamente para gerar o idioma correto e, como você diz, gerencia o idioma internamente.

Olhando através da API, não há nenhum método para ajudá-lo diretamente com isso e analisar o URI para obter o idioma parece ser o curso de ação apropriado.

Você sempre pode fazer isso para recuperar a string do idioma no URI:

$language = URI::segment(1);

Examinando solicitações do Laravel

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top