Pregunta

Estoy usando la clase Laravel Lang para la localización de mi aplicación web.Agregué dos idiomas a la matriz de idiomas en application/config/application.php.Esto cambia el idioma predeterminado que utiliza para la localización a lo que indique la primera parte del URI (p. ej.bla.com/en/bla y bla.com/co/bla).Ahora necesito poder comprobar cuál es el idioma predeterminado actual en mi opinión.Sin embargo, hasta donde he podido entender, la clase Lang no proporciona ninguna forma de verificar esto, ya que el Lang::$language La variable está protegida.¿Hay alguna forma de comprobar esto además de analizar manualmente el URI?

¿Fue útil?

Solución

La respuesta de BenjaminRH es muy buena y el enfoque sugerido funciona perfectamente.He mejorado un poco el fragmento.Ahora detecta el idioma del navegador y comprueba si ese idioma es compatible según el archivo de configuración de la aplicación.

Es un truco rápido, pero funciona en mi aplicación.Tenga en cuenta que el idioma de la aplicación también está configurado ahora.Siéntete libre de utilizarlo o mejorarlo.

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

Otros consejos

La forma más limpia de conocer el idioma actual de su sitio web en Laravel parece ser:

Lang::locale();

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

Es diferente a este comando que devolverá el idioma predeterminado de su sitio web:

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

En las versiones más nuevas de Laravel, puedes obtener el idioma actual con:

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

He descubierto una solución al problema del idioma (gracias a nickstr en IRC y la respuesta aceptada a esta pregunta).Implica almacenar el idioma actual como una variable de sesión, que se actualiza cuando se cambia el segmento uri del idioma.

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

Una forma alternativa, un poco más corta, podría ser usar algo como esto:

app()->getLocale()

La ventaja de esto es que los IDE como PHPStorm reconocen esta función y pueden ayudarle a desarrollarse mucho más rápido.

esto funcionaria bien

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

Esto podría ayudar.Configuración::get('aplicación.idioma')

Puedes usar

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

Laravel Localization utiliza la URL proporcionada para la solicitud.Para lograr este propósito, se debe agregar un grupo al archivo route.php.Filtrará todas las páginas que deben localizarse.

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

Una vez que este grupo se agrega al archivo de rutas, un usuario puede acceder a todos los idiomas agregados en 'languagesAllowed' ('en' y 'es' de forma predeterminada, consulte la sección de configuración para cambiar esa opción).Por ejemplo, un usuario ahora puede acceder a dos idiomas diferentes, utilizando las siguientes direcciones:

http://laravel.com/es

http://laravel.com/es

http://laravel.com

yo suelo App::getLocale() que es probablemente la forma más apoyada ya que App::setLocale('EN') método se utiliza en el documentación.

Puedes utilizar este método en todas partes.Si aparece un error en alguna parte, puedes usar \App::... para que funcione.

Estoy usando Laravel 5.0.

El Lang La clase es específicamente para generar el idioma correcto y, como usted dice, administra el idioma internamente.

Al mirar la API, no existe ningún método que le ayude directamente con esto y analizar el URI para obtener el idioma parecería el curso de acción apropiado.

Siempre puedes hacer esto para recuperar la cadena de idioma en el URI:

$language = URI::segment(1);

Examinando solicitudes de Laravel

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top