¿Cómo puedo encontrar el idioma actual en una vista de Laravel?
-
13-12-2019 - |
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?
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:
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);