Move config "show_language_selector_in_menu" to the DB

- Add language priorities in the listener
- Remove unused
pull/2650/head^2
Julio Montoya 7 years ago
parent c59590d3cc
commit 30a646aa74
  1. 99
      main/inc/global.inc.php
  2. 131
      main/inc/lib/api.lib.php
  3. 28
      main/inc/lib/template.lib.php
  4. 9
      main/inc/lib/userportal.lib.php
  5. 4
      main/install/configuration.dist.php
  6. 10
      src/CoreBundle/EventListener/LegacyListener.php
  7. 125
      src/CoreBundle/EventListener/LegacyLoginListener.php
  8. 44
      src/CoreBundle/EventListener/LocaleListener.php
  9. 25
      src/CoreBundle/Resources/views/Admin/switcher_links.html.twig
  10. 19
      src/CoreBundle/Settings/LanguageSettingsSchema.php
  11. 20
      src/ThemeBundle/Resources/views/Sidebar/login.html.twig

@ -387,106 +387,11 @@ try {
}
}
// Checking if we have a valid language. If not we set it to the platform language.
$valid_languages = api_get_languages();
if (!empty($valid_languages)) {
if (!in_array($user_language, $valid_languages)) {
$user_language = api_get_setting('platformLanguage');
}
$language_priority1 = api_get_setting('languagePriority1');
$language_priority2 = api_get_setting('languagePriority2');
$language_priority3 = api_get_setting('languagePriority3');
$language_priority4 = api_get_setting('languagePriority4');
if (isset($_GET['language']) ||
(isset($_POST['language_list']) && !empty($_POST['language_list'])) ||
!empty($browser_language)
) {
$user_selected_language = $user_language; // $_GET['language']; or HTTP_ACCEPT_LANGUAGE
$_SESSION['user_language_choice'] = $user_selected_language;
$platformLanguage = $user_selected_language;
}
if (!empty($language_priority4) && api_get_language_from_type($language_priority4) !== false) {
$language_interface = api_get_language_from_type($language_priority4);
} else {
$language_interface = api_get_setting('platformLanguage');
}
if (!empty($language_priority3) && api_get_language_from_type($language_priority3) !== false) {
$language_interface = api_get_language_from_type($language_priority3);
} else {
if (isset($_SESSION['user_language_choice'])) {
$language_interface = $_SESSION['user_language_choice'];
}
}
if (!empty($language_priority2) && api_get_language_from_type($language_priority2) !== false) {
$language_interface = api_get_language_from_type($language_priority2);
} else {
if (isset($_user['language'])) {
$language_interface = $_user['language'];
}
}
if (!empty($language_priority1) && api_get_language_from_type($language_priority1) !== false) {
$language_interface = api_get_language_from_type($language_priority1);
} else {
if (isset($_course['language'])) {
$language_interface = $_course['language'];
}
}
// If language is set via browser ignore the priority
if (isset($_GET['language'])) {
$language_interface = $user_language;
}
$allow = api_get_configuration_value('show_language_selector_in_menu');
// Overwrite all lang configs and use the menu language
if ($allow) {
if (isset($_SESSION['user_language_choice'])) {
$userEntity = api_get_user_entity(api_get_user_id());
if ($userEntity) {
if (isset($_GET['language'])) {
$language_interface = $_SESSION['user_language_choice'];
$userEntity->setLanguage($language_interface);
Database::getManager()->merge($userEntity);
Database::getManager()->flush();
// Update cache
api_get_user_info(
api_get_user_id(),
true,
false,
true,
false,
true,
true
);
if (isset($_SESSION['_user'])) {
$_SESSION['_user']['language'] = $language_interface;
}
}
$language_interface = $_SESSION['user_language_choice'] = $userEntity->getLanguage();
}
} else {
$userInfo = api_get_user_info();
if (!empty($userInfo['language'])) {
$_SESSION['user_language_choice'] = $userInfo['language'];
$language_interface = $userInfo['language'];
}
}
}
}
/**
* Include the trad4all language file.
*/
// if the sub-language feature is on
$parent_path = SubLanguageManager::get_parent_language_path($language_interface);
/*$parent_path = SubLanguageManager::get_parent_language_path($language_interface);
if (!empty($parent_path)) {
// include English
include $langpath.'english/trad4all.inc.php';
@ -512,7 +417,7 @@ try {
if (file_exists($langfile)) {
include $langfile;
}
}
}*/
// include the local (contextual) parameters of this course or section
//require_once __DIR__.'/local.inc.php';

@ -4760,71 +4760,6 @@ function api_get_languages_combo($name = 'language')
return $ret;
}
/**
* Displays a form (drop down menu) so the user can select his/her preferred language.
* The form works with or without javascript.
*
* @param bool Hide form if only one language available (defaults to false = show the box anyway)
* @param bool $showAsButton
*
* @return null|string Display the box directly
*/
function api_display_language_form($hide_if_no_choice = false, $showAsButton = false)
{
// Retrieve a complete list of all the languages.
$language_list = api_get_languages();
if (count($language_list) <= 1 && $hide_if_no_choice) {
// don't show any form
return '';
}
// The the current language of the user so that his/her language occurs as selected in the dropdown menu.
if (isset($_SESSION['user_language_choice'])) {
$user_selected_language = $_SESSION['user_language_choice'];
}
if (empty($user_selected_language)) {
$user_selected_language = api_get_setting('platformLanguage');
}
$user_selected_language = 'en';
$countryCode = languageToCountryIsoCode($user_selected_language);
$language = api_get_language_from_iso($user_selected_language);
$url = api_get_self();
if ($showAsButton) {
$html = '<div class="btn-group">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
<span class="flag-icon flag-icon-'.$countryCode.'"></span>
'.$language->getOriginalName().'
<span class="caret">
</span>
</button>';
} else {
$html = '
<a href="'.$url.'" class="dropdown-toggle" data-toggle="dropdown" role="button">
<span class="flag-icon flag-icon-'.$countryCode.'"></span>
'.$language->getOriginalName().'
<span class="caret"></span>
</a>
';
}
$html .= '<ul class="dropdown-menu" role="menu">';
foreach ($language_list as $iso => $data) {
$urlLink = $url.'?language='.$data;
$html .= '<li><a href="'.$urlLink.'">';
$html .= '<span class="flag-icon flag-icon-'.languageToCountryIsoCode($iso).'"></span> '.$data.'</a></li>';
}
$html .= '</ul>';
if ($showAsButton) {
$html .= '</div>';
}
return $html;
}
/**
* @param string $languageIsoCode
*
@ -4959,72 +4894,6 @@ function api_get_language_id($language)
return $row['id'];
}
/**
* Gets language of the requested type for the current user. Types are :
* user_profil_lang : profile language of current user
* user_select_lang : language selected by user at login
* course_lang : language of the current course
* platform_lang : default platform language.
*
* @param string $lang_type
*
* @return string
*/
function api_get_language_from_type($lang_type)
{
$return = false;
switch ($lang_type) {
case 'platform_lang':
$temp_lang = api_get_setting('platformLanguage');
if (!empty($temp_lang)) {
$return = $temp_lang;
}
break;
case 'user_profil_lang':
$_user = api_get_user_info();
if (isset($_user['language']) && !empty($_user['language'])) {
$return = $_user['language'];
}
break;
case 'user_selected_lang':
if (isset($_SESSION['user_language_choice']) && !empty($_SESSION['user_language_choice'])) {
$return = $_SESSION['user_language_choice'];
}
break;
case 'course_lang':
global $_course;
$cidReq = null;
if (empty($_course)) {
// Code modified because the local.inc.php file it's declarated after this work
// causing the function api_get_course_info() returns a null value
$cidReq = isset($_GET["cidReq"]) ? Database::escape_string($_GET["cidReq"]) : null;
$cDir = (!empty($_GET['cDir']) ? $_GET['cDir'] : null);
if (empty($cidReq) && !empty($cDir)) {
$c = CourseManager::getCourseCodeFromDirectory($cDir);
if ($c) {
$cidReq = $c;
}
}
}
$_course = api_get_course_info($cidReq);
if (isset($_course['language']) && !empty($_course['language'])) {
$return = $_course['language'];
$showCourseInUserLanguage = api_get_course_setting('show_course_in_user_language');
if ($showCourseInUserLanguage == 1) {
$userInfo = api_get_user_info();
if (isset($userInfo['language'])) {
$return = $userInfo['language'];
}
}
}
break;
default:
$return = false;
break;
}
return $return;
}
/**
* Get the language information by its id.

@ -235,11 +235,6 @@ class Template
$this->assign('locale', api_get_language_isocode());
$this->assign('login_class', null);
$allow = api_get_configuration_value('show_language_selector_in_menu');
if ($allow) {
$this->assign('language_form', api_display_language_form());
}
// Chamilo plugins
if ($this->show_header) {
if ($this->load_plugins) {
@ -1115,29 +1110,6 @@ class Template
return $theme;
}
/**
* @param bool|true $setLoginForm
*/
public function setLoginForm($setLoginForm = true)
{
global $loginFailed;
$userId = api_get_user_id();
if (!($userId) || api_is_anonymous($userId)) {
// Only display if the user isn't logged in.
$this->assign(
'login_language_form',
api_display_language_form(true, true)
);
if ($setLoginForm) {
$this->assign('login_form', $this->displayLoginForm());
if ($loginFailed) {
$this->assign('login_failed', $this::handleLoginFailed());
}
}
}
}
/**
* @return string
*/

@ -49,15 +49,6 @@ class IndexManager
}
}
/**
* @param bool $setLoginForm
*/
public function set_login_form($setLoginForm = true)
{
global $loginFailed;
$this->tpl->setLoginForm($setLoginForm);
}
/**
* @param array $personal_course_list
*/

@ -657,10 +657,6 @@ $_configuration['gradebook_badge_sidebar'] = [
'gradebooks' => [1, 2, 3]
];*/
// Show language selector in main menu an update the language in the user's
// profile.
//$_configuration['show_language_selector_in_menu'] = false;
// When using the my-courses list filter by category, set this option to true
// to only show courses in the user's configured language
// $_configuration['my_courses_show_courses_in_user_language_only'] = false;

@ -149,7 +149,15 @@ class LegacyListener
$languageList[languageToCountryIsoCode($isoCode)] = $language;
}
$twig->addGlobal('current_locale_iso', languageToCountryIsoCode($request->getLocale()));
$isoFixed = languageToCountryIsoCode($request->getLocale());
$twig->addGlobal(
'current_locale_info',
[
'iso' => $isoFixed,
'text' => $languageList[$isoFixed],
]
);
$twig->addGlobal('available_locales', $languages);
$twig->addGlobal('show_toolbar', \Template::isToolBarDisplayedForUser() ? 1 : 0);

@ -1,125 +0,0 @@
<?php
/* For licensing terms, see /license.txt */
namespace Chamilo\CoreBundle\EventListener;
use Chamilo\UserBundle\Entity\User;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
/**
* Class LegacyLoginListener.
* File not needed the real listener is LegacyListener.
*
* @deprecated use LegacyListener
*
* @package Chamilo\CoreBundle\EventListener
*/
class LegacyLoginListener implements EventSubscriberInterface
{
/** @var ContainerInterface */
protected $container;
protected $tokenStorage;
/**
* LegacyLoginListener constructor.
*
* @param ContainerInterface $container
* @param TokenStorageInterface $tokenStorage
*/
public function __construct(ContainerInterface $container, TokenStorageInterface $tokenStorage)
{
$this->container = $container;
$this->tokenStorage = $tokenStorage;
}
/**
* @param GetResponseEvent $event
*/
public function onKernelRequest(GetResponseEvent $event)
{
$request = $event->getRequest();
if (!$request->hasPreviousSession()) {
return;
}
$container = $this->container;
$token = $this->tokenStorage->getToken();
if ($token) {
$isGranted = $container->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY');
if ($isGranted) {
} else {
if (isset($_SESSION) && isset($_SESSION['_user'])) {
if ($_SESSION['_user']['active'] == 1) {
$username = $_SESSION['_user']['username'];
$criteria = ['username' => $username];
/** @var User $user */
$user = $container->get('fos_user.user_manager')->findOneBy($criteria);
if ($user) {
$em = $container->get('doctrine');
/** @var User $completeUser */
$completeUser = $em->getRepository('ChamiloUserBundle:User')->findOneBy($criteria);
$user->setLanguage($completeUser->getLanguage());
$isAdminUser = $em->getRepository('ChamiloCoreBundle:Admin')->findOneBy(['userId' => $user->getId()]);
if ($isAdminUser) {
$user->setSuperAdmin(true);
}
$languages = ['german' => 'de', 'english' => 'en', 'spanish' => 'es', 'french' => 'fr'];
$locale = isset($languages[$user->getLanguage()]) ? $languages[$user->getLanguage()] : '';
if ($user && !empty($locale)) {
$user->setLocale($locale);
//$request->getSession()->set('_locale_user', $locale);
// if no explicit locale has been set on this request, use one from the session
$request->getSession()->set('_locale', $locale);
$request->setLocale($locale);
}
$token = new UsernamePasswordToken($user, null, 'admin', $user->getRoles());
$this->tokenStorage->setToken($token); //now the user is logged in
//now dispatch the login event
$event = new InteractiveLoginEvent($request, $token);
$container->get('event_dispatcher')->dispatch("security.interactive_login", $event);
$container->get('event_dispatcher')->addListener(
KernelEvents::RESPONSE,
[$this, 'redirectUser']
);
}
}
}
}
}
}
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
// must be registered before the default Locale listener
KernelEvents::REQUEST => [['onKernelRequest', 15]],
];
}
/**
* @param FilterResponseEvent $event
*/
public function redirectUser(FilterResponseEvent $event)
{
$uri = $event->getRequest()->getUri();
// on effectue la redirection
$response = new RedirectResponse($uri);
$event->setResponse($response);
}
}

@ -60,20 +60,24 @@ class LocaleListener implements EventSubscriberInterface
if ($locale = $request->attributes->get('_locale')) {
$request->getSession()->set('_locale', $locale);
} else {
$localeList = [];
// 1. Check platform locale
/** @var SettingsManager $settings */
$settings = $this->container->get('chamilo.settings.manager');
$platformLocale = $settings->getSetting('language.platform_language');
if (!empty($platformLocale)) {
$locale = $platformLocale;
$localeList['platform_lang'] = $platformLocale;
//$locale = $platformLocale;
}
// 2. Check user locale
// _locale_user is set when user logins the system check UserLocaleListener
$userLocale = $request->getSession()->get('_locale_user');
if (!empty($userLocale)) {
$locale = $userLocale;
//$locale = $userLocale;
$localeList['user_profil_lang'] = $platformLocale;
}
// 3. Check course locale
@ -96,7 +100,8 @@ class LocaleListener implements EventSubscriberInterface
if (!empty($course)) {
$courseLocale = $course->getCourseLanguage();
if (!empty($courseLocale)) {
$locale = $courseLocale;
//$locale = $courseLocale;
$localeList['course_lang'] = $platformLocale;
}
}
}
@ -104,7 +109,38 @@ class LocaleListener implements EventSubscriberInterface
// 4. force locale if it was selected from the URL
$localeFromUrl = $request->get('_locale');
if (!empty($localeFromUrl)) {
$locale = $localeFromUrl;
//$locale = $localeFromUrl;
$localeList['user_selected_lang'] = $platformLocale;
}
$priorityList = [
'language_priority_4',
'language_priority_3',
'language_priority_2',
'language_priority_1',
];
$locale = '';
foreach ($priorityList as $setting) {
$priority = $settings->getSetting("language.$setting");
if (!empty($priority) && isset($localeList[$priority])) {
$locale = $localeList[$priority];
}
}
if (empty($locale)) {
// Use default order
$priorityList = [
'platform_lang',
'user_profil_lang',
'course_lang',
'user_selected_lang',
];
foreach ($priorityList as $setting) {
if (isset($localeList[$setting])) {
$locale = $localeList[$setting];
}
}
}
// if no explicit locale has been set on this request, use one from the session

@ -1,28 +1,29 @@
{% if chamilo_settings_get('language.show_language_selector_in_menu') == 'true' %}
{% autoescape false %}
<div class="btn-group" role="group">
<button
type="button"
class="btn btn-secondary dropdown-toggle"
class="btn btn-default dropdown-toggle"
data-toggle="dropdown"
aria-haspopup="true"
aria-expanded="false"
>
<span class="flag-icon flag-icon-{{ current_locale_iso }}"></span>
{{ current_locale_iso }}
<span class="flag-icon flag-icon-{{ current_locale_info.iso }}"></span>
{{ current_locale_info.text }}
<span class="caret">
</span>
</button>
<div class="dropdown-menu" role="menu">
{% autoescape false %}
{% for index, locale in available_locales %}
<a class="dropdown-item" href="{{ app.request.attributes.get('_route') }}?_locale={{ index }}">
<span class="flag-icon flag-icon-{{ index }}"></span>
{{ locale }}
</a>
{% endfor %}
{% endautoescape %}
{% for index, locale in available_locales %}
<a class="dropdown-item" href="{{ app.request.attributes.get('_route') }}?_locale={{ index }}">
<span class="flag-icon flag-icon-{{ index }}"></span>
{{ locale }}
</a>
{% endfor %}
</div>
</div>
{% endautoescape %}
{% endif %}
{#<div class="dropdown">#}
{#<button type="button" id="dropdownMenu1" data-toggle="dropdown"#}

@ -5,6 +5,7 @@ namespace Chamilo\CoreBundle\Settings;
use Chamilo\CoreBundle\Form\Type\YesNoType;
use Sylius\Bundle\SettingsBundle\Schema\SettingsBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormBuilderInterface;
/**
@ -31,6 +32,7 @@ class LanguageSettingsSchema extends AbstractSettingsSchema
'language_priority_3' => '',
'language_priority_4' => '',
'hide_dltt_markup' => 'false',
'show_language_selector_in_menu' => 'true'
]
);
@ -48,16 +50,25 @@ class LanguageSettingsSchema extends AbstractSettingsSchema
*/
public function buildForm(FormBuilderInterface $builder)
{
$choices = [
'' => '',
'PlatformLanguage' => 'platform_lang', // default platform language
'UserLanguage' => 'user_profil_lang', // profile language of current user
'UserSelectedLanguage' => 'user_selected_lang', // language selected by user at login
'CourseLanguage' => 'course_lang', // language of the current course
];
$builder
->add('platform_language', 'language')
->add('allow_use_sub_language', YesNoType::class)
->add('auto_detect_language_custom_pages', YesNoType::class)
->add('show_different_course_language', YesNoType::class)
->add('language_priority_1')
->add('language_priority_2')
->add('language_priority_3')
->add('language_priority_4')
->add('language_priority_1', ChoiceType::class, ['choices' => $choices])
->add('language_priority_2', ChoiceType::class, ['choices' => $choices])
->add('language_priority_3', ChoiceType::class, ['choices' => $choices])
->add('language_priority_4', ChoiceType::class, ['choices' => $choices])
->add('hide_dltt_markup')
->add('show_language_selector_in_menu', YesNoType::class)
;
}
}

@ -1,25 +1,5 @@
{{ locale_switcher(null, null, 'ChamiloCoreBundle:Admin:switcher_links.html.twig') }}
{#<div class="btn-group">#}
{#<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">#}
{#<span class="flag-icon flag-icon-{{ current_locale_iso }}"></span>#}
{#{{ current_locale_iso }}#}
{#<span class="caret">#}
{#</span>#}
{#</button>#}
{#<ul class="dropdown-menu" role="menu">#}
{#{% autoescape false %}#}
{#{% for index, locale in available_locales %}#}
{#<li>#}
{#<a href="{{ app.request.attributes.get('_route') }}?_locale={{ index }}">#}
{#<span class="flag-icon flag-icon-{{ index }}"></span>#}
{#{{ locale }}#}
{#</a>#}
{#</li>#}
{#{% endfor %}#}
{#{% endautoescape %}#}
{#</ul>#}
{#</div>#}
<form action="{{ path("fos_user_security_check") }}" method="post" name="formLogin" id="formLogin">
<input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}"/>
<fieldset>

Loading…
Cancel
Save