From ece1d3a1b3390f651d893a541e72dc8375014da4 Mon Sep 17 00:00:00 2001 From: Julio Montoya Date: Mon, 6 Aug 2018 15:50:50 +0200 Subject: [PATCH] Minor - partial merge from 1.11.x --- .../access_url_edit_usergroup_to_url.php | 1 + main/admin/add_courses_to_usergroup.php | 25 +- main/admin/add_drh_to_user.php | 2 +- main/admin/add_sessions_to_usergroup.php | 66 +- main/admin/add_users_to_usergroup.php | 27 +- main/admin/archive_cleanup.php | 21 +- main/admin/course_edit.php | 52 +- main/admin/course_intro_pdf_import.php | 2 +- main/admin/index.php | 24 +- main/admin/legal_list.php | 22 +- main/admin/settings.lib.php | 3 +- main/admin/special_exports.php | 6 +- main/admin/sub_language.php | 2 +- main/admin/teacher_time_report.php | 2 +- main/admin/user_edit.php | 21 +- main/admin/user_information.php | 4 +- main/admin/user_list.php | 153 +- main/admin/user_list_consent.php | 662 ++++++++ main/admin/user_move_stats.php | 4 +- main/admin/usergroup_export.php | 8 +- main/admin/usergroup_import.php | 10 +- main/admin/usergroup_user_import.php | 11 +- main/admin/usergroup_users.php | 321 ++++ main/admin/usergroups.php | 281 ++-- main/announcements/announcements.php | 29 +- .../conditional_login/conditional_login.php | 1 + main/auth/courses.php | 16 +- main/course_info/about.php | 173 +++ ...MultipleAnswerTrueFalseDegreeCertainty.php | 1329 +++++++++++++++++ .../export/scorm/ScormAnswerFillInBlanks.php | 80 + .../export/scorm/ScormAnswerMatching.php | 100 ++ .../scorm/ScormAnswerMultipleChoice.php | 119 ++ .../export/scorm/ScormAnswerTrueFalse.php | 56 + .../export/scorm/ScormAssessmentItem.php | 184 +++ main/exercise/export/scorm/ScormExercise.php | 221 +++ main/exercise/export/scorm/ScormQuestion.php | 223 +++ main/exercise/export/scorm/common.js | 25 + main/exercise/export/scorm/scorm_classes.php | 1067 +------------ main/inc/ajax/usergroup.ajax.php | 27 + main/inc/lib/hook/HookCreateCourse.php | 37 + .../HookCreateCourseEventInterface.php | 23 + .../HookCreateCourseObserverInterface.php | 21 + main/inc/lib/javascript/pear/qfamsHandler.js | 553 ------- main/lang/brazilian/trad4all.inc.php | 128 +- main/lang/dutch/trad4all.inc.php | 2 +- main/lang/english/trad4all.inc.php | 179 ++- main/lang/french/trad4all.inc.php | 220 ++- main/lang/german/trad4all.inc.php | 11 +- main/lang/italian/trad4all.inc.php | 1 + main/lang/spanish/trad4all.inc.php | 181 ++- main/social/personal_data.php | 397 +++++ main/social/terms.php | 52 + 52 files changed, 5181 insertions(+), 2004 deletions(-) create mode 100644 main/admin/user_list_consent.php create mode 100644 main/admin/usergroup_users.php create mode 100644 main/course_info/about.php create mode 100644 main/exercise/MultipleAnswerTrueFalseDegreeCertainty.php create mode 100644 main/exercise/export/scorm/ScormAnswerFillInBlanks.php create mode 100644 main/exercise/export/scorm/ScormAnswerMatching.php create mode 100644 main/exercise/export/scorm/ScormAnswerMultipleChoice.php create mode 100644 main/exercise/export/scorm/ScormAnswerTrueFalse.php create mode 100644 main/exercise/export/scorm/ScormAssessmentItem.php create mode 100644 main/exercise/export/scorm/ScormExercise.php create mode 100644 main/exercise/export/scorm/ScormQuestion.php create mode 100644 main/exercise/export/scorm/common.js create mode 100644 main/inc/ajax/usergroup.ajax.php create mode 100644 main/inc/lib/hook/HookCreateCourse.php create mode 100644 main/inc/lib/hook/interfaces/HookCreateCourseEventInterface.php create mode 100644 main/inc/lib/hook/interfaces/HookCreateCourseObserverInterface.php delete mode 100755 main/inc/lib/javascript/pear/qfamsHandler.js create mode 100644 main/social/personal_data.php create mode 100644 main/social/terms.php diff --git a/main/admin/access_url_edit_usergroup_to_url.php b/main/admin/access_url_edit_usergroup_to_url.php index 4b212f65cf..8fcbc2be79 100755 --- a/main/admin/access_url_edit_usergroup_to_url.php +++ b/main/admin/access_url_edit_usergroup_to_url.php @@ -1,5 +1,6 @@ get($id); +$usergroup->protectScript($data); + $xajax = new xajax(); $xajax->registerFunction('search'); @@ -17,9 +22,6 @@ $xajax->registerFunction('search'); $this_section = SECTION_PLATFORM_ADMIN; // Access restrictions. -api_protect_admin_script(true); - -// Setting breadcrumbs. $interbreadcrumb[] = ['url' => 'index.php', 'name' => get_lang('PlatformAdmin')]; $interbreadcrumb[] = ['url' => 'usergroups.php', 'name' => get_lang('Classes')]; @@ -48,8 +50,6 @@ function remove_item(origin) { $form_sent = 0; $errorMsg = ''; $sessions = []; -$usergroup = new UserGroup(); -$id = intval($_GET['id']); if (isset($_POST['form_sent']) && $_POST['form_sent']) { $form_sent = $_POST['form_sent']; @@ -97,8 +97,17 @@ if (!empty($filters) && !empty($filterData)) { } } -$data = $usergroup->get($id); $course_list_in = $usergroup->get_courses_by_usergroup($id, true); + +$onlyThisCourseList = []; +if ($usergroup->allowTeachers()) { + $userId = api_get_user_id(); + $courseList = CourseManager::getCoursesFollowedByUser($userId, COURSEMANAGER); + if (!empty($courseList)) { + $onlyThisCourseList = array_column($courseList, 'id'); + } +} + $course_list = CourseManager::get_courses_list( 0, 0, @@ -108,11 +117,11 @@ $course_list = CourseManager::get_courses_list( null, api_get_current_access_url_id(), false, - $conditions + $conditions, + $onlyThisCourseList ); $elements_not_in = $elements_in = []; - foreach ($course_list_in as $course) { $elements_in[$course['id']] = $course['title']." (".$course['visual_code'].")"; } diff --git a/main/admin/add_drh_to_user.php b/main/admin/add_drh_to_user.php index d78fe82d55..3db1d058bc 100644 --- a/main/admin/add_drh_to_user.php +++ b/main/admin/add_drh_to_user.php @@ -15,7 +15,7 @@ if (!isset($_REQUEST['u'])) { } $em = Database::getManager(); -$userRepository = $em->getRepository('ChamiloUserBundle:User'); +$userRepository = UserManager::getRepository(); /** @var UserEntity $user */ $user = UserManager::getManager()->find($_REQUEST['u']); diff --git a/main/admin/add_sessions_to_usergroup.php b/main/admin/add_sessions_to_usergroup.php index eee8a68586..de9e2c738b 100755 --- a/main/admin/add_sessions_to_usergroup.php +++ b/main/admin/add_sessions_to_usergroup.php @@ -9,6 +9,11 @@ $cidReset = true; // including some necessary files require_once __DIR__.'/../inc/global.inc.php'; +$id = isset($_REQUEST['id']) ? (int) $_REQUEST['id'] : 0; +$usergroup = new UserGroup(); +$data = $usergroup->get($id); +$usergroup->protectScript($data); + $xajax = new xajax(); //$xajax->debugOn(); @@ -17,15 +22,13 @@ $xajax->registerFunction('search_usergroup_sessions'); // setting the section (for the tabs) $this_section = SECTION_PLATFORM_ADMIN; -// Access restrictions +// setting breadcrumbs api_protect_admin_script(true); // setting breadcrumbs $interbreadcrumb[] = ['url' => 'index.php', 'name' => get_lang('PlatformAdmin')]; $interbreadcrumb[] = ['url' => 'usergroups.php', 'name' => get_lang('Classes')]; -// Database Table Definitions - // setting the name of the tool $tool_name = get_lang('SubscribeClassToSessions'); @@ -37,18 +40,14 @@ if (isset($_REQUEST['add_type']) && $_REQUEST['add_type'] != '') { $htmlHeadXtra[] = $xajax->getJavascript('../inc/lib/xajax/'); $htmlHeadXtra[] = ''; +// Freeze user conditions, admin cannot updated them +$extraConditions = api_get_configuration_value('show_conditions_to_user'); + +if ($extraConditions && isset($extraConditions['conditions'])) { + $extraConditions = $extraConditions['conditions']; + foreach ($extraConditions as $condition) { + /** @var HTML_QuickForm_group $element */ + $element = $form->getElement('extra_'.$condition['variable']); + if ($element) { + $element->freeze(); + } + } +} + // Submit button $form->addButtonSave(get_lang('Save')); @@ -373,7 +388,7 @@ if ($form->validate()) { $picture_uri = $user_data['picture_uri']; if (isset($user['delete_picture']) && $user['delete_picture']) { - $picture_uri = UserManager::delete_user_picture($user_id); + $picture_uri = UserManager::deleteUserPicture($user_id); } elseif (!empty($picture['name'])) { $picture_uri = UserManager::update_user_picture( $user_id, diff --git a/main/admin/user_information.php b/main/admin/user_information.php index 9a8499ed42..4863236ece 100755 --- a/main/admin/user_information.php +++ b/main/admin/user_information.php @@ -197,7 +197,7 @@ if (api_get_setting('allow_terms_conditions') === 'true') { 'legal_accept' ); $icon = Display::return_icon('accept_na.png'); - if (isset($value['value'])) { + if (!empty($value['value'])) { list($legalId, $legalLanguageId, $legalTime) = explode(':', $value['value']); $icon = Display::return_icon('accept.png').' '.api_get_local_time($legalTime); $icon .= ' '.Display::url( @@ -621,7 +621,7 @@ if ($studentBossList) { } $em = Database::getManager(); -$userRepository = $em->getRepository('ChamiloUserBundle:User'); +$userRepository = UserManager::getRepository(); $hrmList = $userRepository->getAssignedHrmUserList( $userEntity->getId(), diff --git a/main/admin/user_list.php b/main/admin/user_list.php index d6145bf894..2497b0441a 100755 --- a/main/admin/user_list.php +++ b/main/admin/user_list.php @@ -46,12 +46,6 @@ if (isset($_GET['user_id']) && $action == 'login_as') { api_protect_admin_script(true); -// Blocks the possibility to delete a user -$deleteUserAvailable = true; -if (api_get_configuration_value('deny_delete_users')) { - $deleteUserAvailable = false; -} - trimVariables(); $url = api_get_path(WEB_AJAX_PATH).'course.ajax.php?a=get_user_courses'; @@ -76,7 +70,7 @@ $htmlHeadXtra[] = ' + + + +showGroupTypeSetting = true; +// Action handling: Adding a note +if ($action === 'delete' && is_numeric($_GET['id'])) { + $res = $usergroup->delete_user_rel_group($_GET['user_id'], $_GET['id']); + Display::addFlash(Display::return_message(get_lang('Deleted'), 'confirmation')); + header('Location: '.api_get_self().'?id='.$id); + exit; +} else { + $usergroup->displayToolBarUserGroupUsers(); +} + +Display::display_footer(); diff --git a/main/admin/usergroups.php b/main/admin/usergroups.php index 2fba67866a..d8ad129463 100755 --- a/main/admin/usergroups.php +++ b/main/admin/usergroups.php @@ -5,15 +5,17 @@ * @package chamilo.admin */ $cidReset = true; + require_once __DIR__.'/../inc/global.inc.php'; $this_section = SECTION_PLATFORM_ADMIN; -api_protect_admin_script(true); -api_protect_limit_for_session_admin(); -//Add the JS needed to use the jqgrid +$usergroup = new UserGroup(); +$usergroup->protectScript(); + +// Add the JS needed to use the jqgrid $htmlHeadXtra[] = api_get_jqgrid_js(); -// setting breadcrumbs + $interbreadcrumb[] = ['url' => 'index.php', 'name' => get_lang('PlatformAdmin')]; $action = isset($_GET['action']) ? Security::remove_XSS($_GET['action']) : null; if ($action == 'add') { @@ -25,22 +27,11 @@ if ($action == 'add') { } else { $interbreadcrumb[] = ['url' => '#', 'name' => get_lang('Classes')]; } - -// The header. -Display::display_header(); - -// Tool name -if ($action == 'add') { - $tool = 'Add'; - $interbreadcrumb[] = ['url' => api_get_self(), 'name' => get_lang('Group')]; -} -if ($action == 'edit') { - $tool = 'Modify'; - $interbreadcrumb[] = ['url' => api_get_self(), 'name' => get_lang('Group')]; -} +// setting breadcrumbs +$action = isset($_GET['action']) ? Security::remove_XSS($_GET['action']) : ''; +$userGroupId = isset($_GET['id']) ? (int) $_GET['id'] : 0; // jqgrid will use this URL to do the selects - $url = api_get_path(WEB_AJAX_PATH).'model.ajax.php?a=get_usergroups'; //The order is important you need to check the the $column variable in the model.ajax.php file @@ -60,16 +51,23 @@ $column_model = [ ['name' => 'courses', 'index' => 'courses', 'width' => '15', 'align' => 'left'], ['name' => 'sessions', 'index' => 'sessions', 'width' => '15', 'align' => 'left'], ['name' => 'group_type', 'index' => 'group_type', 'width' => '15', 'align' => 'center'], - ['name' => 'actions', 'index' => 'actions', 'width' => '20', 'align' => 'center', 'sortable' => 'false', 'formatter' => 'action_formatter'], + [ + 'name' => 'actions', + 'index' => 'actions', + 'width' => '20', + 'align' => 'center', + 'sortable' => 'false', + 'formatter' => 'action_formatter', + ], ]; -//Autowidth +// Autowidth $extra_params['autowidth'] = 'true'; -//height auto +// Height auto $extra_params['height'] = 'auto'; $extra_params['sortname'] = 'name'; $extra_params['sortorder'] = 'desc'; -//With this function we can add actions to the jgrid +// With this function we can add actions to the jgrid $action_links = 'function action_formatter (cellvalue, options, rowObject) { return \'' .' '.Display::return_icon('user_to_class.png', get_lang('SubscribeUsersToClass'), null, ICON_SIZE_MEDIUM).'' @@ -79,118 +77,141 @@ $action_links = 'function action_formatter (cellvalue, options, rowObject) { .' '.Display::return_icon('delete.png', get_lang('Delete'), null, ICON_SIZE_SMALL).'\'; }'; -?> - -showGroupTypeSetting = true; +$content = ''; + // Action handling: Adding a note -if ($action == 'add') { - if (api_get_session_id() != 0 && !api_is_allowed_to_session_edit(false, true)) { - api_not_allowed(); - } - - $form = new FormValidator( - 'usergroup', - 'post', - api_get_self().'?action='.$action - ); - $usergroup->setForm($form, 'add'); - - // Setting the defaults - $form->setDefaults(['visibility' => 2]); - - // The validation or display - if ($form->validate()) { - $values = $form->exportValues(); - $res = $usergroup->save($values); - if ($res) { - echo Display::return_message(get_lang('ItemAdded'), 'confirmation'); - } else { - echo Display::return_message( - Security::remove_XSS($values['name']).': '. - get_lang('AlreadyExists'), - 'warning' - ); - } +switch ($action) { + case 'add': + $interbreadcrumb[] = ['url' => 'usergroups.php', 'name' => get_lang('Classes')]; + $interbreadcrumb[] = ['url' => '#', 'name' => get_lang('Add')]; - $usergroup->display(); - } else { - echo '
'; - echo ''. + if (api_get_session_id() != 0 && !api_is_allowed_to_session_edit(false, true)) { + api_not_allowed(); + } + $form = new FormValidator( + 'usergroup', + 'post', + api_get_self().'?action='.$action + ); + $usergroup->setForm($form, 'add'); + + // Setting the defaults + $form->setDefaults(['visibility' => 2]); + + // The validation or display + if ($form->validate()) { + $values = $form->exportValues(); + $res = $usergroup->save($values); + if ($res) { + Display::addFlash(Display::return_message(get_lang('ItemAdded'), 'confirmation')); + } else { + Display::addFlash(Display::return_message( + Security::remove_XSS($values['name']).': '. + get_lang('AlreadyExists'), + 'warning' + )); + } + header('Location: '.api_get_self()); + exit; + } else { + $content .= ''; - $token = Security::get_token(); - $form->addElement('hidden', 'sec_token'); - $form->setConstants(['sec_token' => $token]); - $form->display(); - } -} elseif ($action == 'edit' && is_numeric($_GET['id'])) { - $id = intval($_GET['id']); - $form = new FormValidator( - 'usergroup', - 'post', - api_get_self().'?action='.$action.'&id='.$id - ); - $defaults = $usergroup->get($id); - $usergroup->setForm($form, 'edit', $defaults); - - // Setting the form elements - $form->addElement('hidden', 'id', $id); - - // Setting the defaults - $form->setDefaults($defaults); - - // The validation or display. - if ($form->validate()) { - $values = $form->getSubmitValues(); - $res = $usergroup->update($values); - if ($res) { - echo Display::return_message(get_lang('Updated'), 'confirmation'); + $content .= '
'; + $token = Security::get_token(); + $form->addElement('hidden', 'sec_token'); + $form->setConstants(['sec_token' => $token]); + $content .= $form->returnForm(); + } + break; + case 'edit': + $interbreadcrumb[] = ['url' => 'usergroups.php', 'name' => get_lang('Classes')]; + $interbreadcrumb[] = ['url' => '#', 'name' => get_lang('Edit')]; + + $defaults = $usergroup->get($userGroupId); + $usergroup->protectScript($defaults); + + $form = new FormValidator( + 'usergroup', + 'post', + api_get_self().'?action='.$action.'&id='.$userGroupId + ); + + $usergroup->setForm($form, 'edit', $defaults); + + // Setting the form elements + $form->addElement('hidden', 'id', $userGroupId); + + // Setting the defaults + $form->setDefaults($defaults); + + // The validation or display. + if ($form->validate()) { + $values = $form->getSubmitValues(); + $res = $usergroup->update($values); + if ($res) { + Display::addFlash(Display::return_message(get_lang('Updated'), 'confirmation')); + } else { + Display::addFlash(Display::return_message( + Security::remove_XSS($values['name']).': '. + get_lang('AlreadyExists'), + 'warning' + )); + } + header('Location: '.api_get_self()); + exit; } else { - echo Display::return_message( - Security::remove_XSS($values['name']).': '. - get_lang('AlreadyExists'), - 'warning' - ); + $content .= '
'; + $content .= ''.Display::return_icon( + 'back.png', + get_lang('Back'), + '', + ICON_SIZE_MEDIUM + ).''; + $content .= '
'; + $content .= $form->returnForm(); } - - $usergroup->display(); - } else { - echo '
'; - echo ''.Display::return_icon( - 'back.png', - get_lang('Back'), - '', - ICON_SIZE_MEDIUM - ).''; - echo '
'; - $form->display(); - } -} elseif ($action == 'delete' && is_numeric($_GET['id'])) { - $res = $usergroup->delete($_GET['id']); - if ($res) { - echo Display::return_message(get_lang('Deleted'), 'confirmation'); - } - $usergroup->display(); -} else { - $usergroup->display(); + break; + case 'delete': + $defaults = $usergroup->get($userGroupId); + $usergroup->protectScript($defaults); + $res = $usergroup->delete($userGroupId); + if ($res) { + Display::addFlash(Display::return_message(get_lang('Deleted'), 'confirmation')); + } + header('Location: '.api_get_self()); + exit; + break; + default: + $interbreadcrumb[] = ['url' => '#', 'name' => get_lang('Classes')]; + $content = $usergroup->returnGrid(); + break; } -Display :: display_footer(); + +// The header. +Display::display_header(); + +?> + + 'multipart/form-data'] ); + $form_name = get_lang('ModifyAnnouncement'); if (empty($id)) { $form_name = get_lang('AddAnnouncement'); - } else { - $form_name = get_lang('ModifyAnnouncement'); } - $interbreadcrumb[] = [ - "url" => api_get_path(WEB_CODE_PATH)."announcements/announcements.php?".api_get_cidreq(), - "name" => $nameTools, + 'url' => api_get_path(WEB_CODE_PATH).'announcements/announcements.php?'.api_get_cidreq(), + 'name' => $nameTools, ]; $nameTools = $form_name; @@ -428,7 +422,7 @@ switch ($action) { } elseif (isset($_GET['remindallinactives']) && $_GET['remindallinactives'] === 'true') { // we want to remind inactive users. The $_GET['since'] parameter // determines which users have to be warned (i.e the users who have been inactive for x days or more - $since = isset($_GET['since']) ? intval($_GET['since']) : 6; + $since = isset($_GET['since']) ? (int) $_GET['since'] : 6; // Getting the users who have to be reminded $to = Tracking::getInactiveStudentsInCourse( @@ -479,10 +473,8 @@ switch ($action) { } $announcementInfo = AnnouncementManager::get_by_id($courseId, $id); - if (isset($announcementInfo) && !empty($announcementInfo)) { $to = AnnouncementManager::load_edit_users('announcement', $id); - $defaults = [ 'title' => $announcementInfo['title'], 'content' => $announcementInfo['content'], @@ -503,7 +495,6 @@ switch ($action) { if (!isset($parts[1]) || empty($parts[1])) { continue; } - $form->addHtml(" '; +// if ($this->standalone) { +// return ''; + }*/ + + return ''; + } + + /** + * Start the itemBody. + */ + public function start_body() + { + /*if ($this->standalone) { + return '
'; + }*/ + + return ''; + } + + /** + * End the itemBody part. + */ + public function end_body() + { + /*if ($this->standalone) { + return '
'; + }*/ + + return ''; + } + + /** + * Export the question as a SCORM Item. + * This is a default behaviour, some classes may want to override this. + * + * @return string|array a string, the XML flow for an Item + */ + public function export() + { + list($js, $html) = $this->question->export(); + /*if ($this->standalone) { + $res = $this->start_page() + .$this->start_header() + .$this->css() + .$this->start_js() + .$this->common_js() + .$js + .$this->end_js() + .$this->end_header() + .$this->start_body() + .$html + .$this->end_body() + .$this->end_page(); + + return $res; + } else { + return [$js, $html]; + }*/ + return [$js, $html]; + } +} diff --git a/main/exercise/export/scorm/ScormExercise.php b/main/exercise/export/scorm/ScormExercise.php new file mode 100644 index 0000000000..e3411bfdb8 --- /dev/null +++ b/main/exercise/export/scorm/ScormExercise.php @@ -0,0 +1,221 @@ + containing several . + * + * Some properties cannot be exported, as SCORM does not support them : + * - type (one page or multiple pages) + * - start_date and end_date + * - max_attempts + * - show_answer + * - anonymous_attempts + * + * @author Julio Montoya + * @author Amand Tihon + * + * @package chamilo.exercise.scorm + */ +class ScormExercise +{ + public $exercise; + public $standalone; + + /** + * ScormExercise constructor. + * + * @param Exercise $exe + * @param bool $standalone + */ + public function __construct($exe, $standalone) + { + $this->exercise = $exe; + $this->standalone = $standalone; + } + + /** + * Start the XML flow. + * + * This opens the block, with correct attributes. + */ + public function startPage() + { + $charset = 'UTF-8'; + $head = ''; + + return $head; + } + + /** + * End the XML flow, closing the tag. + */ + public function end_page() + { + return ''; + } + + /** + * Start document header. + */ + public function start_header() + { + return ''; + } + + /** + * Common JS functions. + */ + public function common_js() + { + $js = file_get_contents(api_get_path(SYS_CODE_PATH).'exercise/export/scorm/common.js'); + + return $js."\n"; + } + + /** + * End the itemBody part. + */ + public function end_js() + { + return ''; + } + + /** + * Start the itemBody. + */ + public function start_body() + { + return ''. + '

'.$this->exercise->selectTitle().'

'.$this->exercise->selectDescription()."

". + '
'. + ''; + } + + /** + * End the itemBody part. + */ + public function end_body() + { + $button = ''; + + return '

'.$button.'
'; + } + + /** + * Export the question as a SCORM Item. + * + * This is a default behaviour, some classes may want to override this. + * + * @param $standalone: Boolean stating if it should be exported as a stand-alone question + * + * @return string string, the XML flow for an Item + */ + public function export() + { + global $charset; + + /*$head = ''; + if ($this->standalone) { + $head = ''."\n" + .''."\n"; + }*/ + + list($js, $html) = $this->exportQuestions(); + $res = $this->startPage() + .$this->start_header() + .$this->css() + .$this->globalAssets() + .$this->start_js() + .$this->common_js() + .$js + .$this->end_js() + .$this->end_header() + .$this->start_body() + .$html + .$this->end_body() + .$this->end_page(); + + return $res; + } + + /** + * Export the questions, as a succession of . + * + * @author Amand Tihon + */ + public function exportQuestions() + { + $js = $html = ''; + $encoders = [new JsonEncoder()]; + $normalizers = [new ObjectNormalizer()]; + + $em = Database::getManager(); + // Export cquiz data + /** @var CQuiz $exercise */ + $exercise = $em->find('ChamiloCourseBundle:CQuiz', $this->exercise->iId); + $exercise->setDescription(''); + $exercise->setTextWhenFinished(''); + + $serializer = new Serializer($normalizers, $encoders); + $jsonContent = $serializer->serialize($exercise, 'json'); + $js .= "var exerciseInfo = JSON.parse('".$jsonContent."');\n"; + + $counter = 0; + $scormQuestion = new ScormQuestion(); + foreach ($this->exercise->selectQuestionList() as $q) { + list($jstmp, $htmltmp) = $scormQuestion->exportQuestionToScorm($q, $counter); + $js .= $jstmp."\n"; + $html .= $htmltmp."\n"; + $counter++; + } + + return [$js, $html]; + } + + /** + * Print CSS inclusion. + */ + private function css() + { + return ''; + } + + /** + * End document header. + */ + private function end_header() + { + return ''; + } + + /** + * Start the itemBody. + */ + private function start_js() + { + return ''."\n"; + $assets .= ''."\n"; + $assets .= ''; + + return $assets; + } +} diff --git a/main/exercise/export/scorm/ScormQuestion.php b/main/exercise/export/scorm/ScormQuestion.php new file mode 100644 index 0000000000..60a8c003d3 --- /dev/null +++ b/main/exercise/export/scorm/ScormQuestion.php @@ -0,0 +1,223 @@ + + * @author Yannick Warnier + * + * @package chamilo.exercise.scorm + */ +class ScormQuestion extends Question +{ + public $js_id; + public $answer; + + /** + * ScormQuestion constructor. + */ + public function __construct() + { + parent::__construct(); + } + + /** + * Returns the HTML + JS flow corresponding to one question. + * + * @param int $questionId The question ID + * @param bool $standalone (ie including XML tag, DTD declaration, etc) + * @param int $jsId The JavaScript ID for this question. + * Due to the nature of interactions, we must have a natural sequence for + * questions in the generated JavaScript. + * + * @return string|array + */ + public function exportQuestionToScorm( + $questionId, + $jsId + ) { + $question = self::read($questionId); + if (!$question) { + return ''; + } + $this->id = $question->id; + $this->js_id = $jsId; + $this->type = $question->type; + $this->question = $question->question; + $this->description = $question->description; + $this->weighting = $question->weighting; + $this->position = $question->position; + $this->picture = $question->picture; + $assessmentItem = new ScormAssessmentItem($this); + + return $assessmentItem->export(); + } + + /** + * Include the correct answer class and create answer. + */ + public function setAnswer() + { + switch ($this->type) { + case MCUA: + $this->answer = new ScormAnswerMultipleChoice($this->id); + $this->answer->questionJSId = $this->js_id; + break; + case MCMA: + case GLOBAL_MULTIPLE_ANSWER: + $this->answer = new ScormAnswerMultipleChoice($this->id); + $this->answer->questionJSId = $this->js_id; + break; + case TF: + $this->answer = new ScormAnswerTrueFalse($this->id); + $this->answer->questionJSId = $this->js_id; + break; + case FIB: + $this->answer = new ScormAnswerFillInBlanks($this->id); + $this->answer->questionJSId = $this->js_id; + break; + case MATCHING: + case MATCHING_DRAGGABLE: + case DRAGGABLE: + $this->answer = new ScormAnswerMatching($this->id); + $this->answer->questionJSId = $this->js_id; + break; + case ORAL_EXPRESSION: + case FREE_ANSWER: + $this->answer = new ScormAnswerFree($this->id); + $this->answer->questionJSId = $this->js_id; + break; + case HOT_SPOT: + $this->answer = new ScormAnswerHotspot($this->id); + $this->answer->questionJSId = $this->js_id; + break; + case MULTIPLE_ANSWER_COMBINATION: + $this->answer = new ScormAnswerMultipleChoice($this->id); + $this->answer->questionJSId = $this->js_id; + break; + case HOT_SPOT_ORDER: + $this->answer = new ScormAnswerHotspot($this->id); + $this->answer->questionJSId = $this->js_id; + break; + case HOT_SPOT_DELINEATION: + $this->answer = new ScormAnswerHotspot($this->id); + $this->answer->questionJSId = $this->js_id; + break; + // not supported + case UNIQUE_ANSWER_NO_OPTION: + case MULTIPLE_ANSWER_TRUE_FALSE: + case MULTIPLE_ANSWER_COMBINATION_TRUE_FALSE: + case UNIQUE_ANSWER_IMAGE: + case CALCULATED_ANSWER: + $this->answer = new ScormAnswerMultipleChoice($this->id); + $this->answer->questionJSId = $this->js_id; + break; + default: + $this->answer = new stdClass(); + $this->answer->questionJSId = $this->js_id; + break; + } + + return true; + } + + /** + * @throws Exception + * + * @return array + */ + public function export() + { + $html = $this->getQuestionHTML(); + $js = $this->getQuestionJS(); + + if (is_object($this->answer) && $this->answer instanceof Answer) { + list($js2, $html2) = $this->answer->export(); + $js .= $js2; + $html .= $html2; + } else { + throw new \Exception('Question not supported. Exercise: '.$this->selectTitle()); + } + + return [$js, $html]; + } + + /** + * {@inheritdoc} + */ + public function createAnswersForm($form) + { + return true; + } + + /** + * {@inheritdoc} + */ + public function processAnswersCreation($form, $exercise) + { + return true; + } + + /** + * Returns an HTML-formatted question. + */ + public function getQuestionHTML() + { + $title = $this->selectTitle(); + $description = $this->selectDescription(); + $cols = 2; + $s = ' + + '.$title.' + + + + + '.$description.' + + '; + + return $s; + } + + /** + * Return the JavaScript code bound to the question. + */ + public function getQuestionJS() + { + $weight = $this->selectWeighting(); + $js = ' + questions.push('.$this->js_id.'); + $(document).ready(function() { + if (exerciseInfo.randomAnswers == true) { + $("#question_'.$this->js_id.'").shuffleRows(); + } + });'; + $js .= "\n"; + + switch ($this->type) { + case ORAL_EXPRESSION: + /*$script = file_get_contents(api_get_path(LIBRARY_PATH) . 'javascript/rtc/RecordRTC.js'); + $script .= file_get_contents(api_get_path(LIBRARY_PATH) . 'wami-recorder/recorder.js'); + $script .= file_get_contents(api_get_path(LIBRARY_PATH) . 'wami-recorder/gui.js'); + $js .= $script;*/ + break; + case HOT_SPOT: + //put the max score to 0 to avoid discounting the points of + //non-exported quiz types in the SCORM + $weight = 0; + break; + } + $js .= 'questions_score_max['.$this->js_id.'] = '.$weight.";"; + + return $js; + } +} diff --git a/main/exercise/export/scorm/common.js b/main/exercise/export/scorm/common.js new file mode 100644 index 0000000000..7d8cb88461 --- /dev/null +++ b/main/exercise/export/scorm/common.js @@ -0,0 +1,25 @@ +var questions = new Array(); +var questions_answers = new Array(); +var questions_answers_correct = new Array(); +var questions_types = new Array(); +var questions_score_max = new Array(); +var questions_answers_ponderation = new Array(); + +/** + * Adds the event listener + */ +function addListeners(e) { + loadPage(); + var myButton = document.getElementById('chamilo_scorm_submit'); + addEvent(myButton, 'click', doQuit, false); + addEvent(myButton, 'click', disableButton, false); + addEvent(window, 'unload', unloadPage, false); +} + +/** Disables the submit button on SCORM result submission **/ +function disableButton() { + var mybtn = document.getElementById('chamilo_scorm_submit'); + mybtn.setAttribute('disabled', 'disabled'); +} + +addEvent(window,'load', addListeners, false); \ No newline at end of file diff --git a/main/exercise/export/scorm/scorm_classes.php b/main/exercise/export/scorm/scorm_classes.php index b651bdce18..abc78b4638 100755 --- a/main/exercise/export/scorm/scorm_classes.php +++ b/main/exercise/export/scorm/scorm_classes.php @@ -1,558 +1,6 @@ - * @author Yannick Warnier - * - * @package chamilo.exercise.scorm - */ -class ScormQuestion extends Question -{ - public $js_id; - public $answer; - - /** - * Returns the HTML + JS flow corresponding to one question. - * - * @param int $questionId The question ID - * @param bool $standalone (ie including XML tag, DTD declaration, etc) - * @param int $js_id The JavaScript ID for this question. - * Due to the nature of interactions, we must have a natural sequence for - * questions in the generated JavaScript. - * - * @return string|array - */ - public static function export_question( - $questionId, - $standalone = true, - $js_id - ) { - $question = new ScormQuestion(); - $qst = $question->read($questionId); - if (!$qst) { - return ''; - } - $question->id = $qst->id; - $question->js_id = $js_id; - $question->type = $qst->type; - $question->question = $qst->question; - $question->description = $qst->description; - $question->weighting = $qst->weighting; - $question->position = $qst->position; - $question->picture = $qst->picture; - $assessmentItem = new ScormAssessmentItem($question, $standalone); - - return $assessmentItem->export(); - } - - /** - * Include the correct answer class and create answer. - */ - public function setAnswer() - { - switch ($this->type) { - case MCUA: - $this->answer = new ScormAnswerMultipleChoice($this->id); - $this->answer->questionJSId = $this->js_id; - break; - case MCMA: - case GLOBAL_MULTIPLE_ANSWER: - $this->answer = new ScormAnswerMultipleChoice($this->id); - $this->answer->questionJSId = $this->js_id; - break; - case TF: - $this->answer = new ScormAnswerTrueFalse($this->id); - $this->answer->questionJSId = $this->js_id; - break; - case FIB: - $this->answer = new ScormAnswerFillInBlanks($this->id); - $this->answer->questionJSId = $this->js_id; - break; - case MATCHING: - case MATCHING_DRAGGABLE: - case DRAGGABLE: - $this->answer = new ScormAnswerMatching($this->id); - $this->answer->questionJSId = $this->js_id; - break; - case ORAL_EXPRESSION: - case FREE_ANSWER: - $this->answer = new ScormAnswerFree($this->id); - $this->answer->questionJSId = $this->js_id; - break; - case HOT_SPOT: - $this->answer = new ScormAnswerHotspot($this->id); - $this->answer->questionJSId = $this->js_id; - break; - case MULTIPLE_ANSWER_COMBINATION: - $this->answer = new ScormAnswerMultipleChoice($this->id); - $this->answer->questionJSId = $this->js_id; - break; - case HOT_SPOT_ORDER: - $this->answer = new ScormAnswerHotspot($this->id); - $this->answer->questionJSId = $this->js_id; - break; - case HOT_SPOT_DELINEATION: - $this->answer = new ScormAnswerHotspot($this->id); - $this->answer->questionJSId = $this->js_id; - break; - // not supported - case UNIQUE_ANSWER_NO_OPTION: - case MULTIPLE_ANSWER_TRUE_FALSE: - case MULTIPLE_ANSWER_COMBINATION_TRUE_FALSE: - case UNIQUE_ANSWER_IMAGE: - case CALCULATED_ANSWER: - $this->answer = new ScormAnswerMultipleChoice($this->id); - $this->answer->questionJSId = $this->js_id; - break; - default: - $this->answer = new stdClass(); - $this->answer->questionJSId = $this->js_id; - break; - } - - return true; - } - - /** - * @throws Exception - * - * @return array - */ - public function export() - { - $html = $this->getQuestionHTML(); - $js = $this->getQuestionJS(); - - if (is_object($this->answer) && $this->answer instanceof Answer) { - list($js2, $html2) = $this->answer->export(); - $js .= $js2; - $html .= $html2; - } else { - throw new \Exception('Question not supported. Exercise: '.$this->selectTitle()); - } - - return [$js, $html]; - } - - /** - * {@inheritdoc} - */ - public function createAnswersForm($form) - { - return true; - } - - /** - * {@inheritdoc} - */ - public function processAnswersCreation($form, $exercise) - { - return true; - } - - /** - * Returns an HTML-formatted question. - */ - public function getQuestionHTML() - { - $title = $this->selectTitle(); - $description = $this->selectDescription(); - $cols = 2; - $s = ' - - '.$title.' - - - - - '.$description.' - - '; - - return $s; - } - - /** - * Return the JavaScript code bound to the question. - */ - public function getQuestionJS() - { - $weight = $this->selectWeighting(); - $js = 'questions.push('.$this->js_id.');'."\n"; - - switch ($this->type) { - case ORAL_EXPRESSION: - /*$script = file_get_contents(api_get_path(LIBRARY_PATH) . 'javascript/rtc/RecordRTC.js'); - $script .= file_get_contents(api_get_path(LIBRARY_PATH) . 'wami-recorder/recorder.js'); - $script .= file_get_contents(api_get_path(LIBRARY_PATH) . 'wami-recorder/gui.js'); - $js .= $script;*/ - break; - case HOT_SPOT: - //put the max score to 0 to avoid discounting the points of - //non-exported quiz types in the SCORM - $weight = 0; - break; - } - $js .= 'questions_score_max['.$this->js_id.'] = '.$weight.";"; - - return $js; - } -} - -/** - * This class handles the export to SCORM of a multiple choice question - * (be it single answer or multiple answers). - * - * @package chamilo.exercise.scorm - */ -class ScormAnswerMultipleChoice extends Answer -{ - /** - * Return HTML code for possible answers. - */ - public function export() - { - $js = ''; - $html = ''; - $type = $this->getQuestionType(); - $jstmpw = 'questions_answers_ponderation['.$this->questionJSId.'] = new Array();'; - $jstmpw .= 'questions_answers_ponderation['.$this->questionJSId.'][0] = 0;'; - $jstmpw .= 'questions_answers_correct['.$this->questionJSId.'] = new Array();'; - - //not sure if we are going to export also the MULTIPLE_ANSWER_COMBINATION to SCORM - //if ($type == MCMA || $type == MULTIPLE_ANSWER_COMBINATION ) { - if ($type == MCMA) { - $id = 1; - $jstmp = ''; - $jstmpc = ''; - foreach ($this->answer as $i => $answer) { - $identifier = 'question_'.$this->questionJSId.'_multiple_'.$i; - $html .= - ' - - - '; - - $jstmp .= $i.','; - if ($this->correct[$i]) { - $jstmpc .= $i.','; - } - $jstmpw .= 'questions_answers_ponderation['.$this->questionJSId.']['.$i.'] = '.$this->weighting[$i].";"; - $jstmpw .= 'questions_answers_correct['.$this->questionJSId.']['.$i.'] = '.$this->correct[$i].';'; - $id++; - } - $js .= 'questions_answers['.$this->questionJSId.'] = new Array('.substr($jstmp, 0, -1).');'."\n"; - $js .= 'questions_types['.$this->questionJSId.'] = \'mcma\';'."\n"; - $js .= $jstmpw; - } elseif ($type == MULTIPLE_ANSWER_COMBINATION) { - $js = ''; - $id = 1; - $jstmp = ''; - $jstmpc = ''; - foreach ($this->answer as $i => $answer) { - $identifier = 'question_'.$this->questionJSId.'_exact_'.$i; - $html .= - ' - - - '; - - $jstmp .= $i.','; - if ($this->correct[$i]) { - $jstmpc .= $i.','; - } - $jstmpw .= 'questions_answers_ponderation['.$this->questionJSId.']['.$i.'] = '.$this->weighting[$i].";"; - $jstmpw .= 'questions_answers_correct['.$this->questionJSId.']['.$i.'] = '.$this->correct[$i].";"; - $id++; - } - $js .= 'questions_answers['.$this->questionJSId.'] = new Array('.substr($jstmp, 0, -1).');'; - $js .= 'questions_types['.$this->questionJSId.'] = "exact";'; - $js .= $jstmpw; - } else { - $id = 1; - $jstmp = ''; - $jstmpc = ''; - foreach ($this->answer as $i => $answer) { - $identifier = 'question_'.$this->questionJSId.'_unique_'.$i; - $identifier_name = 'question_'.$this->questionJSId.'_unique_answer'; - $html .= - ' - - - '; - $jstmp .= $i.','; - if ($this->correct[$i]) { - $jstmpc .= $i; - } - $jstmpw .= 'questions_answers_ponderation['.$this->questionJSId.']['.$i.'] = '.$this->weighting[$i].";"; - $jstmpw .= 'questions_answers_correct['.$this->questionJSId.']['.$i.'] = '.$this->correct[$i].';'; - $id++; - } - $js .= 'questions_answers['.$this->questionJSId.'] = new Array('.substr($jstmp, 0, -1).');'; - $js .= 'questions_types['.$this->questionJSId.'] = \'mcua\';'; - $js .= $jstmpw; - } - $html .= '
- - - -
- - - -
- - - -
'; - - return [$js, $html]; - } -} - -/** - * This class handles the SCORM export of true/false questions. - * - * @package chamilo.exercise.scorm - */ -class ScormAnswerTrueFalse extends Answer -{ - /** - * Return the XML flow for the possible answers. - * That's one , containing several . - * - * @author Amand Tihon - */ - public function export() - { - $js = ''; - $html = ''; - $identifier = 'question_'.$this->questionJSId.'_tf'; - $identifier_true = $identifier.'_true'; - $identifier_false = $identifier.'_false'; - $html .= - ' - - - '; - $html .= - ' - - -
- - - -
- - - -
'; - $js .= 'questions_answers['.$this->questionJSId.'] = new Array(\'true\',\'false\');'."\n"; - $js .= 'questions_types['.$this->questionJSId.'] = \'tf\';'."\n"; - if ($this->response === 'TRUE') { - $js .= 'questions_answers_correct['.$this->questionJSId.'] = new Array(\'true\');'."\n"; - } else { - $js .= 'questions_answers_correct['.$this->questionJSId.'] = new Array(\'false\');'."\n"; - } - $jstmpw = 'questions_answers_ponderation['.$this->questionJSId.'] = new Array();'."\n"; - $jstmpw .= 'questions_answers_ponderation['.$this->questionJSId.'][0] = 0;'."\n"; - $jstmpw .= 'questions_answers_ponderation['.$this->questionJSId.'][1] = '.$this->weighting[1].";\n"; - $js .= $jstmpw; - - return [$js, $html]; - } -} - -/** - * This class handles the SCORM export of fill-in-the-blanks questions. - * - * @package chamilo.exercise.scorm - */ -class ScormAnswerFillInBlanks extends Answer -{ - /** - * Export the text with missing words. - * - * As a side effect, it stores two lists in the class : - * the missing words and their respective weightings. - */ - public function export() - { - global $charset; - $js = ''; - $html = ''; - // get all enclosed answers - $blankList = []; - foreach ($this->answer as $i => $answer) { - $blankList[] = '['.$answer.']'; - } - - // splits text and weightings that are joined with the character '::' - list($answer, $weight) = explode('::', $answer); - $weights = explode(',', $weight); - // because [] is parsed here we follow this procedure: - // 1. find everything between the [ and ] tags - $i = 1; - $jstmp = ''; - $jstmpc = ''; - $jstmpw = 'questions_answers_ponderation['.$this->questionJSId.'] = new Array();'."\n"; - $jstmpw .= 'questions_answers_ponderation['.$this->questionJSId.'][0] = 0;'."\n"; - $startlocations = api_strpos($answer, '['); - $endlocations = api_strpos($answer, ']'); - while ($startlocations !== false && $endlocations !== false) { - $texstring = api_substr($answer, $startlocations, ($endlocations - $startlocations) + 1); - $answer = api_substr_replace( - $answer, - '', - $startlocations, - ($endlocations - $startlocations) + 1 - ); - $jstmp .= $i.','; - if (!empty($texstring)) { - $sub = api_substr($texstring, 1, -1); - if (!empty($sub)) { - $jstmpc .= "'".api_htmlentities($sub, ENT_QUOTES, $charset)."',"; - } - } - $my_weight = explode('@', $weights[$i - 1]); - if (count($my_weight) == 2) { - $weight_db = $my_weight[0]; - } else { - $weight_db = $my_weight[0]; - } - $jstmpw .= 'questions_answers_ponderation['.$this->questionJSId.']['.$i.'] = '.$weight_db.";\n"; - $i++; - $startlocations = api_strpos($answer, '['); - $endlocations = api_strpos($answer, ']'); - } - - $html .= ' - -
- '.$answer.' -
'; - $js .= 'questions_answers['.$this->questionJSId.'] = new Array('.api_substr($jstmp, 0, -1).');'."\n"; - $js .= 'questions_answers_correct['.$this->questionJSId.'] = new Array('.api_substr($jstmpc, 0, -1).');'."\n"; - $js .= 'questions_types['.$this->questionJSId.'] = \'fib\';'."\n"; - $js .= $jstmpw; - - return [$js, $html]; - } -} - -/** - * This class handles the SCORM export of matching questions. - * - * @package chamilo.exercise.scorm - */ -class ScormAnswerMatching extends Answer -{ - /** - * Export the question part as a matrix-choice, with only one possible answer per line. - * - * @author Amand Tihon - */ - public function export() - { - $js = ''; - $html = ''; - // prepare list of right proposition to allow - // - easiest display - // - easiest randomisation if needed one day - // (here I use array_values to change array keys from $code1 $code2 ... to 0 1 ...) - // get max length of displayed array - - $nbrAnswers = $this->selectNbrAnswers(); - $cpt1 = 'A'; - $cpt2 = 1; - $Select = []; - $qId = $this->questionJSId; - $s = ''; - $jstmp = ''; - $jstmpc = ''; - $jstmpw = 'questions_answers_ponderation['.$this->questionJSId.'] = new Array();'."\n"; - $jstmpw .= 'questions_answers_ponderation['.$this->questionJSId.'][0] = 0;'."\n"; - - for ($answerId = 1; $answerId <= $nbrAnswers; $answerId++) { - $identifier = 'question_'.$qId.'_matching_'; - $answer = $this->selectAnswer($answerId); - $answerCorrect = $this->isCorrect($answerId); - $weight = $this->selectWeighting($answerId); - $jstmp .= $answerId.','; - - if (!$answerCorrect) { - // options (A, B, C, ...) that will be put into the list-box - $Select[$answerId]['Lettre'] = $cpt1; - // answers that will be shown at the right side - $Select[$answerId]['Reponse'] = $answer; - $cpt1++; - } else { - $s .= ''; - $s .= '"; - $s .= ''; - $s .= '"; - - $jstmpc .= '['.$answerCorrect.','.$cpt2.'],'; - - $my_weight = explode('@', $weight); - if (count($my_weight) == 2) { - $weight = $my_weight[0]; - } else { - $weight = $my_weight[0]; - } - $jstmpw .= 'questions_answers_ponderation['.$qId.']['.$cpt2.'] = '.$weight.";\n"; - $cpt2++; - - // if the left side of the "matching" has been completely shown - if ($answerId == $nbrAnswers) { - // if there remain answers to be shown on the right side - while (isset($Select[$cpt2])) { - $s .= ''; - $s .= ''; - $s .= '"; - $cpt2++; - } - // end while() - } // end if() - } - } - $js .= 'questions_answers['.$this->questionJSId.'] = new Array('.substr($jstmp, 0, -1).');'."\n"; - $js .= 'questions_answers_correct['.$this->questionJSId.'] = new Array('.substr($jstmpc, 0, -1).');'."\n"; - $js .= 'questions_types['.$this->questionJSId.'] = \'matching\';'."\n"; - $js .= $jstmpw; - $html .= $s; - $html .= '
'.$cpt2.'. '.$answer."    '; - if (isset($Select[$cpt2])) { - $s .= ''.$Select[$cpt2]['Lettre'].'. '.$Select[$cpt2]['Reponse']; - } else { - $s .= ' '; - } - $s .= "
 '; - $s .= ''.$Select[$cpt2]['Lettre'].'. '.$Select[$cpt2]['Reponse']; - $s .= "
'."\n"; - - return [$js, $html]; - } -} - /** * This class handles the SCORM export of free-answer questions. * @@ -614,10 +62,11 @@ class ScormAnswerHotspot extends Answer */ public function get_js_header() { + $header = ''; + if ($this->standalone) { - $header = ''; //because this header closes so many times the - $answer_list + $answerList HTML; @@ -692,497 +145,3 @@ HTML; return [$js, $html]; } } - -/** - * A SCORM item. It corresponds to a single question. - * This class allows export from Dokeos SCORM 1.2 format of a single question. - * It is not usable as-is, but must be subclassed, to support different kinds of questions. - * - * Every start_*() and corresponding end_*(), as well as export_*() methods return a string. - * - * Attached files are NOT exported. - * - * @package chamilo.exercise.scorm - */ -class ScormAssessmentItem -{ - public $question; - public $question_ident; - public $answer; - public $standalone; - - /** - * Constructor. - * - * @param ScormQuestion $question the Question object we want to export - */ - public function __construct($question, $standalone = false) - { - $this->question = $question; - $this->question->setAnswer(); - $this->questionIdent = "QST_".$question->id; - $this->standalone = $standalone; - } - - /** - * Start the XML flow. - * - * This opens the block, with correct attributes. - */ - public function start_page() - { - $head = ''; - if ($this->standalone) { - $charset = 'UTF-8'; - $head = ''; - $head .= ''; - } - - return $head; - } - - /** - * End the XML flow, closing the tag. - */ - public function end_page() - { - if ($this->standalone) { - return ''; - } - - return ''; - } - - /** - * Start document header. - */ - public function start_header() - { - if ($this->standalone) { - return ''; - } - - return ''; - } - - /** - * Print CSS inclusion. - */ - public function css() - { - $css = ''; - if ($this->standalone) { - $css = ''."\n"; - $css .= ''; - } - - return $css; - } - - /** - * End document header. - */ - public function end_header() - { - if ($this->standalone) { - return ''; - } - - return ''; - } - - /** - * Start the itemBody. - */ - public function start_js() - { - $js = ''; - if ($this->standalone) { - return ''; - } - - return ''; - } - - /** - * Start the itemBody. - */ - public function start_body() - { - if ($this->standalone) { - return '
'; - } - - return ''; - } - - /** - * End the itemBody part. - */ - public function end_body() - { - if ($this->standalone) { - return '
'; - } - - return ''; - } - - /** - * Export the question as a SCORM Item. - * This is a default behaviour, some classes may want to override this. - * - * @return string|array a string, the XML flow for an Item - */ - public function export() - { - list($js, $html) = $this->question->export(); - if ($this->standalone) { - $res = $this->start_page() - .$this->start_header() - .$this->css() - .$this->start_js() - .$this->common_js() - .$js - .$this->end_js() - .$this->end_header() - .$this->start_body() - .$html - .$this->end_body() - .$this->end_page(); - - return $res; - } else { - return [$js, $html]; - } - } -} - -/** - * This class represents an entire exercise to be exported in SCORM. - * It will be represented by a single
containing several . - * - * Some properties cannot be exported, as SCORM does not support them : - * - type (one page or multiple pages) - * - start_date and end_date - * - max_attempts - * - show_answer - * - anonymous_attempts - * - * @package chamilo.exercise.scorm - */ -class ScormSection -{ - public $exercise; - public $standalone; - - /** - * Constructor. - * - * @param Exercise $exe The Exercise instance to export - * - * @author Amand Tihon - */ - public function __construct($exe) - { - $this->exercise = $exe; - } - - /** - * Send a complete exercise in SCORM format, from its ID. - * - * @param Exercise $exercise The exercise to export - * @param bool $standalone wether it should include XML tag and DTD line - * - * @return string XML as a string, or an empty string if there's no exercise with given ID - */ - public static function export_exercise_to_scorm( - Exercise $exercise, - $standalone = true - ) { - $ims = new ScormSection($exercise); - $xml = $ims->export($standalone); - - return $xml; - } - - /** - * Start the XML flow. - * - * This opens the block, with correct attributes. - */ - public function start_page() - { - $charset = 'UTF-8'; - $head = ''; - - return $head; - } - - /** - * End the XML flow, closing the tag. - */ - public function end_page() - { - return ''; - } - - /** - * Start document header. - */ - public function start_header() - { - return ''; - } - - /** - * Common JS functions. - */ - public function common_js() - { - $js = file_get_contents('../inc/lib/javascript/hotspot/js/hotspot.js'); - - $js .= 'var questions = new Array();'."\n"; - $js .= 'var questions_answers = new Array();'."\n"; - $js .= 'var questions_answers_correct = new Array();'."\n"; - $js .= 'var questions_types = new Array();'."\n"; - $js .= "\n". - '/** - * Assigns any event handler to any element - * @param object Element on which the event is added - * @param string Name of event - * @param string Function to trigger on event - * @param boolean Capture the event and prevent - */ - function addEvent(elm, evType, fn, useCapture) - { //by Scott Andrew - if(elm.addEventListener){ - elm.addEventListener(evType, fn, useCapture); - return true; - } else if(elm.attachEvent) { - var r = elm.attachEvent(\'on\' + evType, fn); - return r; - } else { - elm[\'on\' + evType] = fn; - } - } - /** - * Adds the event listener - */ - function addListeners(e) { - loadPage(); - /* - var my_form = document.getElementById(\'dokeos_scorm_form\'); - addEvent(my_form,\'submit\',checkAnswers,false); - */ - var my_button = document.getElementById(\'dokeos_scorm_submit\'); - addEvent(my_button,\'click\',doQuit,false); - addEvent(my_button,\'click\',disableButton,false); - //addEvent(my_button,\'click\',checkAnswers,false); - //addEvent(my_button,\'change\',checkAnswers,false); - addEvent(window,\'unload\',unloadPage,false); - } - /** Disables the submit button on SCORM result submission **/ - function disableButton() { - var mybtn = document.getElementById(\'dokeos_scorm_submit\'); - mybtn.setAttribute(\'disabled\',\'disabled\'); - } - '."\n"; - - $js .= ''; - $js .= 'addEvent(window,\'load\',addListeners,false);'."\n"; - - return $js."\n"; - } - - /** - * End the itemBody part. - */ - public function end_js() - { - return ''; - } - - /** - * Start the itemBody. - */ - public function start_body() - { - return ''. - '

'.$this->exercise->selectTitle().'

'.$this->exercise->selectDescription()."

". - '
'. - ''; - } - - /** - * End the itemBody part. - */ - public function end_body() - { - return '

'; - } - - /** - * Export the question as a SCORM Item. - * - * This is a default behaviour, some classes may want to override this. - * - * @param $standalone: Boolean stating if it should be exported as a stand-alone question - * - * @return string string, the XML flow for an Item - */ - public function export() - { - global $charset; - - $head = ''; - if ($this->standalone) { - $head = ''."\n" - .''."\n"; - } - - list($js, $html) = $this->export_questions(); - $res = $this->start_page() - .$this->start_header() - .$this->css() - .$this->globalAssets() - .$this->start_js() - .$this->common_js() - .$js - .$this->end_js() - .$this->end_header() - .$this->start_body() - .$html - .$this->end_body() - .$this->end_page(); - - return $res; - } - - /** - * Export the questions, as a succession of . - * - * @author Amand Tihon - */ - public function export_questions() - { - $js = $html = ""; - $js_id = 0; - foreach ($this->exercise->selectQuestionList() as $q) { - list($jstmp, $htmltmp) = ScormQuestion::export_question($q, false, $js_id); - $js .= $jstmp."\n"; - $html .= $htmltmp."\n"; - $js_id++; - } - - return [$js, $html]; - } - - /** - * Print CSS inclusion. - */ - private function css() - { - return ''; - } - - /** - * End document header. - */ - private function end_header() - { - return ''; - } - - /** - * Start the itemBody. - */ - private function start_js() - { - return ''; - $assets .= ''; - $assets .= ''; - - return $assets; - } -} diff --git a/main/inc/ajax/usergroup.ajax.php b/main/inc/ajax/usergroup.ajax.php new file mode 100644 index 0000000000..d841801279 --- /dev/null +++ b/main/inc/ajax/usergroup.ajax.php @@ -0,0 +1,27 @@ +delete_user_rel_group($userId, $groupId); + } + } + break; + default: + echo ''; + break; +} +exit; diff --git a/main/inc/lib/hook/HookCreateCourse.php b/main/inc/lib/hook/HookCreateCourse.php new file mode 100644 index 0000000000..4ca5b7c3e2 --- /dev/null +++ b/main/inc/lib/hook/HookCreateCourse.php @@ -0,0 +1,37 @@ +eventData['type'] = $type; + + /** @var HookCreateCourseObserverInterface $observer */ + foreach ($this->observers as $observer) { + $observer->hookCreateCourse($this); + } + + return 1; + } +} diff --git a/main/inc/lib/hook/interfaces/HookCreateCourseEventInterface.php b/main/inc/lib/hook/interfaces/HookCreateCourseEventInterface.php new file mode 100644 index 0000000000..707102b1c0 --- /dev/null +++ b/main/inc/lib/hook/interfaces/HookCreateCourseEventInterface.php @@ -0,0 +1,23 @@ + - * @copyright 2007-2009 Laurent Laville - * @license http://www.opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: qfamsHandler.js,v 1.13 2009/02/06 09:49:22 farell Exp $ - * @since File available since Release 1.3.0 - */ - -if (typeof QFAMS === "undefined" || !QFAMS) { - /** - * The QFAMS global namespace object. If QFAMS is already defined, the - * existing QFAMS object will not be overwritten so that defined - * namespaces are preserved. - * @class QFAMS - * @static - * @public - * @since 1.5.0 - */ - var QFAMS = {}; -} - -/** - * QFAMS.env is used to keep track of end-user preferences - * for persistant values. - * - * @class QFAMS.env - * @static - */ -QFAMS.env = QFAMS.env || { - /** - * Keeps the persistant selection preference when items are selected or unselected - * - * @property persistantSelection - * @type Boolean - */ - persistantSelection: false, - - /** - * Keeps the persistant selection preference when items are moved up or down - * - * @property persistantMove - * @type Boolean - */ - persistantMove: true -}; - -/** - * Uses QFAMS.updateCounter as a - * text tools to replace all childs of 'c' element by a new text node of 'v' value - * - * @param dom element c html element; is best use in most case - * @param string v new counter value - * - * @method updateCounter - * @static - * @return void - * @public - * @since 1.5.0 - */ -QFAMS.updateCounter = function (c, v) { - var i; - var nodeText = null; - - if (c !== null) { - // remove all previous child nodes of 'c' element - if (c.childNodes) { - for (i = 0; i < c.childNodes.length; i++) { - c.removeChild(c.childNodes[i]); - } - } - // add new text value 'v' - nodeText = document.createTextNode(v); - c.appendChild(nodeText); - } -}; - -/** - * Uses QFAMS.updateLiveCounter as a - * standard onclick event handler to dynamic change value of counter - * that display current selection - * - * @method updateLiveCounter - * @static - * @return void - * @private - * @since 1.5.0 - */ -QFAMS.updateLiveCounter = function () { - var lbl = this.parentNode; - var selectedCount = 0; - - // Find all the checkboxes... - var div = lbl.parentNode; - var inputs = div.getElementsByTagName('input'); - for (var i = 0; i < inputs.length; i++) { - if (inputs[i].checked == 1) { - selectedCount++; - } - } - var e = div.id; - var qfamsName = e.substring(e.indexOf('_', 0) + 1, e.length); - // updates item count - var span = document.getElementById(qfamsName + '_selected'); - QFAMS.updateCounter(span, selectedCount + '/' + inputs.length); -}; - -/** - * Uses QFAMS.editSelection - * in single select box mode, to edit current selection and update live counter - * - * @param string qfamsName QuickForm advmultiselect element name - * @param integer selectMode Selection mode (0 = uncheck, 1 = check, 2 = toggle) - * - * @method editSelection - * @static - * @return void - * @public - * @since 1.5.0 - */ -QFAMS.editSelection = function (qfamsName, selectMode) { - if (selectMode !== 0 && selectMode !== 1 && selectMode !== 2) { - return; - } - var selectedCount = 0; - - // Find all the checkboxes... - var ams = document.getElementById('qfams_' + qfamsName); - var inputs = ams.getElementsByTagName('input'); - - // Loop through all checkboxes (input element) - for (var i = 0; i < inputs.length; i++) { - if (selectMode === 2) { - if (inputs[i].checked == 0) { - inputs[i].checked = 1; - } else if (inputs[i].checked == 1) { - inputs[i].checked = 0; - } - } else { - inputs[i].checked = selectMode; - } - if (inputs[i].checked == 1) { - selectedCount++; - } - } - - // updates selected item count - var span = document.getElementById(qfamsName + '_selected'); - QFAMS.updateCounter(span, selectedCount + '/' + inputs.length); -}; - -/** - * Uses QFAMS.moveSelection - * in double select box mode, to move current selection and update live counter - * - * @param string qfamsName QuickForm advmultiselect element name - * @param dom element selectLeft Data source list - * @param dom element selectRight Target data list - * @param dom element selectHidden Full data source (selected, unselected) - * private usage - * @param string action Action name (add, remove, all, none, toggle) - * @param string arrange Sort option (none, asc, desc) - * - * @method moveSelection - * @static - * @return void - * @public - * @since 1.5.0 - */ -QFAMS.moveSelection = function (qfamsName, selectLeft, selectRight, selectHidden, action, arrange) { - var isIE = /*@cc_on!@*/false; //IE detector - var source = null; - var target = null; - var option; - var c = null; - var s = null; - var i; - var maxFrom, maxTo; - - if (action === 'add' || action === 'all' || action === 'toggle') { - source = selectLeft; - target = selectRight; - } else { - source = selectRight; - target = selectLeft; - } - // Don't do anything if nothing selected. Otherwise we throw javascript errors. - if (source.selectedIndex === -1 && (action === 'add' || action === 'remove')) { - return; - } - maxFrom = source.options.length; - maxTo = target.options.length; - - // check if target list is empty and remove fake empty option (tip to be XHTML compliant) - if (maxTo > 0 && target.options[0].value === "") { - target.removeAttribute("disabled"); - target.options[0] = null; - } - - // Add items to the 'TO' list. - for (i = (maxFrom - 1); i >= 0; i--) { - if (action === 'all' || action === 'none' || action === 'toggle' || source.options[i].selected === true) { - if (source.options[i].disabled === false) { - if (isIE) { - option = source.options[i].removeNode(true); - option.selected = QFAMS.env.persistantSelection; - target.appendChild(option); - } else { - option = source.options[i].cloneNode(true); - option.selected = QFAMS.env.persistantSelection; - target.options[target.options.length] = option; - } - } - } - } - - // Remove items from the 'FROM' list. - if (!isIE) { - for (i = (maxFrom - 1); i >= 0; i--) { - if (action === 'all' || action === 'none' || action === 'toggle' || source.options[i].selected === true) { - if (source.options[i].disabled === false) { - source.options[i] = null; - } - } - } - } - - // Add items to the 'FROM' list for toggle function - if (action === 'toggle') { - for (i = (maxTo - 1); i >= 0; i--) { - if (target.options[i].disabled === false) { - if (isIE) { - option = target.options[i].removeNode(true); - option.selected = QFAMS.env.persistantSelection; - source.appendChild(option); - } else { - option = target.options[i].cloneNode(true); - option.selected = QFAMS.env.persistantSelection; - source.options[source.options.length] = option; - } - } - } - if (!isIE) { - for (i = (maxTo - 1); i >= 0; i--) { - if (target.options[i].disabled === false) { - target.options[i] = null; - } - } - } - } - - // updates unselected item count - c = document.getElementById(qfamsName + '_unselected'); - s = document.getElementById(qfamsName + '-f'); - QFAMS.updateCounter(c, s.length); - - // updates selected item count - c = document.getElementById(qfamsName + '_selected'); - s = document.getElementById(qfamsName + '-t'); - QFAMS.updateCounter(c, s.length); - - // Sort list if required - if (arrange !== 'none') { - QFAMS.sortList(target, QFAMS.compareText, arrange); - } - - // Set the appropriate items as 'selected in the hidden select. - // These are the values that will actually be posted with the form. - QFAMS.updateHidden(selectHidden, selectRight); - - // Order alphabetically - - //var sourceId = $(source).attr('id'); - var targetId = $(target).attr('id'); - var options = $('#' + targetId +' option'); - - var arr = options.map(function(_, o) { return { t: $(o).text(), v: o.value }; }).get(); - arr.sort(function (o1, o2) { - //return o1.t > o2.t ? 1 : o1.t < o2.t ? -1 : 0; - // Ignore case - var t1 = o1.t.toLowerCase(), t2 = o2.t.toLowerCase(); - return t1 > t2 ? 1 : t1 < t2 ? -1 : 0; - }); - - options.each(function(i, o) { - o.value = arr[i].v; - $(o).text(arr[i].t); - }); -}; - -/** - * Uses QFAMS.sortList to - * sort selection list if option is given in HTML_QuickForm_advmultiselect class constructor - * - * @param dom element list Selection data list - * @param prototype compareFunction to sort each element of a list - * @param string arrange Sort option (none, asc, desc) - * - * @method sortList - * @static - * @return void - * @private - * @since 1.5.0 - */ -QFAMS.sortList = function (list, compareFunction, arrange) -{ - var i; - var options = new Array(list.options.length); - - for (i = 0; i < options.length; i++) { - options[i] = new Option(list.options[i].text, - list.options[i].value, - list.options[i].defaultSelected, - list.options[i].selected); - } - options.sort(compareFunction); - if (arrange === 'desc') { - options.reverse(); - } - list.options.length = 0; - for (i = 0; i < options.length; i++) { - list.options[i] = options[i]; - } -}; - -/** - * QFAMS.compareText - * is a callback function to sort each element of two lists A and B - * - * @param string option1 single element of list A - * @param string option2 single element of list B - * - * @method compareText - * @static - * @return integer -1 if option1 is less than option2, - * 0 if option1 is equal to option2 - * 1 if option1 is greater than option2 - * @private - * @since 1.5.0 - */ -QFAMS.compareText = function (option1, option2) { - if (option1.text === option2.text) { - return 0; - } - return option1.text < option2.text ? -1 : 1; -}; - -/** - * QFAMS.updateHidden - * updates the private list that handle selection of all elements (selected and unselected) - * - * @param dom element h hidden list (contains all elements) - * @param dom element r selection list (contains only elements selected) - * - * @method updateHidden - * @static - * @return void - * @private - * @since 1.5.0 - */ -QFAMS.updateHidden = function (h, r) { - var i; - - for (i = 0; i < h.length; i++) { - h.options[i].selected = false; - } - - for (i = 0; i < r.length; i++) { - h.options[h.length] = new Option(r.options[i].text, r.options[i].value); - h.options[h.length - 1].selected = true; - } -}; - -/** - * With QFAMS.moveUp - * end-user may arrange and element up to the selection list - * - * @param dom element l selection list (contains only elements selected) - * @param dom element h hidden list (contains all elements) - * - * @method moveUp - * @static - * @return void - * @public - * @since 1.5.0 - */ -QFAMS.moveUp = function (l, h) { - var indice = l.selectedIndex; - if (indice < 0) { - return; - } - if (indice > 0) { - QFAMS.moveSwap(l, indice, indice - 1); - QFAMS.updateHidden(h, l); - } -}; - -/** - * With QFAMS.moveDown - * end-user may arrange and element down to the selection list - * - * @param dom element l selection list (contains only elements selected) - * @param dom element h hidden list (contains all elements) - * - * @method moveDown - * @static - * @return void - * @public - * @since 1.5.0 - */ -QFAMS.moveDown = function (l, h) { - var indice = l.selectedIndex; - if (indice < 0) { - return; - } - if (indice < l.options.length - 1) { - QFAMS.moveSwap(l, indice, indice + 1); - QFAMS.updateHidden(h, l); - } -}; - -/** - * With QFAMS.moveTop - * end-user may arrange and element up to the top of selection list - * - * @param dom element l selection list (contains only elements selected) - * @param dom element h hidden list (contains all elements) - * - * @method moveTop - * @static - * @return void - * @public - * @since 1.5.0 - */ -QFAMS.moveTop = function (l, h) { - var indice = l.selectedIndex; - if (indice < 0) { - return; - } - while (indice > 0) { - QFAMS.moveSwap(l, indice, indice - 1); - QFAMS.updateHidden(h, l); - indice--; - } -}; - -/** - * With QFAMS.moveBottom - * end-user may arrange and element down to the bottom of selection list - * - * @param dom element l selection list (contains only elements selected) - * @param dom element h hidden list (contains all elements) - * - * @method moveBottom - * @static - * @return void - * @public - * @since 1.5.0 - */ -QFAMS.moveBottom = function (l, h) { - var indice = l.selectedIndex; - if (indice < 0) { - return; - } - while (indice < l.options.length - 1) { - QFAMS.moveSwap(l, indice, indice + 1); - QFAMS.updateHidden(h, l); - indice++; - } -}; - -/** - * With QFAMS.moveSwap - * end-user may invert two elements position in the selection list - * - * @param dom element l selection list (contains only elements selected) - * @param integer i element source indice - * @param integer j element target indice - * - * @method moveSwap - * @static - * @return void - * @public - * @since 1.5.0 - */ -QFAMS.moveSwap = function (l, i, j) { - var node; - - node = l.replaceChild(l.options[i], l.options[j]); - if (i > j) { - l.insertBefore(node, l.options[j].nextSibling); - } else { - l.insertBefore(node, l.options[i]); - } - - if (QFAMS.env.persistantMove) { - l.selectedIndex = j; - } else { - l.selectedIndex = -1; - } -}; - -/** - * Uses QFAMS.init to - * initialize onclick event handler for all checkbox element - * of a QuickForm advmultiselect element with single select box. - * - * @method init - * @static - * @return void - * @public - * @since 1.5.0 - */ -QFAMS.init = function (elm) -{ - var e, i; - - for (e = 0; e < elm.length; e++) { - var div = document.getElementById('qfams_' + elm[e]); - if (div !== null) { - var inputs = div.getElementsByTagName('input'); - if (inputs !== null) { - for (i = 0; i < inputs.length; i++) { - inputs[i].onclick = QFAMS.updateLiveCounter; - } - } - } - } -}; - -$(function() { - - $('.advmultiselect_checkbox').click(function() { - var id = $(this).attr('id'); - var selectName = id + '-f'; - var selectId = selectName.replace('_select_all', ''); - var selectDestinationId = selectId.replace('-f', '-t'); - - $('#'+selectDestinationId).prop("disabled", false); - - var checked = !$('#'+ id).is(':checked'); - if (!checked) { - $('#users-f option').prop('selected', true); - QFAMS.moveSelection('users', this.form.elements['users-f[]'], this.form.elements['users-t[]'], this.form.elements['users[]'], 'add', 'none'); - } else { - $('#users-t option').prop('selected', true); - QFAMS.moveSelection('users', this.form.elements['users-f[]'], this.form.elements['users-t[]'], this.form.elements['users[]'], 'remove', 'none'); - } - }); -}); diff --git a/main/lang/brazilian/trad4all.inc.php b/main/lang/brazilian/trad4all.inc.php index 807a1d79e6..6a209489c5 100644 --- a/main/lang/brazilian/trad4all.inc.php +++ b/main/lang/brazilian/trad4all.inc.php @@ -5468,7 +5468,7 @@ $StartToType = "Comece a digitar, em seguida, clique neste bar para validar tag" $InstallChamilo = "Instalar Chamilo"; $ChamiloURL = "Chamilo URL"; $YouDoNotHaveAnySessionInItsHistory = "Você não tem sessão na sua história sessões"; -$PortalHomepageDefaultIntroduction = "

Parabéns! Você instalou com sucesso seu portal de e-learning!

Você agora pode terminar a instalação seguindo três etapas fáceis:

  1. Configurar seu portal indo à seção de administração, e selecionando -> Configurações gerais do Chamilo.
  2. Adicione alguma vida a seu portal criando usuários e/ou cursos. Você pode convidar novas pessoas para criar seus cursos ou criar você mesmo através da seção de adminitração usuários e cursos.
  3. Edite a página inicial do portal através da opção de Edição da Página Inicial.

Você pode sempre encontrar mais informação sobre este software em nosso Web site: http://www.chamilo.org.

Divirta-se, e não hesite em juntar-se à comunidade e dar-nos o feedback através de nosso fórum.

"; +$PortalHomepageDefaultIntroduction = "

Parabéns! Você instalou com sucesso seu portal de e-learning!

Você agora pode terminar a instalação seguindo três etapas fáceis:

  1. Configurar seu portal indo à seção de administração, e selecionando -> Configurações gerais do Chamilo.
  2. Adicione alguma vida a seu portal criando usuários e/ou cursos. Você pode convidar novas pessoas para criar seus cursos ou criar você mesmo através da seção de administração usuários e cursos.
  3. Edite a página inicial do portal através da opção de Edição da Página Inicial.

Você pode sempre encontrar mais informação sobre este software em nosso Web site: http://www.chamilo.org.

Divirta-se, e não hesite em juntar-se à comunidade e dar-nos o feedback através de nosso fórum.

"; $WithTheFollowingSettings = "Com as seguintes configurações:"; $ThePageHasBeenExportedToDocArea = "A página foi exportada para a ferramenta documento"; $TitleColumnGradebook = "Cabeçalho da coluna do relatório de habilidades"; @@ -7990,4 +7990,130 @@ $ResetFieldX = "Redefinir %s"; $MyGeneralCertificate = "Meu certificado global"; $ScoreNote = "Pontuação"; $ScoreTest = "Teste"; +$MessageTracking = "Rastreamento de mensagens"; +$MessagesExchangeBetweenXAndY = "Troca de mensagens entre %s e %s"; +$YouWillReceivedASecondEmail = "Você receberá outro e-mail com sua senha"; +$YouReceivedAnEmailWithTheUsername = "Você deve ter recebido outro e-mail com seu nome de usuário."; +$TheScormPackageWillBeUpdatedYouMustUploadTheFileWithTheSameName = "Você deve fazer o upload de um arquivo zip com o mesmo nome do arquivo SCORM original."; +$YourChoice = "Sua escolha"; +$YouNeedToCreateASkillProfile = "Você precisa criar um perfil de habilidade"; +$SkillLevel = "Nível de habilidade"; +$Portfolio = "Portfólio"; +$AddPortfolioItem = "Adicionar item ao portfólio"; +$NewDocumentAddedToCourseX = "Novo documento adicionado ao curso %s"; +$DocumentXHasBeenAddedToDocumentInYourCourseXByUserX = "Um novo documento %s foi adicionado à ferramenta de documentos em seu curso %s por %s."; +$PendingSurveys = "Pesquisas pendentes"; +$NoPendingSurveys = "Nenhuma pesquisa pendente"; +$HottestSessions = "Sessões mais populares"; +$LPItemCanBeAccessed = "Item pode ser visto - Pré-requisitos concluídos"; +$ItemXBlocksThisElement = "Item %s bloqueia esta etapa"; +$YourResultAtXBlocksThisElement = "Seu resultado em %s bloqueia esta etapa"; +$RegistrationRoleWhatDoYouWantToDo = "O que você quer fazer?"; +$RegistrationRoleFollowCourses = "Siga cursos"; +$RegistrationRoleTeachCourses = "Ensine cursos"; +$EditPortfolioItem = "Editar item do portfólio"; +$PortfolioItemAdded = "Item de portfólio adicionado"; +$ExploreMoreCourses = "Explore mais cursos"; +$LinksOfInterest = "Links de interesse"; +$ExportToChamiloFormat = "Exportar para o formato Chamilo"; +$CoursesComingSoon = "Courses coming soon"; +$SalePrice = "Preço de venda"; +$BuyNow = "compre"; +$DocumentGroupCollaborationMode = "Modo de colaboração"; +$DocumentGroupReadOnlyMode = "Modo somente leitura"; +$GroupDocumentAccess = "Acesso ao documento"; +$DocumentGroupShareMode = "Modo de compartilhamento"; +$SessionDurationXDaysTotal = "Esta sessão tem uma duração limitada de %s dias"; +$LastMonth = "Mês passado"; +$ThisMonth = "Este mês"; +$PortalUserSessionStats = "Estatísticas da sessão do usuário do portal"; +$AddCustomToolsIntro = "Você pode adicionar uma introdução a esta página de ferramentas como um texto auxiliar para seus alunos. Basta clicar no ícone de edição para adicionar algum texto. Este breve texto de informação aqui é invisível para os alunos e você pode deixar este bloco vazio, mas o que você digitará será visível para eles."; +$TheDocumentAutoLaunchSettingIsOnStudentsWillBeRedirectToTheDocumentTool = "A configuração do recurso de início automático do documento está ativada. Os alunos serão redirecionados automaticamente para a ferramenta de documentos."; +$DocumentAutoLaunch = "Lançamento automático para documentos"; +$RedirectToTheDocumentList = "Redirecionar para a lista de documentos"; +$TheExerciseAutoLaunchSettingIsONStudentsWillBeRedirectToTheExerciseList = "A configuração do recurso de início automático de exercícios está ativada. Os alunos serão automaticamente redirecionados para a lista de exercícios."; +$PostedExpirationDate = "Prazo publicado para envio do trabalho (visível ao aluno)"; +$BossAlertMsgSentToUserXTitle = "Mensagem de acompanhamento sobre o aluno %s"; +$BossAlertUserXSentMessageToUserYWithLinkZ = "Oi, o + +usuário %s enviou uma mensagem de acompanhamento sobre o aluno %s. + +A mensagem pode ser vista aqui %s"; +$include_services = "Incluir serviços"; +$culqi_enable = "Habilitar culqi"; +$SelectedUsersDisabled = "Os usuários selecionados foram todos desativados"; +$SomeUsersNotDisabled = "Alguns dos usuários selecionados não foram desativados. Recomendamos que você confirme qual, usando a pesquisa avançada."; +$SelectedUsersEnabled = "Os usuários selecionados foram todos habilitados."; +$SomeUsersNotEnabled = "Alguns dos usuários selecionados não foram ativados. Recomendamos que você confirme qual, usando a pesquisa avançada."; +$EncryptedData = "Dados criptografados"; +$RandomData = "Dados aleatórios"; +$PersonalDataReport = "Dados pessoais"; +$ComplexDataNotShown = "Dados complexos (não mostrados)"; +$PersonalDataIntroductionTitle = "Dados pessoais: introdução"; +$PersonalDataKeptOnYou = "Dados pessoais que mantemos sobre você"; +$PersonalDataPermissionsYouGaveUs = "Permissões que você nos deu"; +$PersonalDataResponsibleOrganizationTitle = "Organização responsável pelo tratamento de dados"; +$PersonalDataTreatmentTitle = "Tratamento de dados pessoais"; +$PersonalDataCollectionTitle = "Coleta de dados pessoais"; +$PersonalDataRecordingTitle = "Gravação de dados pessoais"; +$PersonalDataOrganizationTitle = "Organização de dados pessoais"; +$PersonalDataStructureTitle = "Estrutura de dados pessoais"; +$PersonalDataConservationTitle = "Conservação de dados pessoais"; +$PersonalDataAdaptationTitle = "Adaptação ou modificação de dados pessoais"; +$PersonalDataExtractionTitle = "Extração de dados pessoais"; +$PersonalDataConsultationTitle = "Consultas de dados pessoais"; +$PersonalDataUsageTitle = "Uso de dados pessoais"; +$PersonalDataCommunicationTitle = "Comunicação e compartilhamento de dados pessoais"; +$PersonalDataInterconnectionTitle = "Interconexão de dados pessoais"; +$PersonalDataLimitationTitle = "Limitação de dados pessoais"; +$PersonalDataDeletionTitle = "Exclusão de dados pessoais"; +$PersonalDataDestructionTitle = "Destruição de dados pessoais"; +$PersonalDataProfilingTitle = "Perfil de dados pessoais"; +$PersonalDataIntroductionText = "Nós respeitamos sua privacidade! Esta página reúne todos os aspectos dos dados pessoais que podemos estar mantendo em você, como os tratamos, o que você nos autorizou a fazer com eles e quem somos, em um esforço para cumprir a maioria das leis de privacidade de dados disponíveis. Por favor, leia atentamente esta informação e, se tiver alguma questão, verifique os dados de contacto abaixo para nos pedir mais detalhes."; +$YourDegreeOfCertainty = "Seu grau de certeza"; +$DegreeOfCertaintyThatMyAnswerIsCorrect = "Grau de certeza de que minha resposta será considerada correta"; +$IncorrectAnswersX = "Respostas incorretas: %s"; +$KindRegards = "Atenciosamente,"; +$DoNotReply = "Por favor, não responda"; +$ResultAccomplishedTest = "Resultados para o teste realizado"; +$YourResultsByDiscipline = "Seus resultados por disciplina"; +$ForComparisonYourLastResultToThisTest = "Em comparação, seus resultados mais recentes para este teste"; +$YourOverallResultForTheTest = "Seus resultados gerais para o teste"; +$QuestionDegreeCertaintyHTMLMail = "Você encontrará seus resultados para o teste %s abaixo. +Para ver os detalhes destes resultados: + +1. Conecte-se à plataforma (login/senha): Para a plataforma. + +2. Clique neste link: veja os resultados detalhados."; +$DegreeOfCertaintyVerySure = "Muita certeza"; +$DegreeOfCertaintyVerySureDescription = "Sua resposta estava correta e você tinha 80% de certeza sobre isso. Parabéns!"; +$DegreeOfCertaintyPrettySure = "Com certeza"; +$DegreeOfCertaintyPrettySureDescription = "Sua resposta estava correta, mas você não estava completamente certo (apenas 60% a 70% de certeza)"; +$DegreeOfCertaintyDeclaredIgnorance = "Ignorância declarada"; +$DegreeOfCertaintyDeclaredIgnoranceDescription = "Você não sabia a resposta - apenas 50% de certeza"; +$DegreeOfCertaintyUnsure = "Inseguro"; +$DegreeOfCertaintyUnsureDescription = "Sua resposta estava incorreta, mas você adivinhou que era (60% a 70% de certeza)"; +$DegreeOfCertaintyVeryUnsure = "Muito inseguro"; +$DegreeOfCertaintyVeryUnsureDescription = "Sua resposta estava incorreta, embora você tivesse cerca de 80% (ou mais) de que estava errada"; +$DegreeOfCertaintyIDeclareMyIgnorance = "Eu não sei a resposta e escolhi aleatoriamente"; +$DegreeOfCertaintyIAmVeryUnsure = "Estou muito inseguro"; +$DegreeOfCertaintyIAmUnsure = "Não tenho certeza"; +$DegreeOfCertaintyIAmPrettySure = "Eu tenho certeza"; +$DegreeOfCertaintyIAmSure = "Tenho quase 100% de certeza"; +$DegreeOfCertaintyIAmVerySure = "Tenho certeza absoluta"; +$MultipleAnswerTrueFalseDegreeCertainty = "Resposta múltipla verdadeiro/falso/grau de certeza"; +$IgnoranceAnswersX = "Ignorância: %s"; +$CorrectAnswersX = "Respostas corretas: %s"; +$TotalHours = "Total de horas"; +$MinutesPerDay = "Minutos por dia"; +$ClassroomActivity = "Atividade de sala de aula"; +$OneDay = "1 dia"; +$UserXAnonymized = "As informações do usuário %s são anonimizadas."; +$CannotAnonymizeUserX = "Não foi possível anonimizar as informações do usuário %s. Por favor, tente novamente ou verifique os registros."; +$NoPermissionToAnonymizeUserX = "Você não tem permissão para anonimizar o usuário %s. Você precisa das mesmas permissões para excluir usuários."; +$Anonymize = "Anonimizar"; +$XQuestions = "%d perguntas"; +$WebFolderRefreshSucceeded = "Os estilos e recursos na web/pasta foram atualizados."; +$WebFolderRefreshFailed = "Os estilos e recursos na web/pasta não puderam ser atualizados, provavelmente devido a um problema de permissão. Certifique-se de que a web/pasta é gravável pelo seu servidor web."; +$CopyTextToClipboard = "Copiar texto"; ?> \ No newline at end of file diff --git a/main/lang/dutch/trad4all.inc.php b/main/lang/dutch/trad4all.inc.php index 625439cc3f..4ae9312ca4 100644 --- a/main/lang/dutch/trad4all.inc.php +++ b/main/lang/dutch/trad4all.inc.php @@ -2329,7 +2329,7 @@ $GroupDescription = "Beschrijving groep"; $GroupMembers = "Deelnemer(s) van deze groep"; $EditGroup = "Deze groep wijzigen"; $GroupSettingsModified = "Parameters van deze groep zijn gewijzigd."; -$GroupTooMuchMembers = "Het aantal deelnemers overschrijdt het maximumaantal dat u bepaald had. De samenstelling van de groep werd niet gewijzigd. U kan het maximum aantal hieronder wijzigen."; +$GroupTooMuchMembers = "Het aantal deelnemers overschrijdt het maximumaantal dat u bepaald had. De samenstelling van de groep werd niet gewijzigd. U kan het maximum aantal in de groepsinstellingen wijzigen."; $GroupTutor = "Groepsbegeleider"; $GroupNoTutor = "(geen)"; $GroupNone = "(geen)"; diff --git a/main/lang/english/trad4all.inc.php b/main/lang/english/trad4all.inc.php index 04e9b696ba..1eacfbc0a9 100644 --- a/main/lang/english/trad4all.inc.php +++ b/main/lang/english/trad4all.inc.php @@ -104,7 +104,7 @@ $MultiplicationStar = "Multiplication:\t\t\t*"; $SubstractionMinus = "Substraction:\t\t\t-"; $SummationPlus = "Summation:\t\t\t+"; $NotationList = "Formula notation"; -$SubscribeToSessionRequest = "Request for subscription to a session"; +$SubscribeToSessionRequest = "Request subscription"; $PleaseSubscribeMeToSession = "Please consider subscribing me to session"; $SearchActiveSessions = "Search active sessions"; $UserNameHasDash = "The username cannot contain the '-' character"; @@ -747,7 +747,7 @@ $ToolIntro = "Tool introduction"; $UploadError = "Upload failed, please check maximum file size limits and folder rights."; $DocumentsWillBeAddedToo = "Documents will be added too"; $ToExportLearnpathWithQuizYouHaveToSelectQuiz = "If you want to export a course containing a test, you have to make sure the corresponding tests are included in the export, so you have to select them in the list of tests."; -$ArchivesDirectoryNotWriteableContactAdmin = "The archives directory, used by this tool, is not writeable. Please contact your platform administrator."; +$ArchivesDirectoryNotWriteableContactAdmin = "The app/cache/ directory, used by this tool, is not writeable. Please contact your platform administrator."; $DestinationCourse = "Target course"; $ConvertToMultipleAnswer = "Convert to multiple answer"; $CasMainActivateComment = "Enabling CAS authentication will allow users to authenticate with their CAS credentials.
Go to Plugin to add a configurable 'CAS Login' button for your Chamilo campus."; @@ -793,7 +793,7 @@ $ChooseCam = "Choose Cam:"; $ChooseMic = "Choose Mic:"; $YouHaveToReconnectSoThatTheChangesTakeEffect = "You have to reconnect so that the changes take effect."; $ChangeSettings = "Change settings"; -$CourseLanguage = "Language:"; +$CourseLanguage = "Course language"; $ConfirmClearWhiteboard = "Confirm Clear Whiteboard"; $ShouldWitheboardBeClearedBeforeNewImage = "Should the whiteboard be cleared before I add a new Image?"; $DontAskMeAgain = "Don't ask me again"; @@ -1512,8 +1512,8 @@ $administratorNameTitle = "Portal Administrator: First Name"; $administratorNameComment = "The First Name of the Platform Administrator (appears in the footer on the left)"; $ShowAdministratorDataTitle = "Platform Administrator Information in footer"; $ShowAdministratorDataComment = "Show the Information of the Platform Administrator in the footer?"; -$HomepageViewTitle = "Course homepage design"; -$HomepageViewComment = "How would you like the homepage of a course to look?"; +$HomepageViewTitle = "Course homepage layout"; +$HomepageViewComment = "How would you like the homepage of a course to look (icons layout)?"; $HomepageViewDefault = "Two column layout. Inactive tools are hidden"; $HomepageViewFixed = "Three column layout. Inactive tools are greyed out (Icons stay on their place)"; $ShowToolShortcutsTitle = "Tools shortcuts"; @@ -1776,7 +1776,7 @@ $UserLocked = "User locked"; $UserUnlocked = "User unlocked"; $CannotDeleteUser = "You cannot delete this user"; $SelectedUsersDeleted = "Selected users deleted"; -$SomeUsersNotDeleted = "Some users has not been deleted"; +$SomeUsersNotDeleted = "Some of the selected users have not been deleted. We recommend you confirm which, by using the advanced search."; $ExternalAuthentication = "External authentification"; $RegistrationDate = "Registration date"; $UserUpdated = "User updated"; @@ -2375,7 +2375,7 @@ $GroupDescription = "Group description"; $GroupMembers = "Group members"; $EditGroup = "Edit this group"; $GroupSettingsModified = "Group settings modified"; -$GroupTooMuchMembers = "Number proposed exceeds max. that you allowed (you can modify it below). \t\t\t\tGroup composition has not been modified"; +$GroupTooMuchMembers = "Number proposed exceeds max. that you allowed (you can modify in the group settings). Group composition has not been modified"; $GroupTutor = "Group tutor"; $GroupNoTutor = "(none)"; $GroupNone = "(none)"; @@ -2547,7 +2547,7 @@ $WarningEditingDocument = "When you edit an existing document in Courses, the ne $CreateTheExercise = "Adding a test to the course"; $MoveTheCurrentExercise = "Move the current test"; $EditCurrentExecice = "Edit the current test"; -$UploadScorm = "Import SCORM course"; +$UploadScorm = "Import AICC, SCORM and Chamilo learning path"; $PowerPointConvert = "Chamilo RAPID"; $LPCreatedToContinue = "To continue add a section or a learning object or activity to your course."; $LPCreatedAddChapterStep = "

\"practicerAnim.gif\"Welcome to the Chamilo course authoring tool !

  • Build : Add learning objects and activities to your course
  • Organize : Add audio comments and order learning objects in the table of contents
  • Display : Watch the course from learner's viewpoint
  • Add section : Chapter 1, Chapter 2 or Week 1, Week 2...
  • Add learning object or activity : activities, tests, videos, multimedia pages
"; @@ -4221,7 +4221,7 @@ $ToolName = "Import Blackboard courses"; $TrackingDisabled = "Reporting has been disabled by system administrator."; $InactivesStudents = "Learners not connected for a week or more"; $AverageTimeSpentOnThePlatform = "Time spent on portal"; -$AverageCoursePerStudent = "Courses by learner"; +$AverageCoursePerStudent = "Average number of courses to which my learners are subscribed"; $AverageProgressInLearnpath = "Progress in courses"; $AverageResultsToTheExercices = "Tests score"; $SeeStudentList = "See the learners list"; @@ -5163,7 +5163,7 @@ $MakeQualifiable = "Add to gradebook"; $QualificationNumberOver = "Score"; $WeightInTheGradebook = "Weight inside assessment"; $DatesAvailables = "Date limits"; -$ExpiresAt = "Expires at"; +$ExpiresAt = "Posted sending deadline"; $DirectoryCreated = "Directory created"; $Assignment = "Assignments"; $ExpiryDateToSendWorkIs = "Deadline for assignments"; @@ -6613,7 +6613,7 @@ $BestScoredPages = "Best scores pages"; $MProgressPages = "Highest progress pages"; $MostDiscussUsers = "Most discussed users"; $RandomPage = "Random page"; -$DateExpiredNotBeLessDeadLine = "The expiration date cannot be smaller than the deadline."; +$DateExpiredNotBeLessDeadLine = "The date of effective blocking of sending the work can not be before the displayed posting deadline."; $NotRevised = "Not reviewed"; $DirExists = "The operation is impossible, a directory with this name already exists."; $DocMv = "Document moved"; @@ -6680,7 +6680,7 @@ $ReviewQuestions = "Review selected questions"; $YouTriedToResolveThisExerciseEarlier = "You have tried to resolve this exercise earlier"; $NoCookies = "You do not have cookies support enabled in your browser. Chamilo relies on the feature called \"cookies\" to store your connection details. This means you will not be able to login if cookies are not enabled. Please change your browser configuration (generally in the Edit -> Preferences menu) and reload this page."; $NoJavascript = "Your do not have JavaScript support enabled in your browser. Chamilo relies heavily on JavaScript to provide you with a more dynamic interface. It is likely that most feature will work, but you might not benefit from the latest improvements in usability. We recommend you change your browser configuration (generally under the Edit -> Preferences menu) and reload this page."; -$NoFlash = "You do not seems to have Flash support enabled in your browser. Chamilo only relies on Flash for a few features and will not lock you out in any way if you don't have it, but if you want to benefit from the complete set of tools from Chamilo, we recommend you install the Flash Plugin and restart your browser."; +$NoFlash = "You do not seem to have Flash support enabled in your browser. Chamilo only relies on Flash for a few features and will not lock you out in any way if you don't have it, but if you want to benefit from the complete set of tools from Chamilo, we recommend you install the Flash Plugin and restart your browser."; $ThereAreNoQuestionsForThisExercise = "There are no questions for this exercise"; $Attempt = "Attempt"; $SaveForNow = "Save and continue later"; @@ -8068,7 +8068,7 @@ $ThisEmailWasSentViaCourseXInSessionX = "This e-mail was sent via course %s in s $Diagram = "Diagram"; $CareerXDoesntHaveADiagram = "Career %s doesn't have a diagram."; $ExerciseCategoryAllSessionsReport = "Exercise report by category for all sessions"; -$MailConfirmation = "Activate account by confirmation email"; +$MailConfirmation = "Require e-mail confirmation"; $RegistrationConfirmation = "Registration confirmation"; $AccountNotConfirmed = "Your account is inactive because you have not confirmed it yet. Check your email and follow the instructions or click the following link to resend the email"; $RegistrationConfirmationEmailMessage = "To complete your platform registration you need confirm your account by clicking the following link"; @@ -8124,4 +8124,157 @@ $YourResultAtXBlocksThisElement = "Your result at %s blocks this step"; $RegistrationRoleWhatDoYouWantToDo = "What do you want to do?"; $RegistrationRoleFollowCourses = "Follow courses"; $RegistrationRoleTeachCourses = "Teach courses"; +$EditPortfolioItem = "Edit portfolio item"; +$PortfolioItemAdded = "Portfolio item added"; +$ExploreMoreCourses = "Explore more courses"; +$LinksOfInterest = "Links of interest"; +$ExportToChamiloFormat = "Export to Chamilo format"; +$CoursesComingSoon = "Courses coming soon"; +$SalePrice = "Sale price"; +$BuyNow = "Buy now"; +$DocumentGroupCollaborationMode = "Collaboration mode"; +$DocumentGroupReadOnlyMode = "Read only mode"; +$GroupDocumentAccess = "Document access"; +$DocumentGroupShareMode = "Share mode"; +$SessionDurationXDaysTotal = "This session has a limited duration of %s days"; +$LastMonth = "Last month"; +$ThisMonth = "This month"; +$PortalUserSessionStats = "Portal user session stats"; +$AddCustomToolsIntro = "You may add an introduction to this tool page as a helper text for your students. Simply click the edit icon to add some text. This short info text here is invisible to students and you can just leave this block empty, but what you will type will be visible to them."; +$TheDocumentAutoLaunchSettingIsOnStudentsWillBeRedirectToTheDocumentTool = "The document auto-launch feature configuration is enabled. Learners will be automatically redirected to document tool."; +$DocumentAutoLaunch = "Auto-launch for documents"; +$RedirectToTheDocumentList = "Redirect to the document list"; +$TheExerciseAutoLaunchSettingIsONStudentsWillBeRedirectToTheExerciseList = "The exercises auto-launch feature configuration is enabled. Learners will be automatically redirected to exercise list."; +$PostedExpirationDate = "Posted deadline for sending the work (Visible to the learner)"; +$BossAlertMsgSentToUserXTitle = "Follow up message about student %s"; +$BossAlertUserXSentMessageToUserYWithLinkZ = "Hi,

+ +User %s sent a follow up message about student %s.

+ +The message can be seen here %s"; +$include_services = "Include services"; +$culqi_enable = "Enable culqi"; +$SelectedUsersDisabled = "The selected users have all been disabled"; +$SomeUsersNotDisabled = "Some of the selected users have not been disabled. We recommend you confirm which, by using the advanced search."; +$SelectedUsersEnabled = "The selected users were all enabled."; +$SomeUsersNotEnabled = "Some of the selected users have not been enabled. We recommend you confirm which, by using the advanced search."; +$EncryptedData = "Encrypted data"; +$RandomData = "Random data"; +$PersonalDataReport = "Personal data"; +$ComplexDataNotShown = "Complex data (not shown)"; +$PersonalDataIntroductionTitle = "Personal data: introduction"; +$PersonalDataKeptOnYou = "Personal data we keep about you"; +$PersonalDataPermissionsYouGaveUs = "Permissions you gave us"; +$PersonalDataResponsibleOrganizationTitle = "Organization responsible for your data treatment"; +$PersonalDataTreatmentTitle = "Personal data treatment"; +$PersonalDataCollectionTitle = "Personal data collection"; +$PersonalDataRecordingTitle = "Personal data recording"; +$PersonalDataOrganizationTitle = "Personal data organization"; +$PersonalDataStructureTitle = "Personal data structure"; +$PersonalDataConservationTitle = "Personal data conservation"; +$PersonalDataAdaptationTitle = "Personal data adaptation or modification"; +$PersonalDataExtractionTitle = "Personal data extraction"; +$PersonalDataConsultationTitle = "Personal data queries"; +$PersonalDataUsageTitle = "Personal data use"; +$PersonalDataCommunicationTitle = "Personal data communication and sharing"; +$PersonalDataInterconnectionTitle = "Personal data interconnection"; +$PersonalDataLimitationTitle = "Personal data limitation"; +$PersonalDataDeletionTitle = "Personal data deletion"; +$PersonalDataDestructionTitle = "Personal data destruction"; +$PersonalDataProfilingTitle = "Personal data profiling"; +$PersonalDataIntroductionText = "We respect your privacy! +This page unites all aspects of the personal data we might be keeping on you, how we treat it, what you have authorized us to do with it and who we are, in an effort to comply with most data privacy laws available. +Please read this information carefully and, if you have any question, check the contact details below to ask us for more details."; +$YourDegreeOfCertainty = "Your degree of certainty"; +$DegreeOfCertaintyThatMyAnswerIsCorrect = "Degree of certainty that my answer will be considered correct"; +$IncorrectAnswersX = "Incorrect answers: %s"; +$KindRegards = "Kind regards,"; +$DoNotReply = "Please do not reply"; +$ResultAccomplishedTest = "Results for the accomplished test"; +$YourResultsByDiscipline = "Your results by discipline"; +$ForComparisonYourLastResultToThisTest = "In comparison, your latest results for this test"; +$YourOverallResultForTheTest = "Your overall results for the test"; +$QuestionDegreeCertaintyHTMLMail = "You will find your results for test %s below.
+To see the details of these results: +

+1. Connect to the platform (login/password): To the platform. +

+2. Click this link: See detailed results."; +$DegreeOfCertaintyVerySure = "Very sure"; +$DegreeOfCertaintyVerySureDescription = "Your answer was correct and you were 80% sure about it. Congratulations!"; +$DegreeOfCertaintyPrettySure = "Pretty sure"; +$DegreeOfCertaintyPrettySureDescription = "Your answer was correct but you were not completely sure (only 60% to 70% sure)"; +$DegreeOfCertaintyDeclaredIgnorance = "Declared ignorance"; +$DegreeOfCertaintyDeclaredIgnoranceDescription = "You didn't know the answer - only 50% sure"; +$DegreeOfCertaintyUnsure = "Unsure"; +$DegreeOfCertaintyUnsureDescription = "Your answer was incorrect, but you guessed it was (60% to 70% sure)"; +$DegreeOfCertaintyVeryUnsure = "Very unsure"; +$DegreeOfCertaintyVeryUnsureDescription = "Your answer was incorrect although you were about 80% (or more) sure it was wrong"; +$DegreeOfCertaintyIDeclareMyIgnorance = "I don't know the answer and I've picked at random"; +$DegreeOfCertaintyIAmVeryUnsure = "I am very unsure"; +$DegreeOfCertaintyIAmUnsure = "I am unsure"; +$DegreeOfCertaintyIAmPrettySure = "I am pretty sure"; +$DegreeOfCertaintyIAmSure = "I am almost 100% sure"; +$DegreeOfCertaintyIAmVerySure = "I am totally sure"; +$MultipleAnswerTrueFalseDegreeCertainty = "Multiple answer true/false/degree of certainty"; +$IgnoranceAnswersX = "Ignorance: %s"; +$CorrectAnswersX = "Correct answers: %s"; +$TotalHours = "Total hours"; +$MinutesPerDay = "Minutes per day"; +$ClassroomActivity = "Classroom activity"; +$OneDay = "1 day"; +$UserXAnonymized = "User %s's information anonymized."; +$CannotAnonymizeUserX = "We could not anonymize user %s's information. Please try again or check the logs."; +$NoPermissionToAnonymizeUserX = "You don't have permissions to anonymize user %s. You need the same permissions as to delete users."; +$Anonymize = "Anonymize"; +$XQuestions = "%d questions"; +$WebFolderRefreshSucceeded = "The styles and assets in the web/ folder have been refreshed."; +$WebFolderRefreshFailed = "The styles and assets in the web/ folder could not be refreshed, probably due to a permissions problem. Make sure the web/ folder is writeable by your web server."; +$CopyTextToClipboard = "Copy text"; +$WeNeedYouToAcceptOurTreatmentOfYourData = "We need you to accept our treatment of your data in order to provide you with this service. If you want to register an account, please accept the terms and click Submit. If you don't accept, no personal data will be treated by us about you."; +$NoTermsAndConditionsAvailable = "No terms and conditions available"; +$Skype = "Skype"; +$PersonalDataOfficerName = "Personal data officer's name"; +$PersonalDataOfficerRole = "Personal data officer's role"; +$Assets = "Assets"; +$TotalLPTime = "Total learnpath time"; +$AddStatus = "Add status"; +$AddProject = "Add project"; +$AddPriority = "Add priority"; +$NotAccepted = "Rejected"; +$UserPermissions = "User permissions"; +$ExportToPdf = "Export to PDF"; +$GoToThread = "Go to thread"; +$TimeDifference = "Time difference"; +$SessionAdministrator = "Session administrator"; +$ThereIsASequenceResourceLinkedToThisSessionYouNeedToDeleteItFirst = "There is a sequence resource linked to this session. You must delete this link first."; +$AddAnnotationText = "Add annotation text"; +$AddAnnotationPath = "Add annotation path"; +$Driver = "Driver"; +$UploadTmpDirInfo = "The temporary upload directory is a space on the server where files are uploaded before being filtered and treated by PHP."; +$GenerateCustomReport = "Generate custom report"; +$ToDo = "To do"; +$PleaseEnterURL = "Please enter the URL"; +$IfYouWantToGetTheCertificateAndOrSkillsAsociatedToThisCourseYouNeedToBuyTheCertificateServiceYouCanGoToServiceCatalogClickingHere = "If you want to get the certificate and/or skills associated with this course, you need to buy the certificate service. You can go to the services catalog by clicking this link: %s"; +$SubSkill = "Sub-skill"; +$AddMultipleUsersToCalendar = "Add multiple users to calendar"; +$UpdateCalendar = "Update calendar"; +$ControlPoint = "Control point"; +$MessageQuestionCertainty = "Please follow the instructions below to check your results for test %s.

+1. Connect to the platform (username/password) at: %s
+2. Click the following link: %s
"; +$SessionMinDuration = "Session min duration"; +$CanNotTranslate = "Could not translate"; +$AddSkills = "Add skills"; +$Dictionary = "Dictionary"; +$CategoryExists = "Category exists"; +$MinimumGradebookToValidate = "Minimum to validate"; +$NumberOfGradebookToValidateInDependence = "Number of gradebooks to validate in dependencies"; +$DependsOnGradebook = "Depends on gradebook"; +$ThisGradebookDoesntHaveDependencies = "This gradebook has no dependency"; +$CourseIntroductionsAllImportedSuccessfully = "Course introductions all imported successfully."; +$FilterSessions = "Filter sessions"; +$ScoreModel = "Score model"; +$SyncDatabaseWithSchema = "Synchronize the database with the schema"; +$SkillRelCourses = "Courses-Skills associations"; ?> \ No newline at end of file diff --git a/main/lang/french/trad4all.inc.php b/main/lang/french/trad4all.inc.php index 6897f9ada6..87302695d6 100644 --- a/main/lang/french/trad4all.inc.php +++ b/main/lang/french/trad4all.inc.php @@ -2,7 +2,7 @@ /* for more information: see languages.txt in the lang folder. */ -$OpenBadgesBannerText = "Vous pouvez maintenant créer des insignes qui reconnaissent les compétences appris par vos utilisateurs, les récompensent pour leurs efforts et au travers desquels ils pourront démontrer leurs compétences acquises sur leur page de profil. Pour plus d'informations au sujet d'OpenBadges: http://openbadges.org."; +$OpenBadgesBannerText = "Vous pouvez maintenant créer des insignes qui reconnaissent les compétences apprisent par vos utilisateurs, les récompenses pour leurs efforts et au travers desquels ils pourront démontrer leurs compétences acquises sur leur page de profil. Pour plus d'informations au sujet d'OpenBadges: http://openbadges.org."; $OpenBadgesIntroduction = "Vous pouvez maintenant élaborer des badges pour récompenser l'acquisition de compétences au travers des cours sur ce campus virtuel."; $DesignANewBadgeComment = "Élaborez un nouveau badge, téléchargez-le et utilisez-le dans le formulaire du badge."; $TheBadgesWillBeSentToThatBackpack = "Les badges seront envoyés vers ce sac à dos"; @@ -39,7 +39,7 @@ $TemplateCertificateComment = "Exemple de certificat"; $TemplateCertificateTitle = "Certificat"; $ResultsVisibility = "Visibilité des résultats"; $DownloadCertificate = "Télécharger certificat"; -$PortalActiveCoursesLimitReached = "Désolé, cette installation dispose d'une limite de cours qui a été atteinte à présent. Vous pouvez toujours créer de nouveaux cours, mais uniquement si vous cachez/désactivez au moins un cours actif actuellement. Afin d'utiliser cette méthode, éditez un cours depuis la liste des cours de la page d'administration et changez sa visibilité à 'caché', puis essayer de nouveau de créer ce cours. Afin d'augmenter le nombre maximum de cours actifs autorisés sur cette installation, veuillez contacter votre fournisseur d'hébergement ou, si cette méthode est disponible, passez à un plan d'hébergement supérieur."; +$PortalActiveCoursesLimitReached = "Désolé, la limite de cours a été atteinte pour cette installation. Vous pouvez toujours créer de nouveaux cours, mais uniquement si vous cachez/désactivez au moins un cours actif actuellement. Afin d'utiliser cette méthode, éditez un cours depuis la liste des cours de la page d'administration et changez sa visibilité à 'caché', puis essayez de nouveau de créer ce cours. Afin d'augmenter le nombre maximum de cours actifs autorisés sur cette installation, veuillez contacter votre fournisseur d'hébergement ou, si cette méthode est disponible, passez à un plan d'hébergement supérieur."; $WelcomeToInstitution = "Bienvenu(e) sur le campus de %s"; $WelcomeToSiteName = "Bienvenue à %s"; $RequestAccess = "Demande d'accès"; @@ -104,7 +104,7 @@ $MultiplicationStar = "Multiplication:\t\t\t*"; $SubstractionMinus = "Soustraction:\t\t\t-"; $SummationPlus = "Somme:\t\t\t\t+"; $NotationList = "Syntaxe de formules"; -$SubscribeToSessionRequest = "Requête d'inscription à une session"; +$SubscribeToSessionRequest = "Solliciter inscription"; $PleaseSubscribeMeToSession = "Merci de bien vouloir considérer mon inscription à la session"; $SearchActiveSessions = "Recherche sessions actives"; $UserNameHasDash = "Le nom d'utilisateur ne peut pas contenir de tirets (-)"; @@ -383,7 +383,7 @@ $AnsweredZ = "(%s) Répondu"; $CurrentQuestionZ = "(%s) question actuelle"; $ToReviewZ = "(% s) Examiner"; $ReturnToExerciseList = "Retour à la liste des exercices"; -$ExerciseAutoLaunch = "Auto-lancement pour les exercices"; +$ExerciseAutoLaunch = "Auto-démarrage pour les exercices"; $AllowFastExerciseEdition = "Activer le mode d'édition rapide d'exercices"; $Username = "Nom d'utilisateur"; $SignIn = "Connectez-vous"; @@ -740,7 +740,7 @@ $ToolIntro = "Introduction"; $UploadError = "l'upload n'a pas fonctionné, veuillez vérifier les limites de taille de fichiers autorisée et les permissions de vos répertoires."; $DocumentsWillBeAddedToo = "Les documents seront également ajoutés"; $ToExportLearnpathWithQuizYouHaveToSelectQuiz = "Si vous désirez exporter un cours contenant des tests, il est nécessaire d'inclure ces tests dans l'export en les sélectionnant dans la liste des tests."; -$ArchivesDirectoryNotWriteableContactAdmin = "Le répertoire d'archives, utilisé par cet outil, ne dispose pas des accès en écriture attendus. Veuillez contacter l'administrateur de la plateforme à ce sujet."; +$ArchivesDirectoryNotWriteableContactAdmin = "Le répertoire app/cache/, utilisé par cet outil, ne dispose pas des accès en écriture. Veuillez contacter l'administrateur de la plateforme à ce sujet."; $DestinationCourse = "Cours de destination"; $ConvertToMultipleAnswer = "Convertir en question à réponses multiples (QRM)"; $CasMainActivateComment = "Activer l'authentification CAS permettra aux utilisateurs de s'identifier à l'aide de leur compte CAS
Vous trouverez dans les Plugin un bouton 'Login CAS', paramétrable, qui s'ajoutera sur la page d'accueil de votre campus Chamilo."; @@ -781,13 +781,13 @@ $AlreadyIn = "Déjà connectés"; $CheckIn = "Déjà connectés"; $TheModeratorHasLeft = "Le modérateur a quitté la conférence."; $SystemMessage = "Message système"; -$ChooseDevices = "Sélectionnez les périphériques"; +$ChooseDevices = "Sélectionner les périphériques"; $ChooseCam = "Sélection de la caméra:"; $ChooseMic = "Sélection du micro:"; $YouHaveToReconnectSoThatTheChangesTakeEffect = "Vous devez vous reconnecter pour activer les modifications."; $ChangeSettings = "Modifier les valeurs"; -$CourseLanguage = "Langue:"; -$ConfirmClearWhiteboard = "Confirmez l'effacement du tableau"; +$CourseLanguage = "Langue du cours"; +$ConfirmClearWhiteboard = "Confirmer l'effacement du tableau"; $ShouldWitheboardBeClearedBeforeNewImage = "Le tableau doit-il être effacé avant ajout d'une dia?"; $DontAskMeAgain = "Ne plus me demander"; $ShowConfirmationBeforeClearingWhiteboard = "Demander confirmation avant d'effacer le tableau"; @@ -911,7 +911,7 @@ $ExampleForumCategory = "Exemple de catégorie"; $ExampleForum = "Exemple de forum"; $ExampleThread = "Exemple de sujet"; $ExampleThreadContent = "Exemple de contenu"; -$IntroductionWiki = "Le mot \"Wiki\" est un raccourci pour WikiWikiWeb. Wikiwiki est un mot hawaïen signifiant rapide ou vitesse. Dans un wiki, les gens écrivent des pages ensemble. Si une personne fait une erreur, la personne suivante peut la corriger. La personne suivante peut également ajouter quelque chose de neuf à la page. Grâce à cela, la page s'améliore à chaque fois que quelqu'un la modifie."; +$IntroductionWiki = "Le mot \"Wiki\" est un raccourci pour WikiWikiWeb. Wikiwiki est un mot hawaïen signifiant rapide ou vitesse. Dans un wiki, les gens écrivent des pages ensemble. Si une personne fait une erreur, la personne suivante peut la corriger. La personne suivante peut également ajouter quelque chose de neuf à la page. Grâce à cela, la page s'améliore à chaque fois que quelqu'un la modifie. Optimise l'apprentissage par le travail collaboratif."; $CreateCourseArea = "Créer ce cours"; $CreateCourse = "Créer cours"; $TitleNotification = "Depuis votre dernière visite"; @@ -1505,8 +1505,8 @@ $administratorNameTitle = "Administrateur de la plateforme: prénom"; $administratorNameComment = "Le prénom de l'administrateur de la plateforme (apparaît dans le pied de page, du côté gauche)"; $ShowAdministratorDataTitle = "Informations de l'administrateur de la plateforme dans le pied de page"; $ShowAdministratorDataComment = "Afficher les informations sur l'administrateur de la plateforme dans le pied de page ?"; -$HomepageViewTitle = "Vue page d'accueil"; -$HomepageViewComment = "Comment se présente la page d'accueil d'un cours?"; +$HomepageViewTitle = "Présentation page principale des cours"; +$HomepageViewComment = "Comment sont disposés les icônes d'outils sur la page d'accueil des cours?"; $HomepageViewDefault = "Affichage en 2 colonnes. Les outils inactifs sont cachés"; $HomepageViewFixed = "Affichage en trois colonnes. Les outils inactifs sont grisés (les icônes restent à leur place)"; $ShowToolShortcutsTitle = "Raccourcis vers les outils"; @@ -1639,7 +1639,7 @@ $ShowNavigationMenuComment = "Afficher un menu de navigation qui facilite l'acc $LoginAs = "Identifié en tant que"; $ImportClassListCSV = "Importer une liste de classe (format CSV)"; $ShowOnlineWorld = "Afficher le nombre d'utilisateurs connectés sur la page d'accueil (visible par tous)"; -$ShowOnlineUsers = "Montrer le nombre d'utilisateurs en ligne toutes les pages (visible pour les personnes qui sont entrées)"; +$ShowOnlineUsers = "Montrer le nombre d'utilisateurs en ligne sur toutes les pages (visible pour les personnes authentifiées)"; $ShowOnlineCourse = "Afficher le nombre d'utilisateurs connectés à ce cours"; $ShowIconsInNavigationsMenuTitle = "Afficher les images dans le menu de navigation"; $SeeAllRightsAllRolesForSpecificLocation = "Endroit :"; @@ -2144,19 +2144,19 @@ $SearchNetworkTimeoutError = "La connexion a expiré lors de la communication av $SearchOtherXapianError = "Erreur dans le moteur de recherche"; $SearchXapianModuleNotInstalled = "Le module de recherche Xapian n'est pas installé"; $FieldRemoved = "Champ supprimé"; -$TheNewSubLanguageHasBeenAdded = "Le nouveau sous-langage a été ajouté"; -$DeleteSubLanguage = "Supprimer le sous-langage"; -$CreateSubLanguageForLanguage = "Créer un sous-langage pour ce langage"; +$TheNewSubLanguageHasBeenAdded = "Le nouveau jargon a été ajouté"; +$DeleteSubLanguage = "Supprimer le jargon"; +$CreateSubLanguageForLanguage = "Créer un jargon sur base de cette langue"; $DeleteSubLanguageFromLanguage = "Supprimer ce sous-langage"; -$CreateSubLanguage = "Créer sous-langage"; -$RegisterTermsOfSubLanguageForLanguage = "Définir de nouveaux termes pour ce sous-langage"; -$AddTermsOfThisSubLanguage = "Termes du sous-langage"; +$CreateSubLanguage = "Créer jargon (sous-langage)"; +$RegisterTermsOfSubLanguageForLanguage = "Définir de nouveaux termes pour ce jargon"; +$AddTermsOfThisSubLanguage = "Termes du jargon"; $LoadLanguageFile = "Charger fichier de langue"; -$AllowUseSubLanguageTitle = "Autoriser la définition et l'usage de sous-langages"; +$AllowUseSubLanguageTitle = "Autoriser la définition et l'usage de jargons"; $AllowUseSubLanguageComment = "En activant cette option, vous rendrez possible la définition de variations pour chacun des termes de langage utilisé dans l'interface de la plateforme, sous la forme d'un langage basé sur et étendant un langage existant. Vous trouverez cette option dans la section des langues du panneau d'administration, sous la forme d'une icône d'ajout."; -$AddWordForTheSubLanguage = "Ajouter des termes au sous-langage"; +$AddWordForTheSubLanguage = "Ajouter des termes au jargon"; $TemplateEdited = "Modèle mis à jour"; -$SubLanguage = "Sous-langage"; +$SubLanguage = "Jargon"; $LanguageIsNowVisible = "Le langage a été rendu visible et peut désormais être utilisé au sein de la plateforme."; $LanguageIsNowHidden = "Le langage a été caché. Il ne sera plus possible de l'utiliser jusqu'à ce qu'il soit rendu visible à nouveau."; $LanguageDirectoryNotWriteableContactAdmin = "Le répertoire /main/lang, utilisé sur cette plateforme pour stocker les langages, n'est pas accessible en écriture. Veuillez contacter l'administrateur de la plateforme et lui rapporter ce message."; @@ -2181,7 +2181,7 @@ $AllVersions = "Toutes les versions"; $EditTermsAndConditions = "Éditer les termes et conditions"; $ExplainChanges = "Expliquer les modifications"; $TermAndConditionNotSaved = "Termes et conditions non sauvegardés"; -$TheSubLanguageHasBeenRemoved = "Le sous-langage a été supprimé"; +$TheSubLanguageHasBeenRemoved = "Le jargon a été supprimé"; $AddTermsAndConditions = "Ajouter des termes et conditions"; $TermAndConditionSaved = "Termes et conditions sauvés"; $ListSessionCategory = "Liste des catégories de sessions"; @@ -2368,7 +2368,7 @@ $GroupDescription = "Description du groupe"; $GroupMembers = "Membres du groupe"; $EditGroup = "Éditer ce groupe"; $GroupSettingsModified = "Paramètres de ce groupe modifiés."; -$GroupTooMuchMembers = "Le nombre de membres proposé excède le nombre maximum que vous avez fixé. La composition du groupe n'a pas été modifiée. Vous pouvez modifer le nombre maximum ci-dessous."; +$GroupTooMuchMembers = "Le nombre de membres proposé excède le nombre maximum que vous avez fixé. La composition du groupe n'a pas été modifiée. Vous pouvez modifier le nombre maximum dans la configuration du groupe."; $GroupTutor = "Modérateur du groupe"; $GroupNoTutor = "(aucun)"; $GroupNone = "(aucune)"; @@ -2540,7 +2540,7 @@ $WarningEditingDocument = "Quand vous éditez un document existant dans un parco $CreateTheExercise = "Créer l'exercice"; $MoveTheCurrentExercise = "Déplacer l'excercice courant"; $EditCurrentExecice = "Éditer l'excercice courant"; -$UploadScorm = "Import AICC et SCORM"; +$UploadScorm = "Import AICC, SCORM et PARCOURS"; $PowerPointConvert = "Conversion PowerPoint"; $LPCreatedToContinue = "Pour continuer, vous pouvez ajouter un chapitre ou une étape à votre parcours depuis le menu de gauche"; $LPCreatedAddChapterStep = "Vous pouvez ajouter un chapitre ou une étape à votre parcours depuis le menu de gauche"; @@ -2851,8 +2851,8 @@ $StudentEmail = "Courriel de l'apprenant"; $OpenQuestionsAttemptedAre = "La question ouverte tentée est"; $UploadJpgPicture = "Envoyer une image au format JPG"; $HotspotDescription = "Description de la zone"; -$ExamSheetVCC = "Exercice vu/corrigé/commenté par un prof"; -$AttemptVCC = "Votre tentative détaillée ci-dessous a été vue/corrigée/commentée par un prof"; +$ExamSheetVCC = "Exercice vu/corrigé/commenté par un professeur"; +$AttemptVCC = "Votre tentative détaillée ci-dessous a été vue/corrigée/commentée par un professeur"; $ClickLinkToViewComment = "Cliquez sur le lien ci-dessous pour accéder à votre compte et voir votre feuille d'examen corrigée."; $Regards = "Cordialement"; $AttemptVCCLong = "Votre tentative pour l'exercice %s a été vue/commentée/corrigée par un responsable. Cliquez sur le ien suivant pour accéder à votre compte et voir la feuille d'examen."; @@ -4212,7 +4212,7 @@ $ToolName = "Importer des cours Blackboard"; $TrackingDisabled = "Le système de suivi a été désactivé par l'administrateur système."; $InactivesStudents = "Apprenants non connectés depuis une semaine ou plus"; $AverageTimeSpentOnThePlatform = "Temps moyen passé sur la plateforme"; -$AverageCoursePerStudent = "Nombre de cours moyen par apprenant"; +$AverageCoursePerStudent = "Nombre moyen de cours auxquels mes apprenants sont inscrits"; $AverageProgressInLearnpath = "Progression moyenne dans les parcours"; $AverageResultsToTheExercices = "Score moyen aux tests"; $SeeStudentList = "Voir la liste des apprenants"; @@ -5154,7 +5154,7 @@ $MakeQualifiable = "Activer dans le cahier de notes"; $QualificationNumberOver = "Évaluation sur..."; $WeightInTheGradebook = "Pondération dans le cahier de notes"; $DatesAvailables = "Dates disponibles"; -$ExpiresAt = "Expire le"; +$ExpiresAt = "Date limite d'envoi affichée"; $DirectoryCreated = "Dossier créé"; $Assignment = "Tâche"; $ExpiryDateToSendWorkIs = "Expiration pour la remise des travaux"; @@ -5515,7 +5515,7 @@ $ReminderMessage = "Envoyer un rappel"; $DateSent = "Date de réception"; $ViewUsersWithoutTask = "Travaux manquants"; $AsciiSvgTitle = "Activer AsciiSVG"; -$SuggestionOnlyToEnableSubLanguageFeatureOrUpgradeProcess = "Suggestion, uniquement nécessaire pour activer la fonctionnalité de sous-langage"; +$SuggestionOnlyToEnableSubLanguageFeatureOrUpgradeProcess = "Optionnel: uniquement nécessaire pour activer la fonctionnalité de jargon (sous-langage)"; $ThematicAdvance = "Progression du cours"; $EditProfile = "Éditer le profil"; $TabsDashboard = "Panneau de contrôle"; @@ -5696,7 +5696,7 @@ $ToolCourseMaintenance = "Maintenance"; $AreYouSureToDeleteAllDates = "Êtes-vous certain de vouloir supprimer toutes les dates?"; $ImportQtiQuiz = "Importer exercices QTI2"; $ISOCode = "Code ISO"; -$TheSubLanguageForThisLanguageHasBeenAdded = "Le sous-langage de ce langage a été ajouté"; +$TheSubLanguageForThisLanguageHasBeenAdded = "Le jargon a été ajouté à cette langue"; $ReturnToLanguagesList = "Retourner à la liste des langues"; $AddADateTime = "Ajouter une date/heure"; $ActivityCoach = "Le coach de la session a tous les droits et privilèges pour tous les cours appartenant à la session."; @@ -6370,7 +6370,7 @@ $OnlyLettersAndNumbers = "Seulement lettres (a-z) et chiffres (0-9)"; $HideCoursesInSessionsTitle = "Cacher les cours dans les sessions"; $HideCoursesInSessionsComment = "Lorsque les sessions apparaîssent sur la page des cours, cacher la liste des cours au sein des sessions (seulement montrer les cours au sein de l'écran spécifique aux sessions)."; $ShowGroupsToUsersTitle = "Montrer les classes aux apprenants"; -$ShowGroupsToUsersComment = "Montrer les classes aux utilisateurs. La fonctionnalité de classes permet d'inscrire/désinscrir des goupes d'utilisateurs à une session ou un cours directement, réduisant ainsi la charge administrative pour les inscriptions. Lorsque cette fonctionnalité est sélectionnée, les utilisateurs peuvent voir à quelle classe ils appartiennent à partir de leur interface de réseau social."; +$ShowGroupsToUsersComment = "Montrer les classes aux utilisateurs. La fonctionnalité de classes permet d'inscrire/désinscrire des groupes d'utilisateurs à une session ou un cours directement, réduisant ainsi la charge administrative pour les inscriptions. Lorsque cette fonctionnalité est sélectionnée, les utilisateurs peuvent voir à quelle classe ils appartiennent à partir de leur interface de réseau social."; $ExerciseWillBeActivatedFromXToY = "L'exercice sera disponible du %s au %s"; $ExerciseAvailableFromX = "Exercice disponible à partir du %s"; $ExerciseAvailableUntilX = "Exercice disponible jusqu'au %s"; @@ -6442,7 +6442,7 @@ $UnderMin = "En-dessous du minimum"; $SelectOptionExport = "Sélectionnez une option d'export"; $FieldEdited = "Champ ajouté."; $LanguageParentNotExist = "Le langage parent n'existe pas."; -$TheSubLanguageHasNotBeenRemoved = "Le sous-langage n'a pas été éliminé."; +$TheSubLanguageHasNotBeenRemoved = "Le jargon n'a pas été éliminé."; $ShowOrHide = "Montrer/Cacher"; $StatusCanNotBeChangedToHumanResourcesManager = "Le statut de cet utilisateur ne peut pas être modifié à directeur des ressources humaines."; $FieldTaken = "Champ pris"; @@ -6601,7 +6601,7 @@ $BestScoredPages = "Pages au score le plus haut"; $MProgressPages = "Pages au progrès le plus élevé"; $MostDiscussUsers = "Utilisateurs les plus discutés"; $RandomPage = "Page au hasard"; -$DateExpiredNotBeLessDeadLine = "La date d'expiration ne peut pas être antérieure à la date de fin."; +$DateExpiredNotBeLessDeadLine = "La date de blocage effectif de l'envoi du travail ne peut pas être antérieur à la date limite d'envoi affichée"; $NotRevised = "Non coté"; $DirExists = "Opération impossible, un répertoire du même nom existe déjà (peut-être dans une autre session)."; $DocMv = "Document déplacé."; @@ -7417,7 +7417,7 @@ $ShowProgress = "Montrer le progrès"; $XPercent = "%s %%"; $CheckRequirements = "Vérifier les pré-requis"; $ParentLanguageX = "Langue parente: %s"; -$RegisterTermsOfSubLanguageForX = "Définissez de nouveaux termes pour le sous-langage %s en cherchant un terme spécifique puis en sauvegardant chacune des traductions en cliquant sur le bouton correspondant. Pour visualiser les nouveaux termes, il faudra alors changer votre langue d'utilisateur dans votre profil."; +$RegisterTermsOfSubLanguageForX = "Définissez de nouveaux termes pour le jardon (sous-langage) %s en cherchant un terme spécifique puis en sauvegardant chacune des traductions en cliquant sur le bouton adjacent correspondant. Pour visualiser les nouveaux termes, il faudra alors changer votre langue d'utilisateur dans votre profil."; $SeeSequences = "Voir les séquences"; $SessionRequirements = "Pré-requis pour la session"; $IsRequirement = "Obligatoire pour compléter le cours"; @@ -7609,7 +7609,7 @@ $TeacherCanSelectCourseTemplateTitle = "L'enseignant peut choisir un cours comme $TeacherCanSelectCourseTemplateComment = "Permettre le choix d'un cours comme modèle lors de la création d'un nouveau cours par l'enseignant. Dans ce cas, les ressources du cours modèle seront copiées automatiquement comme base du nouveau cours."; $TheForumAutoLaunchSettingIsOnStudentsWillBeRedirectToTheForumTool = "La fonctionnalité auto-démarrage du forum est activée. Les apprenants seront redirigés vers la liste de forums automatiquement lorsqu'ils entreront dans ce cours."; $RedirectToForumList = "Rediriger ver la liste de forums"; -$EnableForumAutoLaunch = "Activar l'auto-démarrage des forums"; +$EnableForumAutoLaunch = "Activer l'auto-démarrage des forums"; $NowDownloadYourCertificateClickHere = "Télécharge ton certificat en cliquant ici"; $AdditionallyYouHaveObtainedTheFollowingSkills = "En plus, tu as acquis les compétences suivantes"; $IHaveObtainedSkillXOnY = "J'ai acquis la compétence %s sur %s"; @@ -7680,7 +7680,7 @@ $GlossaryTermAlreadyExists = "Ce terme existe déjà"; $LinkedInUrl = "URL de profil LinkedIn"; $SaveTheCorrectAnswersForTheNextAttempt = "Garder les réponses correctes pour l'essai suivant"; $TranslateThisTerm = "Traduire ce terme"; -$OnlyActiveSubLanguagesAreListed = "Seules les sous-langues actives sont listées ici"; +$OnlyActiveSubLanguagesAreListed = "Seuls les jargons actifs sont listés ici"; $Translation = "Traduction"; $IfThisTranslationExistsThisWillReplaceTheTerm = "Si ce terme a déjà été traduit, cette opération remplacera la traduction existante pour ce sous-langage."; $LastConnection = "Dernière connexion"; @@ -8005,7 +8005,7 @@ $ThisEmailWasSentViaCourseXInSessionX = "Cet e-mail a été envoyé via le cours $Diagram = "Diagramme"; $CareerXDoesntHaveADiagram = "La carrière %s n'a pas de diagramme."; $ExerciseCategoryAllSessionsReport = "Rapport d'exercice par catégorie dans toutes les sessions"; -$MailConfirmation = "Activer le compte après confirmation de l'e-mail"; +$MailConfirmation = "Exiger confirmation par e-mail"; $RegistrationConfirmation = "Confirmation d'inscription"; $AccountNotConfirmed = "Votre compte n'est pas encore actif parce que vous ne l'avez pas encore confirmé par e-mail. Vérifiez votre boîte mail et suivez les instructions, ou cliquez sur le lien suivant pour renvoyer un e-mail de confirmation."; $RegistrationConfirmationEmailMessage = "Pour compléter votre inscription sur la plateforme, vous devez confirmer votre compte en cliquant sur le lien suivant"; @@ -8061,4 +8061,150 @@ $YourResultAtXBlocksThisElement = "Votre score à l'étape \"%s\" ne vous permet $RegistrationRoleWhatDoYouWantToDo = "Que souhaitez-vous faire?"; $RegistrationRoleFollowCourses = "Suivre des cours"; $RegistrationRoleTeachCourses = "Enseigner"; +$EditPortfolioItem = "Éditer élément du portfolio"; +$PortfolioItemAdded = "Élément du portfolio enregistré"; +$ExploreMoreCourses = "Explorer plus de cours"; +$LinksOfInterest = "Liens d'intérêt"; +$ExportToChamiloFormat = "Exportation du parcours"; +$CoursesComingSoon = "Cours à paraître"; +$SalePrice = "Prix de vente"; +$BuyNow = "Acheter"; +$DocumentGroupCollaborationMode = "Mode collaboratif"; +$DocumentGroupReadOnlyMode = "Mode lecture seule"; +$GroupDocumentAccess = "Type d'usage"; +$DocumentGroupShareMode = "Mode partagé"; +$SessionDurationXDaysTotal = "Cette session a une durée limitée à %s jours"; +$LastMonth = "Mois passé"; +$ThisMonth = "Mois actuel"; +$PortalUserSessionStats = "Nombre d'apprenants par session et par portail"; +$AddCustomToolsIntro = "Ce texte est invisible pour vos apprenants tant qu'elle n'est pas modifiée, mais cette section vous permet de rajouter votre propre texte d'introduction à cet outil pour fournir une guidance localisée à vos apprenants. Pour introduire ce texte pour vos apprenants, cliquez sur l'icône d'édition."; +$TheDocumentAutoLaunchSettingIsOnStudentsWillBeRedirectToTheDocumentTool = "La fonctionnalité d'auto-démarrage des documents est activée. Les apprenants seront automatiquement redirigés vers l'outil documents."; +$DocumentAutoLaunch = "Auto-démarrage vers l'outil documents"; +$RedirectToTheDocumentList = "Rediriger vers la liste des documents"; +$TheExerciseAutoLaunchSettingIsONStudentsWillBeRedirectToTheExerciseList = "La fonctionnalité d'auto-démarrage des exercices est activée. Les apprenants seront automatiquement redirigés vers la liste des exercices."; +$PostedExpirationDate = "Date limite affichée d'envoi du travail (visible par l'apprenant)"; +$BossAlertMsgSentToUserXTitle = "Message de suivi concernant l'apprenant %s"; +$BossAlertUserXSentMessageToUserYWithLinkZ = "Bonjour,

+ +L'utilisateur %s a envoyé un message de suivi concernant l'apprenant %s.

+ +Le message est visible sur %s"; +$include_services = "Inclure les services"; +$culqi_enable = "Activé culqi"; +$SelectedUsersDisabled = "Les utilisateurs sélectionnés ont tous été désactivés."; +$SomeUsersNotDisabled = "Certains des utilisateurs sélectionnés n'ont pas été supprimés. Nous vous recommandons de confirmer lesquels en utilisant la recherche avancée."; +$SelectedUsersEnabled = "Tous les utilisateurs sélectionnés ont été activés."; +$SomeUsersNotEnabled = "Certains des utilisateurs sélectionnés n'ont pas été activés. Nous vous recommandons de confirmer lesquels en utilisant la recherche avancée."; +$EncryptedData = "Données encryptées"; +$RandomData = "Données aléatoires"; +$PersonalDataReport = "Données personnelles"; +$ComplexDataNotShown = "Données complexes non affichées"; +$PersonalDataIntroductionTitle = "Introduction à vos données personnelles"; +$PersonalDataKeptOnYou = "Données personnelles que nous conservons à votre sujet"; +$PersonalDataPermissionsYouGaveUs = "Permissions que vous nous avez données"; +$PersonalDataResponsibleOrganizationTitle = "Organisation responsable du traitement"; +$PersonalDataTreatmentTitle = "Traitement des données"; +$PersonalDataCollectionTitle = "Collecte des données personnelles"; +$PersonalDataRecordingTitle = "Enregistrement des données personnelles"; +$PersonalDataOrganizationTitle = "Organisation des données personnelles"; +$PersonalDataStructureTitle = "Structuration des données personnelles"; +$PersonalDataConservationTitle = "Conservation des données personnelles"; +$PersonalDataAdaptationTitle = "Adaptation ou modification des données personnelles"; +$PersonalDataExtractionTitle = "Extraction des données personnelles"; +$PersonalDataConsultationTitle = "Consultation des données personnelles"; +$PersonalDataUsageTitle = "Utilisation des données personnelles"; +$PersonalDataCommunicationTitle = "Communication et diffusion des données personnelles"; +$PersonalDataInterconnectionTitle = "Interconnexion des données personnelles"; +$PersonalDataLimitationTitle = "Limitation des données personnelles"; +$PersonalDataDeletionTitle = "Effacement des donnée personnelles"; +$PersonalDataDestructionTitle = "Destruction des donnée personnelles"; +$PersonalDataProfilingTitle = "Profilage des donnée personnelles"; +$PersonalDataIntroductionText = "Nous respectons vos données personnelles! Cette page unit tous les aspects correspondants aux données personnelles que nous pourrions conserver à votre sujet, comment nous les traitons et ce que vous nous avez autorisé de faire avec, ainsi que qui nous sommes, dans un effort de correspondance à la majorité des lois de protection des données disponibles et applicables. Merci de llire l'information à votre disposition avec attention. Si vous avez des questions, merci de localiser nos données de contact ci-dessous et de nous y envoyer vos questions."; +$YourDegreeOfCertainty = "Votre degré de certitude"; +$DegreeOfCertaintyThatMyAnswerIsCorrect = "Degré de certitude que la réponse soit jugée correcte"; +$IncorrectAnswersX = "Réponses incorrectes: %s"; +$KindRegards = "Cordialement,"; +$DoNotReply = "Ne pas répondre"; +$ResultAccomplishedTest = "Résultats du test réalisé"; +$YourResultsByDiscipline = "Vos résultats discipline par discipline"; +$ForComparisonYourLastResultToThisTest = "Pour comparaison, votre dernier résultat à ce test"; +$YourOverallResultForTheTest = "Votre résultat sur l'ensemble du test"; +$QuestionDegreeCertaintyHTMLMail = "Voici, ci-dessous vos résultats pour le test %s.
Pour consulter le détail des résultats

1. Connectez-vous sur la plateforme Chamilo (identifiant/mot de passe universitaire): se connecter à Chamilo.

2. Puis cliquez sur ce lien: voir mes résultats détaillés.

"; +$DegreeOfCertaintyVerySure = "Savoir certain"; +$DegreeOfCertaintyVerySureDescription = "Votre réponse a été correcte et vous étiez sûr à 80% ou plus. Félicitations."; +$DegreeOfCertaintyPrettySure = "Savoir fragile"; +$DegreeOfCertaintyPrettySureDescription = "Votre réponse était correcte mais vous étiez peu sûr (certitude 60% ou 70%)"; +$DegreeOfCertaintyDeclaredIgnorance = "Ignorance déclarée"; +$DegreeOfCertaintyDeclaredIgnoranceDescription = "Vous ne connaissiez pas la réponse - degré de certitude 50%"; +$DegreeOfCertaintyUnsure = "Erreur présumée"; +$DegreeOfCertaintyUnsureDescription = "Votre réponse était incorrecte, mais vous vous en doutiez (certitude 60% ou 70%)"; +$DegreeOfCertaintyVeryUnsure = "Erreur dangereuse"; +$DegreeOfCertaintyVeryUnsureDescription = "Votre réponse était incorrecte, mais vous en étiez sûr à 80% ou plus"; +$DegreeOfCertaintyIDeclareMyIgnorance = "J’ignore la bonne réponse et j’ai choisi au hasard"; +$DegreeOfCertaintyIAmVeryUnsure = "Je suis très peu sûr"; +$DegreeOfCertaintyIAmUnsure = "Je suis peu sûr"; +$DegreeOfCertaintyIAmPrettySure = "Je suis assez sûr"; +$DegreeOfCertaintyIAmSure = "Je suis quasiment sûr"; +$DegreeOfCertaintyIAmVerySure = "Je suis tout à fait sûr"; +$MultipleAnswerTrueFalseDegreeCertainty = "Rép. multiples vrai/faux/degré de certitude"; +$IgnoranceAnswersX = "Ignorance: %s"; +$CorrectAnswersX = "Réponses correctes: %s"; +$TotalHours = "Heures totales"; +$MinutesPerDay = "Minutes par jour"; +$ClassroomActivity = "Activité de classe"; +$OneDay = "1 jour"; +$UserXAnonymized = "Les données de l'utilisateur %s ont été anonymisées."; +$CannotAnonymizeUserX = "Impossible d'anonymiser les données de l'utilisateur %s. Merci d'essayer à nouveau ou de vérifier les logs."; +$NoPermissionToAnonymizeUserX = "Vous n'avez pas les permissions pour anonymiser l'utilisateur %s. Il s'agit des mêmes permissions que pour la suppression d'utilisateurs."; +$Anonymize = "Anonymiser"; +$XQuestions = "%d questions"; +$WebFolderRefreshSucceeded = "Les styles et fichiers statiques du répertoire web/ on été mis à jour."; +$WebFolderRefreshFailed = "Les styles et fichiers statiques du répertoire web/ n'ont pas pu être mis à jour, probablement à cause de problèmes de permissions. Assurez-vous que l'utilisateur système de votre serveur web puisse écrire dans le répertoire web/."; +$CopyTextToClipboard = "Copier le texte"; +$WeNeedYouToAcceptOurTreatmentOfYourData = "Nous avons besoin que vous acceptiez notre traitement de vos données afin de vous fournir ce service. Si vous souhaitez créer un compte, veuillez en accepter les termes et cliquer sur Envoyer. Si vous n'acceptez pas, aucune donnée personnelle ne sera traitée par nous à votre sujet."; +$NoTermsAndConditionsAvailable = "Aucune condition d'utilisation disponible"; +$Skype = "Skype"; +$PersonalDataOfficerName = "Nom du délégué à la protection des données personnelles"; +$PersonalDataOfficerRole = "Rôle du délégué à la protection des données personnelles"; +$Assets = "Éléments extra (assets)"; +$TotalLPTime = "Temps total parcours"; +$AddStatus = "Ajouter un état"; +$AddProject = "Ajouter un projet"; +$AddPriority = "Ajouter une priorité"; +$NotAccepted = "Rejeté"; +$UserPermissions = "Permissions utilisateur"; +$ExportToPdf = "Exporter en PDF"; +$GoToThread = "Aller au fil de discussion"; +$TimeDifference = "Différence de temps"; +$SessionAdministrator = "Administrateur de sessions"; +$ThereIsASequenceResourceLinkedToThisSessionYouNeedToDeleteItFirst = "Une ressource de séquence est liée à cette session. Vous devez d'abord supprimer ce lien."; +$AddAnnotationText = "Ajouter texte d'annotation"; +$AddAnnotationPath = "Ajouter tracé d'annotation"; +$Driver = "Pilote"; +$UploadTmpDirInfo = "Le répertoire d'upload temporaire est un espace sur le serveur où les fichiers sont déposés temporairement avant d'être traités par PHP."; +$GenerateCustomReport = "Générer un rapport personnalisé"; +$ToDo = "À faire"; +$PleaseEnterURL = "Veuillez introduire l'URL"; +$IfYouWantToGetTheCertificateAndOrSkillsAsociatedToThisCourseYouNeedToBuyTheCertificateServiceYouCanGoToServiceCatalogClickingHere = "Si vous souhaitez obtenir le certificat et/ou les compétences associés à ce cours, il est nécessaire d'acquérir le droit au certificat. Vous pouvez visualiser le catalogue de services ici: %s"; +$SubSkill = "Sous-compétence"; +$AddMultipleUsersToCalendar = "Ajouter plusieurs utilisateurs au calendrier"; +$UpdateCalendar = "Mettre le calendrier à jour"; +$ControlPoint = "Point de contrôle"; +$MessageQuestionCertainty = "Suivez les instructions ci-dessous pour visualiser vos résultats pour le test %s:

+1. Connectez-vous à la plateforme (utilisateur/mot de passe) sur: %s
+2. Suivez le lien suivant: %s
"; +$SessionMinDuration = "Durée minimum de session"; +$CanNotTranslate = "Impossible de traduire"; +$AddSkills = "Ajouter compétences"; +$Dictionary = "Dictionnaire"; +$CategoryExists = "La catégorie existe"; +$MinimumGradebookToValidate = "Minimum pour valider"; +$NumberOfGradebookToValidateInDependence = "Nombre de cahiers de notes à valider dans les dépendances"; +$DependsOnGradebook = "Dépend du cahier de note"; +$ThisGradebookDoesntHaveDependencies = "Ce cahier de notes n'a aucune dépendance"; +$CourseIntroductionsAllImportedSuccessfully = "Les introductions ont toutes été importées avec succès"; +$FilterSessions = "Filtrer sessions"; +$ScoreModel = "Modèle d'évaluation"; +$SyncDatabaseWithSchema = "Synchroniser la base de données avec le schéma"; +$SkillRelCourses = "Associations cours-compétences"; ?> \ No newline at end of file diff --git a/main/lang/german/trad4all.inc.php b/main/lang/german/trad4all.inc.php index e8cc85b0b7..b9320aeda8 100644 --- a/main/lang/german/trad4all.inc.php +++ b/main/lang/german/trad4all.inc.php @@ -2822,8 +2822,8 @@ $OpenQuestionsAttemptedAre = "Die versuchte offene Frage ist"; $UploadJpgPicture = "Ein JPG Bild hochladen"; $HotspotDescription = "Hotspot Beschreibung"; $ExamSheetVCC = "Testergebnnis wurde vom Kursleiter angesehen / korrigiert / kommentiert."; -$AttemptVCC = "Ihr nachfolgende Einsendung wurde vom Kursleiter angesehen / kommentiert / korrigiert."; -$ClickLinkToViewComment = "Klicken Sie nachfolgenden Link, um zu Ihrem Zugang zu gelangen und Ihr kommentiertes testergebnis anzusehen"; +$AttemptVCC = "Ihre nachfolgende Einsendung wurde vom Kursleiter angesehen / kommentiert / korrigiert."; +$ClickLinkToViewComment = "Klicken Sie auf den nachfolgenden Link, um zu Ihrem Zugang zu gelangen und Ihr kommentiertes testergebnis anzusehen"; $Regards = "Mit freundlichen Grüßen"; $AttemptVCCLong = "Ihre Einsendung von Test %s wurde vom Kursleiter angesehen / kommentiert / korrigiert. Klicken Sie den nachfolgenden Link, um zu Ihrem Zugang zu gelangen und Ihre Auswertung anzusehen.
/n"; $DearStudentEmailIntroduction = "Sehr geehrte(r) Teilnehmer(in),"; @@ -7975,5 +7975,12 @@ $SendEmailToTeacherWhenStudentEndQuizOnlyIfOpenQuestion = "E-Mail an den Tutor s $SendEmailToTeacherWhenStudentEndQuizOnlyIfOralQuestion = "E-Mail an den Tutor senden, wenn der Lernende eine Übung beendet hat, aber nur wenn er eine mündliche Frage beantwortet hat"; $TempScoreXQuestionsNotCorrectedYet = "Temporäre Auswertung: %s offene Frage(n) noch nicht korrigiert."; $GoToSurvey = "Zur Umfrage"; +$OralExpressionHelpText = "Du kannst während der Aufnahme auf « Aufnahme anhalten » klicken. Wenn du nicht zufrieden bist, nimm dich erneut auf. Dies wird die vorherige Aufnahme überschreiben. Zufrieden? Um deine Aufnahme zu senden, klick einfach auf « Übung beenden »."; $MyGeneralCertificate = "Mein Zertifikat"; +$BossAlertMsgSentToUserXTitle = "Follow-up Nachricht über Lernende %s"; +$BossAlertUserXSentMessageToUserYWithLinkZ = "Hallo,

+ +Benutzer %s hat eine Follow-up-Nachricht zum Lernenden %s gesendet.

+ +Die Nachricht ist an %s sichtbar"; ?> \ No newline at end of file diff --git a/main/lang/italian/trad4all.inc.php b/main/lang/italian/trad4all.inc.php index 14ada64993..e363528518 100644 --- a/main/lang/italian/trad4all.inc.php +++ b/main/lang/italian/trad4all.inc.php @@ -7656,4 +7656,5 @@ $LastXDays = "Ultimi %s giorni"; $ExportBadges = "Esporta i badge"; $LanguagesDisableAllExceptDefault = "Abilita solo la lingua d default della piattaforma"; $ThereAreUsersUsingThisLanguagesDisableItManually = "Alcuni utenti usano questa lingua: è necessario disabilitarla manualmente"; +$ExportToChamiloFormat = "Esporta un Modulo didattico"; ?> \ No newline at end of file diff --git a/main/lang/spanish/trad4all.inc.php b/main/lang/spanish/trad4all.inc.php index ec9469dd30..61a61acf04 100644 --- a/main/lang/spanish/trad4all.inc.php +++ b/main/lang/spanish/trad4all.inc.php @@ -104,7 +104,7 @@ $MultiplicationStar = "Multiplicación:\t\t\t*"; $SubstractionMinus = "Resta:\t\t\t\t-"; $SummationPlus = "Suma:\t\t\t\t+"; $NotationList = "Notación para fórmula"; -$SubscribeToSessionRequest = "Solicitud de inscripción a una sesión"; +$SubscribeToSessionRequest = "Solicitar inscripción"; $PleaseSubscribeMeToSession = "Por favor suscribirme a la sesión"; $SearchActiveSessions = "Buscar sesiones activas"; $UserNameHasDash = "El nombre de usuario no puede contener el caracter '-'"; @@ -115,7 +115,7 @@ $GiveFormula = "Por favor, escriba la fórmula"; $SignatureFormula = "Cordialmente"; $FormulaExample = "Ejemplo de fórmula: sqrt( [x] / [y] ) * ( e ^ ( ln(pi) ) )"; $VariableRanges = "Rangos de las variables"; -$ExampleValue = "Valor del rango"; +$ExampleValue = "Ejemplo de valor en el rango"; $CalculatedAnswer = "Pregunta calculada"; $UserIsCurrentlySubscribed = "El usuario está actualmente suscrito"; $OnlyBestAttempts = "Solo los mejores intentos"; @@ -751,7 +751,7 @@ $ToolIntro = "Textos de introducción"; $UploadError = "Error de envío, revise tamaño máximo del archivo y los permisos del directorio."; $DocumentsWillBeAddedToo = "Los documentos también serán añadidos"; $ToExportLearnpathWithQuizYouHaveToSelectQuiz = "Si quiere exportar una lección que contenga ejercicios, tendrá que asegurarse de que estos ejercicios han sido incluidos en la exportación; para eso tendrá que haberlos seleccionado en la lista de ejercicios."; -$ArchivesDirectoryNotWriteableContactAdmin = "El directorio \"archive\" utilizado por esta herramienta no tiene habilitado los permisos de escritura. Contacte al administrador de la plataforma."; +$ArchivesDirectoryNotWriteableContactAdmin = "El directorio \"app/cache/\" utilizado por esta herramienta no tiene habilitado los permisos de escritura. Contacte al administrador de la plataforma."; $DestinationCourse = "Curso de destino"; $ConvertToMultipleAnswer = "Convertir a respuesta múltiple"; $CasMainActivateComment = "Activar la autentificación CAS permitirá a usuarios autentificarse con sus credenciales CAS"; @@ -1513,7 +1513,7 @@ $administratorNameComment = "El nombre del administrador de la plataforma (apare $ShowAdministratorDataTitle = "Información del administrador de la plataforma en el pie"; $ShowAdministratorDataComment = "¿ Mostrar la información del administrador de la plataforma en el pie ?"; $HomepageViewTitle = "Vista de la página principal"; -$HomepageViewComment = "¿ Cómo quiere que se presente la página principal del curso ?"; +$HomepageViewComment = "¿Cómo quiere que se presente la página principal del curso (disposición de iconos)?"; $HomepageViewDefault = "Presentación en dos columnas. Las herramientas desactivadas quedan escondidas"; $HomepageViewFixed = "Presentación en tres columnas. Las herramientas desactivadas aparecen en gris (los iconos se mantienen en su lugar)."; $ShowToolShortcutsTitle = "Barra de acceso rápido a las herramientas"; @@ -1717,9 +1717,9 @@ $AccountValidDurationTitle = "Validez de la cuenta"; $AccountValidDurationComment = "Una cuenta de usuario es válida durante este número de días a partir de su creación"; $UseSessionModeTitle = "Usar sesiones de formación"; $UseSessionModeComment = "Las sesiones ofrecen una forma diferente de tratar los cursos, donde el curso tiene un creador, un tutor y unos estudiantes. Cada tutor imparte un curso por un perido de tiempo, llamado *sesión*, a un conjunto de estudiantes"; -$HomepageViewActivity = "Ver la actividad"; -$HomepageView2column = "Visualización en dos columnas"; -$HomepageView3column = "Visualización en tres columnas"; +$HomepageViewActivity = "Vista tipo Actividad"; +$HomepageView2column = "Vista en dos columnas"; +$HomepageView3column = "Vista en tres columnas"; $AllowUserHeadings = "Permitir encabezados de usuarios"; $IconsOnly = "Sólo iconos"; $TextOnly = "Sólo texto"; @@ -2375,7 +2375,7 @@ $GroupDescription = "Descripción del grupo"; $GroupMembers = "Miembros del grupo"; $EditGroup = "Modificar este grupo"; $GroupSettingsModified = "Configuración del grupo modificada"; -$GroupTooMuchMembers = "El número propuesto excede el máximo que Ud. autoriza (puede modificarlo debajo). \t\t\t\tLa composición del grupo no se ha modificado"; +$GroupTooMuchMembers = "El número propuesto excede el máximo que Ud. autoriza (puede modificarlo en los parámetros del grupo). La composición del grupo no se ha modificado"; $GroupTutor = "Tutor del grupo"; $GroupNoTutor = "(ninguno)"; $GroupNone = "(ninguno)"; @@ -2547,7 +2547,7 @@ $WarningEditingDocument = "Cuando edita un documento existente en la lección, l $CreateTheExercise = "Crear el ejercicio"; $MoveTheCurrentExercise = "Mover el ejercicio actual"; $EditCurrentExecice = "Editar el ejercicio actual"; -$UploadScorm = "Importación SCORM y AICC"; +$UploadScorm = "Importación SCORM, AICC y Lección"; $PowerPointConvert = "Conversión PowerPoint"; $LPCreatedToContinue = "Para continuar, añada a su lección una sección o un objeto de aprendizaje"; $LPCreatedAddChapterStep = "

\"practicerAnim.gif\"¡ Bienvenido a la herramienta de autor de Chamilo !

  • Construir : Añada objetos de aprendizaje a su lección
  • Organizar : Añada comentarios de audio y ordene sus objetos de aprendizaje en la tabla de contenidos
  • Mostrar : Vea la lección como la vería un estudiante
  • Añadir una sección : Capítulo 1, Capítulo 2 o Semana 1, Semana 2...
  • Añadir un objeto de aprendizaje : construya su lección paso a paso con documentos, ejercicios y actividades, contando con la ayuda de plantillas, mascotas y galerías multimedia
"; @@ -4221,7 +4221,7 @@ $ToolName = "Importar cursos de Blackboard"; $TrackingDisabled = "El seguimiento ha sido deshabilitado por el administrador del sistema."; $InactivesStudents = "Estudiantes que no se han conectado al menos durante una semana"; $AverageTimeSpentOnThePlatform = "Tiempo medio de conexión a la plataforma"; -$AverageCoursePerStudent = "Media de cursos por usuario"; +$AverageCoursePerStudent = "Media de cursos en los cuales mis alumnos están inscritos"; $AverageProgressInLearnpath = "Progreso medio en las lecciones"; $AverageResultsToTheExercices = "Puntuación en los ejercicios"; $SeeStudentList = "Ver la lista de usuarios"; @@ -5163,7 +5163,7 @@ $MakeQualifiable = "Permitir calificar en la herramienta de evaluaciones"; $QualificationNumberOver = "Calificación sobre"; $WeightInTheGradebook = "Ponderación en el promedio de la evaluación"; $DatesAvailables = "Fechas disponibles"; -$ExpiresAt = "Expira en"; +$ExpiresAt = "Fecha límite publicada del envio"; $DirectoryCreated = "La tarea ha sido creada"; $Assignment = "Tarea"; $ExpiryDateToSendWorkIs = "Fecha de vencimiento para enviar tareas"; @@ -5795,7 +5795,7 @@ $AssignUsersToPlatformAdministrator = "Asignar usuarios al administrador de la p $AssignedUsersListToPlatformAdministrator = "Lista de usuarios asignados al administrador de la plataforma"; $AssignedCoursesListToHumanResourcesManager = "Lista de cursos asignados al administrador de recursos humanos"; $ThereAreNotCreatedCourses = "No hay cursos creados"; -$HomepageViewVerticalActivity = "Ver la actividad en forma vertical"; +$HomepageViewVerticalActivity = "Vista tipo actividad en forma vertical"; $GenerateSurveyAccessLink = "Generar enlace de acceso a encuesta"; $CoursesInformation = "Información de cursos"; $LearnpathVisible = "Lección hecha visible"; @@ -6389,7 +6389,7 @@ $ShowGroupsToUsersComment = "Mostrar las clases a los usuarios. Las clases son u $ExerciseWillBeActivatedFromXToY = "El ejercicio estará visible del %s al %s"; $ExerciseAvailableFromX = "Ejercicio disponible desde el %s"; $ExerciseAvailableUntilX = "Ejercicio disponible hasta el %s"; -$HomepageViewActivityBig = "Vista grandes iconos"; +$HomepageViewActivityBig = "Vista actividad con grandes iconos"; $CheckFilePermissions = "Verificar permisos de ficheros"; $AddedToALP = "Añadido a una lección"; $NotAvailable = "No disponible"; @@ -6616,7 +6616,7 @@ $BestScoredPages = "Páginas con mejor puntuación"; $MProgressPages = "Páginas con mayor progreso"; $MostDiscussUsers = "Usuarios más discutidos"; $RandomPage = "Página aleatoria"; -$DateExpiredNotBeLessDeadLine = "La fecha de caducidad no puede ser menor que la fecha límite"; +$DateExpiredNotBeLessDeadLine = "La fecha de bloqueo efectivo del envío del trabajo no puede ser antes de la fecha límite de publicación mostrada"; $NotRevised = "No se ha revisado"; $DirExists = "Operación imposible, ya existe un directorio con el mismo nombre."; $DocMv = "Documento movido"; @@ -8092,7 +8092,7 @@ $ThisEmailWasSentViaCourseXInSessionX = "Este correo electrónico fue enviado a $Diagram = "Diagrama"; $CareerXDoesntHaveADiagram = "La carrera %s no tiene un diagrama."; $ExerciseCategoryAllSessionsReport = "Informe de ejercicio por categoria en todas las sesiones"; -$MailConfirmation = "Activar cuenta por correo electrónico de confirmación"; +$MailConfirmation = "Requerir confirmación por correo electrónico"; $RegistrationConfirmation = "Confirmación de registro"; $AccountNotConfirmed = "Su cuenta está inactiva porque aún no la ha confirmado. Revise su correo electrónico y siga las instrucciones o haga click en el siguiente enlace para volver a enviar el correo electrónico de confirmación."; $RegistrationConfirmationEmailMessage = "Para completar su registro en la plataforma, necesita confirmar su cuenta haciendo click en el siguiente enlace"; @@ -8148,4 +8148,155 @@ $YourResultAtXBlocksThisElement = "El resultado en el item \"%s\" bloquea esta e $RegistrationRoleWhatDoYouWantToDo = "¿Qué deseas hacer?"; $RegistrationRoleFollowCourses = "Seguir cursos"; $RegistrationRoleTeachCourses = "Dictar cursos"; +$EditPortfolioItem = "Editar elemento del portafolio"; +$PortfolioItemAdded = "Elemento del portafolio editado"; +$ExploreMoreCourses = "Explorar más cursos"; +$LinksOfInterest = "Enlaces de interés"; +$ExportToChamiloFormat = "Exportación de la lección"; +$CoursesComingSoon = "Cursos disponibles próximamente"; +$SalePrice = "Precio de venta"; +$BuyNow = "Comprar ahora"; +$DocumentGroupCollaborationMode = "Modo colaboración"; +$DocumentGroupReadOnlyMode = "Modo lectura sola"; +$GroupDocumentAccess = "Acceso a documento"; +$DocumentGroupShareMode = "Modo compartido"; +$SessionDurationXDaysTotal = "Esta sesión tiene una duración limitada a %s días"; +$LastMonth = "Mes pasado"; +$ThisMonth = "Este mes"; +$PortalUserSessionStats = "Número de alumnos por sesión y portal"; +$AddCustomToolsIntro = "Esta sección es invisible para los estudiantes hasta que la modifique. Puede añadir una introducción a la herramienta, como un texto de ayuda para sus estudiantes, dando clic en el icono de edición."; +$TheDocumentAutoLaunchSettingIsOnStudentsWillBeRedirectToTheDocumentTool = "La funcionalidad de lanzamiento automático de documentos está activada. Los estudiantes serán redirigidos automáticamente a la herramienta de documentos."; +$DocumentAutoLaunch = "Lanzamiento automático para documentos"; +$RedirectToTheDocumentList = "Redirigir a la lista de documentos"; +$TheExerciseAutoLaunchSettingIsONStudentsWillBeRedirectToTheExerciseList = "La funcionalidad de lanzamiento automático de ejercicios está activada. Los estudiantes serán automáticamente redirigidos a la lista de ejercicios."; +$PostedExpirationDate = "Fecha límite publicada para enviar el trabajo (visible para el alumno)"; +$BossAlertMsgSentToUserXTitle = "Mensaje de seguimiento sobre alumno %s"; +$BossAlertUserXSentMessageToUserYWithLinkZ = "Hola,

+ +El usuario %s ha enviado un mensaje de seguimiento sobre el alumno %s.

+ +El mensaje se puede ver en %s"; +$include_services = "Incluir los servicios"; +$culqi_enable = "Activar Culqi"; +$SelectedUsersDisabled = "Todos los usuarios seleccionados han sido desactivado."; +$SomeUsersNotDisabled = "Algunos de los usuarios seleccionados no han sido desactivado. Le recomendamos una verificación adicional a través de la búsqueda avanzada."; +$SelectedUsersEnabled = "Todos los usuarios seleccionados han sido activado."; +$SomeUsersNotEnabled = "Algunos de los usuarios seleccionados no han sido activado. Le recomendamos una verificación adicional a través de la búsqueda avanzada."; +$EncryptedData = "Datos cifrados"; +$RandomData = "Datos aleatorios"; +$PersonalDataReport = "Datos personales"; +$ComplexDataNotShown = "Datos complejos (no representados)"; +$PersonalDataIntroductionTitle = "Datos personales: introducción"; +$PersonalDataKeptOnYou = "Datos personales que guardamos sobre Usted"; +$PersonalDataPermissionsYouGaveUs = "Permisos que nos dió"; +$PersonalDataResponsibleOrganizationTitle = "Organización responsable por el tratamiento de sus datos personales"; +$PersonalDataTreatmentTitle = "Tratamiento de sus datos personales"; +$PersonalDataCollectionTitle = "Colección de sus datos personales"; +$PersonalDataRecordingTitle = "Registro de sus datos personales"; +$PersonalDataOrganizationTitle = "Organización de sus datos personales"; +$PersonalDataStructureTitle = "Estructuración de sus datos personales"; +$PersonalDataConservationTitle = "Conservación de sus datos personales"; +$PersonalDataAdaptationTitle = "Adaptación o modificación de sus datos personales"; +$PersonalDataExtractionTitle = "Extracción de sus datos personales"; +$PersonalDataConsultationTitle = "Consultación de sus datos personales"; +$PersonalDataUsageTitle = "Uso de sus datos personales"; +$PersonalDataCommunicationTitle = "Comunicación y difusión de sus datos personales"; +$PersonalDataInterconnectionTitle = "Interconexión de sus datos personales"; +$PersonalDataLimitationTitle = "Limitación de sus datos personales"; +$PersonalDataDeletionTitle = "Eliminación de sus datos personales"; +$PersonalDataDestructionTitle = "Destrucción de sus datos personales"; +$PersonalDataProfilingTitle = "Perfilado de sus datos personales"; +$PersonalDataIntroductionText = "Respetamos sus datos personales! Esta página une todos los aspectos de los datos personales que podríamos conservar sobre Usted, como los tratamos, lo que nos permitió hacer con ellos y quienes somos, en un esfuerzo para cumplir con todas las normativas sobre los datos personales existentes y aplicables. Gracias por leer con mucha atención la información puesta a su disposición a continuación. Si le quedan dudas, revise los datos de contactos más a bajo y envíenos sus consultas."; +$YourDegreeOfCertainty = "Su grado de certeza"; +$DegreeOfCertaintyThatMyAnswerIsCorrect = "Grado de certeza que mi respuesta será considerada correcta"; +$IncorrectAnswersX = "Respuestas incorrectas: %s"; +$KindRegards = "Cordialmente,"; +$DoNotReply = "No responder"; +$ResultAccomplishedTest = "Resultados de la prueba dada"; +$YourResultsByDiscipline = "Sus notas, disciplina por disciplina"; +$ForComparisonYourLastResultToThisTest = "En comparación, su última nota para esta prueba"; +$YourOverallResultForTheTest = "Su nota para la prueba en general"; +$QuestionDegreeCertaintyHTMLMail = "Encontrará su nota a continuación para la prueba %s.
+Para ver más detalles: +

+1. Conectarse a la plataforma (usuario/contraseña usual): Hacia la plataforma. +

+2. Seguir este enlace: Ver resultados más detallados."; +$DegreeOfCertaintyVerySure = "Muy seguro"; +$DegreeOfCertaintyVerySureDescription = "Dió la respuesta correcta y estaba seguro de ella al 80% ¡Felicitaciones!"; +$DegreeOfCertaintyPrettySure = "Bastante seguro"; +$DegreeOfCertaintyPrettySureDescription = "Dió la respuesta correcta pero no estaba completamente seguro (entre 60% y 70% seguro)"; +$DegreeOfCertaintyDeclaredIgnorance = "Ignorancia declarada"; +$DegreeOfCertaintyDeclaredIgnoranceDescription = "No sabía la respuesta - solo 50% de certeza"; +$DegreeOfCertaintyUnsure = "Inseguro"; +$DegreeOfCertaintyUnsureDescription = "Dió la respuesta incorrecta, pero intuía que no era correcta (60% a 70% de certeza)"; +$DegreeOfCertaintyVeryUnsure = "Muy inseguro"; +$DegreeOfCertaintyVeryUnsureDescription = "Dió la respuesta incorrecta a pesar de tener 80% de certeza de que no era la correcta"; +$DegreeOfCertaintyIDeclareMyIgnorance = "No conozco la respuesta y he seleccionado al azar"; +$DegreeOfCertaintyIAmVeryUnsure = "Estoy muy inseguro"; +$DegreeOfCertaintyIAmUnsure = "Estoy inseguro"; +$DegreeOfCertaintyIAmPrettySure = "Estoy más o menos seguro"; +$DegreeOfCertaintyIAmSure = "Estoy bastante seguro"; +$DegreeOfCertaintyIAmVerySure = "Estoy muy seguro"; +$MultipleAnswerTrueFalseDegreeCertainty = "Respuestas múltiples v/f/grado de certeza"; +$IgnoranceAnswersX = "Ignorancia: %s"; +$CorrectAnswersX = "Respuestas correctas: %s"; +$TotalHours = "Horas totales"; +$MinutesPerDay = "Minutos por día"; +$ClassroomActivity = "Actividad de la clase"; +$OneDay = "1 día"; +$UserXAnonymized = "Los datos del usuario %s fueron anonimizados."; +$CannotAnonymizeUserX = "No se han podido anonimizar los datos del usuario %s. Por favor intente nuevamente o verifique los registros de error del servidor."; +$NoPermissionToAnonymizeUserX = "No tiene los permisos necesarios para anonimizar el usuario %s. Se tratan de los mismos permisos necesarios para eliminar usuarios."; +$Anonymize = "Anonimizar"; +$XQuestions = "%d preguntas"; +$WebFolderRefreshSucceeded = "Los estilos y archivos estáticos de la carpeta web/ han sido actualizados."; +$WebFolderRefreshFailed = "Los estilos y archivos estáticos de la carpeta web/ no han podido ser actualizados, probablemente debido a un problema de permisos. Asegúrese que el usuario sistema de su servidor web tenga los permisos suficientes para escribir en esta carpeta."; +$CopyTextToClipboard = "Copiar Texto"; +$WeNeedYouToAcceptOurTreatmentOfYourData = "Necesitamos que acepte nuestro tratamiento de sus datos para poder brindarle este servicio. Si desea registrar una cuenta, acepte los términos y haga clic en Enviar. Si no acepta, no trataremos datos personales sobre usted."; +$NoTermsAndConditionsAvailable = "Ninguna condición de uso disponible"; +$Skype = "Skype"; +$PersonalDataOfficerName = "Nombre del oficial de protección de datos"; +$PersonalDataOfficerRole = "Rol del oficial de protección de datos"; +$Assets = "Elementos extra (assets)"; +$TotalLPTime = "Tiempo total lecciones"; +$AddStatus = "Agregar estado"; +$AddProject = "Agregar proyecto"; +$AddPriority = "Agregar prioridad"; +$NotAccepted = "Rechazado"; +$UserPermissions = "Permisos usuario"; +$ExportToPdf = "Exportar en PDF"; +$GoToThread = "Ir al hilo de discusión"; +$TimeDifference = "Diferencia de tiempo"; +$SessionAdministrator = "Administrador de sesiones"; +$ThereIsASequenceResourceLinkedToThisSessionYouNeedToDeleteItFirst = "Existe un recurso de sequencia vinculado a esta sesión. Tiene que borrar el vínculo primero."; +$AddAnnotationText = "Agregar texto de anotación"; +$AddAnnotationPath = "Agregar trazado de anotación"; +$Driver = "Piloto"; +$UploadTmpDirInfo = "La carpeta de subida temporal es un espacio en el servidor donde los archivos son subidos antes de ser filtrados y tratados por PHP."; +$GenerateCustomReport = "Generar reporte personalizado"; +$ToDo = "Por hacer"; +$PleaseEnterURL = "Ingrese la URL"; +$IfYouWantToGetTheCertificateAndOrSkillsAsociatedToThisCourseYouNeedToBuyTheCertificateServiceYouCanGoToServiceCatalogClickingHere = "Si desea obtener el certificado y/o la competencia de este curso, necesita adquirir el derecho a certificado. Puede visitar el catálogo de servicios aquí: %s"; +$SubSkill = "Sub-competencia"; +$AddMultipleUsersToCalendar = "Agregar múltiples usuarios al calendario"; +$UpdateCalendar = "Actualizar calendario"; +$ControlPoint = "Punto de control"; +$MessageQuestionCertainty = "Siga las instrucciones a continuación para ver sus resultados de la prueba '%s' a detalle:

+1. Conéctese a la plataforma (con login/constraseña) en: %s
+2. De click en el enlace siguiente: Ms
"; +$SessionMinDuration = "Duración mín de sesión"; +$CanNotTranslate = "No se pudo traducir"; +$AddSkills = "Agregar competencias"; +$Dictionary = "Diccionario"; +$CategoryExists = "La categoría existe"; +$MinimumGradebookToValidate = "Mínimo para validar"; +$NumberOfGradebookToValidateInDependence = "Número de evaluaciones por validar en las dependencias"; +$DependsOnGradebook = "Depende de la evaluación"; +$ThisGradebookDoesntHaveDependencies = "Esta evaluación no tiene dependencia"; +$CourseIntroductionsAllImportedSuccessfully = "Todas las introducciones de cursos fueron importadas exitosamente."; +$FilterSessions = "Filtrar sesiones"; +$ScoreModel = "Modelo de evaluación"; +$SyncDatabaseWithSchema = "Sincronizar la base de datos con el esquema"; +$SkillRelCourses = "Asociaciones cursos-competencias"; ?> \ No newline at end of file diff --git a/main/social/personal_data.php b/main/social/personal_data.php new file mode 100644 index 0000000000..5f09055393 --- /dev/null +++ b/main/social/personal_data.php @@ -0,0 +1,397 @@ + get_lang('EncryptedData'), + 'salt' => get_lang('RandomData'), + 'empty' => get_lang('NoData'), +]; + +$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : ''; +$formToString = ''; + +if (api_get_setting('allow_terms_conditions') === 'true') { + $form = new FormValidator('delete_term', 'post', api_get_self().'?action=delete_legal&user_id='.$userId); + $form->addHtml(Display::return_message(get_lang('WhyYouWantToDeleteYourLegalAgreement'))); + $form->addTextarea('explanation', get_lang('ExplanationDeleteLegal'), [], true); + $form->addHidden('action', 'delete_legal'); + $form->addButtonSave(get_lang('DeleteLegal')); + $formToString = $form->returnForm(); + + $formDelete = new FormValidator('delete_account', 'post', api_get_self().'?action=delete_account&user_id='.$userId); + $formDelete->addTextarea('explanation', get_lang('ExplanationDeleteAccount'), [], true); + $formDelete->addHidden('action', 'delete_account'); + $formDelete->addButtonDelete(get_lang('DeleteAccount')); + $formToString .= $formDelete->returnForm(); +} + +switch ($action) { + case 'send_legal': + $language = api_get_interface_language(); + $language = api_get_language_id($language); + $terms = LegalManager::get_last_condition($language); + if (!$terms) { + //look for the default language + $language = api_get_setting('platformLanguage'); + $language = api_get_language_id($language); + $terms = LegalManager::get_last_condition($language); + } + + $legalAcceptType = $terms['version'].':'.$terms['language_id'].':'.time(); + UserManager::update_extra_field_value( + $userId, + 'legal_accept', + $legalAcceptType + ); + + Event::addEvent( + LOG_TERM_CONDITION_ACCEPTED, + LOG_USER_OBJECT, + api_get_user_info($userId), + api_get_utc_datetime() + ); + + $bossList = UserManager::getStudentBossList($userId); + if (!empty($bossList)) { + $bossList = array_column($bossList, 'boss_id'); + $currentUserInfo = api_get_user_info($userId); + foreach ($bossList as $bossId) { + $subjectEmail = sprintf( + get_lang('UserXSignedTheAgreement'), + $currentUserInfo['complete_name'] + ); + $contentEmail = sprintf( + get_lang('UserXSignedTheAgreementTheDateY'), + $currentUserInfo['complete_name'], + api_get_local_time($time) + ); + + MessageManager::send_message_simple( + $bossId, + $subjectEmail, + $contentEmail, + $user_id + ); + } + } + Display::addFlash(Display::return_message(get_lang('Saved'))); + break; + case 'delete_account': + if ($formDelete->validate()) { + $explanation = $formDelete->getSubmitValue('explanation'); + UserManager::createDataPrivacyExtraFields(); + + // Remove delete agreement if it was sent: + UserManager::update_extra_field_value( + $userId, + 'request_for_legal_agreement_consent_removal', + '' + ); + + UserManager::update_extra_field_value( + $userId, + 'request_for_legal_agreement_consent_removal_justification', + '' + ); + + UserManager::update_extra_field_value( + $userId, + 'request_for_delete_account', + 1 + ); + UserManager::update_extra_field_value( + $userId, + 'request_for_delete_account_justification', + $explanation + ); + + Display::addFlash(Display::return_message(get_lang('Saved'))); + Event::addEvent( + LOG_USER_DELETE_ACCOUNT_REQUEST, + LOG_USER_OBJECT, + $userInfo + ); + + $url = api_get_path(WEB_CODE_PATH).'admin/'; + $link = Display::url($url, $url); + $subject = get_lang('RequestForDeleteAccount'); + $content = sprintf( + get_lang('TheUserXAskDeleteAccountWithJustifactionXGoHereX'), + $userInfo['complete_name'], + $explanation, + $link + ); + + $email = api_get_configuration_value('data_protection_officer_email'); + if (!empty($email)) { + api_mail_html('', $email, $subject, $content); + } else { + MessageManager::sendMessageToAllAdminUsers(api_get_user_id(), $subject, $content); + } + } + break; + case 'delete_legal': + if ($form->validate()) { + $explanation = $form->getSubmitValue('explanation'); + + UserManager::createDataPrivacyExtraFields(); + + UserManager::update_extra_field_value( + $userId, + 'request_for_legal_agreement_consent_removal', + 1 + ); + + UserManager::update_extra_field_value( + $userId, + 'request_for_legal_agreement_consent_removal_justification', + $explanation + ); + + /*$extraFieldValue = new ExtraFieldValue('user'); + $value = $extraFieldValue->get_values_by_handler_and_field_variable( + $userId, + 'legal_accept' + ); + $result = $extraFieldValue->delete($value['id']);*/ + + Display::addFlash(Display::return_message(get_lang('Sent'))); + + Event::addEvent( + LOG_USER_REMOVED_LEGAL_ACCEPT, + LOG_USER_OBJECT, + $userInfo + ); + + $url = api_get_path(WEB_CODE_PATH).'admin/'; + $link = Display::url($url, $url); + $subject = get_lang('RequestForLegalConsentRemoval'); + $content = sprintf( + get_lang('TheUserXAskRemovalWithJustifactionXGoHereX'), + $userInfo['complete_name'], + $explanation, + $link + ); + + $email = api_get_configuration_value('data_protection_officer_email'); + if (!empty($email)) { + api_mail_html('', $email, $subject, $content); + } else { + MessageManager::sendMessageToAllAdminUsers(api_get_user_id(), $subject, $content); + } + } + break; +} + +$propertiesToJson = UserManager::getRepository()->getPersonalDataToJson($userId, $substitutionTerms); + +if (!empty($_GET['export'])) { + $filename = md5(mt_rand(0, 1000000)).'.json'; + $path = api_get_path(SYS_ARCHIVE_PATH).$filename; + $writeResult = file_put_contents($path, $propertiesToJson); + if ($writeResult !== false) { + DocumentManager::file_send_for_download($path, true, $filename); + exit; + } +} + +$allowSocial = api_get_setting('allow_social_tool') === 'true'; + +$nameTools = get_lang('PersonalDataReport'); +$show_message = null; + +if ($allowSocial) { + $this_section = SECTION_SOCIAL; + $interbreadcrumb[] = [ + 'url' => api_get_path(WEB_PATH).'main/social/home.php', + 'name' => get_lang('SocialNetwork'), + ]; +} else { + $this_section = SECTION_MYPROFILE; + $interbreadcrumb[] = [ + 'url' => api_get_path(WEB_PATH).'main/auth/profile.php', + 'name' => get_lang('Profile'), + ]; +} + +$interbreadcrumb[] = ['url' => '#', 'name' => get_lang('PersonalDataReport')]; + +// LEFT CONTENT +$socialMenuBlock = ''; +if ($allowSocial) { + // Block Social Menu + $socialMenuBlock = SocialManager::show_social_menu('personal-data'); +} + +// MAIN CONTENT +$personalDataContent = '
    '; +$properties = json_decode($propertiesToJson); + +foreach ($properties as $key => $value) { + if (is_array($value) || is_object($value)) { + switch ($key) { + case 'extraFields': + $personalDataContent .= '
  • '.$key.':
    • '; + foreach ($value as $subValue) { + $personalDataContent .= '
    • '.$subValue->variable.': '.$subValue->value.'
    • '; + } + $personalDataContent .= '
    '; + break; + case 'portals': + case 'roles': + case 'achievedSkills': + case 'sessionAsGeneralCoach': + case 'classes': + case 'courses': + case 'groupNames': + case 'groups': + $personalDataContent .= '
  • '.$key.':
    • '; + foreach ($value as $subValue) { + $personalDataContent .= '
    • '.$subValue.'
    • '; + } + $personalDataContent .= '
    '; + break; + case 'sessionCourseSubscriptions': + $personalDataContent .= '
  • '.$key.':
    • '; + foreach ($value as $session => $courseList) { + $personalDataContent .= '
    • '.$session.'
        '; + foreach ($courseList as $course) { + $personalDataContent .= '
      • '.$course.'
      • '; + } + $personalDataContent .= '
      '; + } + $personalDataContent .= '
    '; + break; + default: + //var_dump($key); + break; + } + + /*foreach ($value as $subValue) { + foreach ($subValue as $subSubValue) { + var_dump($subSubValue); + //$personalDataContent .= '
  • '.$subSubValue.'
  • '; + } + }*/ + //skip in some cases + /*sif (!empty($value['date'])) { + $personalDataContent .= '
  • '.$key.': '.$value['date'].'
  • '; + } else { + $personalDataContent .= '
  • '.$key.': '.get_lang('ComplexDataNotShown').'
  • '; + }*/ + } else { + $personalDataContent .= '
  • '.$key.': '.$value.'
  • '; + } +} +$personalDataContent .= '
'; + +// Check terms acceptation +$permitionBlock = ''; +if (api_get_setting('allow_terms_conditions') === 'true') { + $extraFieldValue = new ExtraFieldValue('user'); + $value = $extraFieldValue->get_values_by_handler_and_field_variable( + $userId, + 'legal_accept' + ); + $permitionBlock .= Display::return_icon('accept_na.png', get_lang('NotAccepted')); + if (isset($value['value']) && !empty($value['value'])) { + list($legalId, $legalLanguageId, $legalTime) = explode(':', $value['value']); + $permitionBlock = get_lang('CurrentStatus').': '. + Display::return_icon('accept.png', get_lang('LegalAgreementAccepted')).get_lang('LegalAgreementAccepted'). + '
'; + $permitionBlock .= get_lang('Date').': '.api_get_local_time($legalTime).'
'; + $permitionBlock .= $formToString; + + /*$permitionBlock .= Display::url( + get_lang('DeleteLegal'), + api_get_self().'?action=delete_legal&user_id='.$userId, + ['class' => 'btn btn-danger btn-xs'] + );*/ + } else { + // @TODO add action handling for button + $permitionBlock .= Display::url( + get_lang('SendLegal'), + api_get_self().'?action=send_legal&user_id='.$userId, + ['class' => 'btn btn-primary btn-xs'] + ); + } +} else { + $permitionBlock .= get_lang('NoTermsAndConditionsAvailable'); +} + +//Build the final array to pass to template +$personalData = []; +$personalData['data'] = $personalDataContent; +//$personalData['responsible'] = api_get_setting('personal_data_responsible_org'); + +$em = Database::getManager(); +/** @var LegalRepository $legalTermsRepo */ +$legalTermsRepo = $em->getRepository('ChamiloCoreBundle:Legal'); +// Get data about the treatment of data +$treatmentTypes = LegalManager::getTreatmentTypeList(); + +foreach ($treatmentTypes as $id => $item) { + $personalData['treatment'][$item]['title'] = get_lang('PersonalData'.ucfirst($item).'Title'); + $legalTerm = $legalTermsRepo->findOneByTypeAndLanguage($id, api_get_language_id($user_language)); + $legalTermContent = ''; + if (!empty($legalTerm[0]) && is_array($legalTerm[0])) { + $legalTermContent = $legalTerm[0]['content']; + } + $personalData['treatment'][$item]['content'] = $legalTermContent; +} +$officerName = api_get_configuration_value('data_protection_officer_name'); +$officerRole = api_get_configuration_value('data_protection_officer_role'); +$officerEmail = api_get_configuration_value('data_protection_officer_email'); +if (!empty($officerName)) { + $personalData['officer_name'] = $officerName; + $personalData['officer_role'] = $officerRole; + $personalData['officer_email'] = $officerEmail; +} + +$tpl = new Template(null); + +$actions = Display::url( + Display::return_icon('excel.png', get_lang('Export'), [], ICON_SIZE_MEDIUM), + api_get_path(WEB_CODE_PATH).'social/personal_data.php?export=1' +); + +$tpl->assign('actions', Display::toolbarAction('toolbar', [$actions])); + +$termLink = ''; +if (api_get_setting('allow_terms_conditions') === 'true') { + $url = api_get_path(WEB_CODE_PATH).'social/terms.php'; + $termLink = Display::url($url, $url); +} + +// Block Social Avatar +SocialManager::setSocialUserBlock($tpl, api_get_user_id(), 'messages'); +if (api_get_setting('allow_social_tool') === 'true') { + $tpl->assign('social_menu_block', $socialMenuBlock); + $tpl->assign('personal_data', $personalData); +} else { + $tpl->assign('social_menu_block', ''); + $tpl->assign('personal_data_block', $personalDataContent); +} + +$tpl->assign('permission', $permitionBlock); +$tpl->assign('term_link', $termLink); +$socialLayout = $tpl->get_template('social/personal_data.tpl'); +$tpl->display($socialLayout); diff --git a/main/social/terms.php b/main/social/terms.php new file mode 100644 index 0000000000..ce24ed4485 --- /dev/null +++ b/main/social/terms.php @@ -0,0 +1,52 @@ +assign('actions', Display::toolbarAction('toolbar', [$actions])); + +// Block Social Avatar +SocialManager::setSocialUserBlock($tpl, api_get_user_id(), 'messages'); +if (api_get_setting('allow_social_tool') === 'true') { + $tpl->assign('social_menu_block', $socialMenuBlock); +} else { + $tpl->assign('social_menu_block', ''); +} +$tpl->assign('term', $term); + +$socialLayout = $tpl->get_template('social/terms.tpl'); +$tpl->display($socialLayout);