Я использую класс Laravel Lang для локализации моего веб-приложения. Я добавил два языка в массив языков в application/config/application.php
. Это изменяет язык по умолчанию, который он использует для локализации, независимо от того, что указывает первая часть URI (например, bla.com/en/bla и bla.com/co/bla). Теперь мне нужно иметь возможность проверить, что текущий язык по умолчанию на мой взгляд. Однако класс Lang не дает возможности проверить это, насколько мне удалось выяснить, поскольку переменная Lang::$language
защищена. Есть ли способ проверить это отдельно от ручного анализа URI?
Как найти текущий язык в представлении Laravel?
Ответ 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" по умолчанию, посмотрите в разделе конфигурации, чтобы изменить этот параметр). Например, теперь пользователь может получить доступ к двум различным языкам, используя следующие адреса:
Ответ 8
Альтернатива, немного более короткий способ может использовать что-то вроде этого:
app()->getLocale()
Преимущество этого заключается в том, что IDE, такие как PHPStorm, распознают эту функцию и могут помочь вам развиваться намного быстрее.
Ответ 9
Я использую App::getLocale()
, который, вероятно, наиболее поддерживается, поскольку метод App::setLocale('EN')
используется в документации.
Этот метод можно использовать везде. Если это где-то ошибка, вы можете использовать \App::...
, чтобы заставить ее работать.
Я использую Laravel 5.0.
Ответ 10
Класс Lang
предназначен специально для вывода правильного языка и, как вы говорите, управляет языком внутри.
Просматривая API, нет способа помочь вам напрямую с этим и проанализировать URI, чтобы язык выглядел соответствующим образом.
Вы всегда можете сделать это, чтобы получить строку языка в URI:
$language = URI::segment(1);