Merge branch '1.9.x' of github.com:chamilo/chamilo-lms into nuevo

1.9.x
Julio Montoya 11 years ago
commit aa7cc03785
  1. 2
      main/admin/access_url_edit_usergroup_to_url.php
  2. 109
      main/admin/configure_homepage.php
  3. 77
      main/exercice/aiken.php
  4. 85
      main/exercice/export/aiken/aiken_classes.php
  5. 407
      main/exercice/export/aiken/aiken_import.inc.php
  6. BIN
      main/img/icons/32/import_aiken.png
  7. 37
      main/inc/lib/banner.lib.php
  8. 1
      main/lang/english/admin.inc.php
  9. 4
      main/lang/english/exercice.inc.php
  10. 1
      main/lang/english/install.inc.php
  11. 26
      main/lang/english/trad4all.inc.php
  12. 1
      main/lang/english/work.inc.php
  13. 1
      main/lang/spanish/admin.inc.php
  14. 4
      main/lang/spanish/exercice.inc.php
  15. 1
      main/lang/spanish/install.inc.php
  16. 35
      main/lang/spanish/trad4all.inc.php
  17. 1
      main/lang/spanish/work.inc.php

@ -195,7 +195,7 @@ if (!empty($errorMsg)) {
<td align="center"><b><?php echo get_lang('UserGroupListInPlatform') ?> :</b>
</td>
<td></td>
<td align="center"><b><?php echo get_lang('UserGroupListIn').' '.$url_selected; ?></b></td>
<td align="center"><b><?php printf(get_lang('UserGroupListInX'),$url_selected); ?></b></td>
</tr>
<tr>

@ -4,6 +4,42 @@
* Configure the portal homepage (manages multi-urls and languages)
* @package chamilo.admin
*/
/**
* Creates menu tabs for logged and anonymous users
*
* This function copies the file containing private a public tabs (home_tabs_logged_in_$language.html)
* in to the public tab template (home_tabs_$language.html) but without the private tabs.
* Private tabs are the ones including "?private" string in the end of the url, ex: http://google.com/?private
*
* @param string Name of the file been updated by the administration, ex: home_tabs_logged_in_($language).html
*/
function home_tabs($file_logged_in)
{
$file_logged_out = str_replace('_logged_in','', $file_logged_in);
//variables initialization
$data_logged_out = array();
$data_logged_in = array();
//we read the file with all links
$file = file($file_logged_in);
foreach ($file as $line) {
//not logged user only sees public links
if (!preg_match('/::private/',$line)) {
$data_logged_out[] = $line;
}
//logged user only sees all links
$data_logged_in[] = $line;
}
//tabs file for logged out users
$fp = fopen($file_logged_out, 'w');
fputs($fp, implode("\n", $data_logged_out));
fclose($fp);
//tabs file for logged in users
$fp = fopen($file_logged_in, 'w');
fputs($fp, implode("\n", $data_logged_in));
fclose($fp);
}
/**
* Code
*/
@ -107,14 +143,15 @@ if (api_is_multiple_url_enabled()) {
$homep = api_get_path(SYS_PATH).'home/'; //homep for Home Path
}
$menuf = 'home_menu'; //menuf for Menu File
$newsf = 'home_news'; //newsf for News File
$topf = 'home_top'; //topf for Top File
$noticef = 'home_notice'; //noticef for Notice File
$menutabs= 'home_tabs'; //menutabs for tabs Menu
$menuf = 'home_menu'; //menuf for Menu File
$newsf = 'home_news'; //newsf for News File
$topf = 'home_top'; //topf for Top File
$noticef = 'home_notice'; //noticef for Notice File
$menutabs = 'home_tabs'; //menutabs for tabs Menu
$mtloggedin= 'home_tabs_logged_in'; //menutabs for tabs Menu
$ext = '.html'; //ext for HTML Extension - when used frequently, variables are
// faster than hardcoded strings
$homef = array($menuf, $newsf, $topf, $noticef, $menutabs);
$homef = array($menuf, $newsf, $topf, $noticef, $menutabs, $mtloggedin);
// If language-specific file does not exist, create it by copying default file
foreach ($homef as $my_file) {
@ -151,7 +188,7 @@ if (!empty($_GET['link'])) {
// Start analysing requested actions
if (!empty($action)) {
if ($_POST['formSent']) {
if (!empty($_POST['formSent'])) {
// Variables used are $homep for home path, $menuf for menu file, $newsf
// for news file, $topf for top file, $noticef for noticefile,
// $ext for '.html'
@ -328,7 +365,7 @@ if (!empty($action)) {
} elseif (!empty($link_url) && !strstr($link_url, '://')) {
$link_url='http://'.$link_url;
}
$menuf = ($action == 'insert_tabs' || $action == 'edit_tabs')? $menutabs : $menuf;
$menuf = ($action == 'insert_tabs' || $action == 'edit_tabs')? $mtloggedin : $menuf;
if (!is_writable($homep.$menuf.'_'.$lang.$ext)) {
$errorMsg = get_lang('HomePageFilesNotWritable');
} elseif (empty($link_name)) {
@ -375,8 +412,10 @@ if (!empty($action)) {
if ($fp) {
if (empty($link_html)) {
fputs($fp, get_lang('MyTextHere'));
home_tabs($homep.$filename);
} else {
fputs($fp, $link_html);
home_tabs($homep.$filename);
}
fclose($fp);
}
@ -387,6 +426,7 @@ if (!empty($action)) {
$fp = @fopen($homep.$filename, 'w');
if ($fp) {
fputs($fp, $link_html);
home_tabs($homep.$filename);
fclose($fp);
}
}
@ -421,14 +461,16 @@ if (!empty($action)) {
if (is_writable($homep.$menuf.'_'.$lang.$ext)) {
$fp = fopen($homep.$menuf.'_'.$lang.$ext, 'w');
fputs($fp, $home_menu);
home_tabs($homep.$menuf.'_'.$lang.$ext);
fclose($fp);
if ($_POST['all_langs']) {
if (!empty($_POST['all_langs'])) {
foreach ($_languages['name'] as $key => $value) {
$lang_name = $_languages['folder'][$key];
if (file_exists($homep.$menuf.'_'.$lang_name.$ext)) {
if (is_writable($homep.$menuf.'_'.$lang_name.$ext)) {
$fp = fopen($homep.$menuf.'_'.$lang_name.$ext, 'w');
fputs($fp, $home_menu);
home_tabs($homep.$menuf.'_'.$lang_name.$ext);
fclose($fp);
}
}
@ -438,6 +480,7 @@ if (!empty($action)) {
if (is_writable($homep.$menuf.$ext)) {
$fpo = fopen($homep.$menuf.$ext, 'w');
fputs($fpo, $home_menu);
home_tabs($homep.$menuf.$ext);
fclose($fpo);
}
}
@ -448,6 +491,7 @@ if (!empty($action)) {
//File does not exist
$fp = fopen($homep.$menuf.'_'.$lang.$ext, 'w');
fputs($fp, $home_menu);
home_tabs($homep.$menuf.'_'.$lang.$ext);
fclose($fp);
if ($_POST['all_langs']) {
foreach ($_languages['name'] as $key => $value) {
@ -455,6 +499,7 @@ if (!empty($action)) {
if (file_exists($homep.$menuf.'_'.$lang_name.$ext)) {
$fp = fopen($homep.$menuf.'_'.$lang_name.$ext, 'w');
fputs($fp, $home_menu);
home_tabs($homep.$menuf.'_'.$lang_name.$ext);
fclose($fp);
}
}
@ -481,7 +526,7 @@ if (!empty($action)) {
// A link is deleted by getting the file into an array, removing the
// link and re-writing the array to the file
$link_index = intval($_GET['link_index']);
$menuf = ($action == 'delete_tabs')? $menutabs : $menuf;
$menuf = ($action == 'delete_tabs')? $mtloggedin : $menuf;
$home_menu = @file($homep.$menuf.'_'.$lang.$ext);
if (empty($home_menu)) {
$home_menu = array();
@ -498,11 +543,13 @@ if (!empty($action)) {
$fp = fopen($homep.$menuf.'_'.$lang.$ext, 'w');
fputs($fp, $home_menu);
home_tabs($homep.$menuf.'_'.$lang.$ext);
fclose($fp);
if (file_exists($homep.$menuf.$ext)) {
if (is_writable($homep.$menuf.$ext)) {
$fpo = fopen($homep.$menuf.$ext,'w');
fputs($fpo, $home_menu);
home_tabs($homep.$menuf.$ext);
fclose($fpo);
}
}
@ -554,7 +601,7 @@ if (!empty($action)) {
case 'insert_link':
// This request is the preparation for the addition of an item in home_menu
$home_menu = '';
$menuf = ($action == 'edit_tabs')? $menutabs : $menuf;
$menuf = ($action == 'edit_tabs')? $mtloggedin : $menuf;
if (is_file($homep.$menuf.'_'.$lang.$ext) && is_readable($homep.$menuf.'_'.$lang.$ext)) {
$home_menu = @file($homep.$menuf.'_'.$lang.$ext);
} elseif(is_file($homep.$menuf.$lang.$ext) && is_readable($homep.$menuf.$lang.$ext)) {
@ -575,11 +622,13 @@ if (!empty($action)) {
case 'insert_tabs':
// This request is the preparation for the addition of an item in home_menu
$home_menu = '';
if (is_file($homep.$menutabs.'_'.$lang.$ext) && is_readable($homep.$menutabs.'_'.$lang.$ext)) {
$home_menu = @file($homep.$menutabs.'_'.$lang.$ext);
} elseif (is_file($homep.$menutabs.$lang.$ext) && is_readable($homep.$menutabs.$lang.$ext)) {
$home_menu = @file($homep.$menutabs.$lang.$ext);
} else {
if (is_file($homep.$mtloggedin.'_'.$lang.$ext) && is_readable($homep.$mtloggedin.'_'.$lang.$ext)) {
$home_menu = @file($homep.$mtloggedin.'_'.$lang.$ext);
} elseif (is_file($homep.$mtloggedin.$lang.$ext) && is_readable($homep.$mtloggedin.$lang.$ext)) {
$home_menu = @file($homep.$mtloggedin.$lang.$ext);
} elseif (touch($homep.$mtloggedin.'_'.$lang.$ext)) {
$home_menu = @file($homep.$mtloggedin.'_'.$lang.$ext);
} else {
$errorMsg = get_lang('HomePageFilesNotReadable');
}
if (empty($home_menu)) {
@ -596,7 +645,7 @@ if (!empty($action)) {
case 'edit_link':
// This request is the preparation for the edition of the links array
$home_menu = '';
$menuf = ($action == 'edit_tabs')? $menutabs : $menuf;
$menuf = ($action == 'edit_tabs')? $mtloggedin : $menuf;
if (is_file($homep.$menuf.'_'.$lang.$ext) && is_readable($homep.$menuf.'_'.$lang.$ext)) {
$home_menu = @file($homep.$menuf.'_'.$lang.$ext);
} elseif(is_file($homep.$menuf.$lang.$ext) && is_readable($homep.$menuf.$lang.$ext)) {
@ -745,13 +794,14 @@ switch ($action) {
$form->addElement('header', '', $tool_name);
$form->addElement('hidden', 'formSent', '1');
$form->addElement('hidden', 'link_index', ($action == 'edit_link' || $action == 'edit_tabs') ? $link_index : '0');
$form->addElement('hidden', 'filename', ($action == 'edit_link' || $action == 'edit_tabs') ? $filename : '');
$form->addElement('hidden', 'filename', ($action == 'edit_link' || $action == 'edit_tabs') ? (!empty($filename) ? $filename : '') : '');
$form->addElement('text', 'link_name', get_lang('LinkName'), array('size' => '30', 'maxlength' => '50'));
$default['link_name'] = $link_name;
if (!empty($link_name)) {
$default['link_name'] = $link_name;
}
$default['link_url'] = empty($link_url) ? 'http://' : api_htmlentities($link_url, ENT_QUOTES);
$form->addElement('text', 'link_url', array(get_lang('LinkURL'), get_lang('Optional')), array('size' => '30', 'maxlength' => '100', 'style' => 'width: 350px;'));
$form->addElement('text', 'link_url', array(get_lang('LinkURL'), get_lang('Optional').'<br />'.get_lang('GlobalLinkUseDoubleColumnPrivateToShowPrivately')), array('size' => '30', 'maxlength' => '100', 'style' => 'width: 350px;'));
$options = array('-1' => get_lang('FirstPlace'));
@ -763,7 +813,8 @@ switch ($action) {
foreach ($home_menu as $key => $enreg) {
if (strlen($enreg = trim(strip_tags($enreg))) > 0) {
$options[$key] = get_lang('After').' &quot;'.$enreg.'&quot;';
$selected = $formSent && $insert_where == $key ? $key : '';
$formSentCheck = (!empty($_POST['formSent']) ? true : false);
$selected = $formSentCheck && $insert_where == $key ? $key : '';
}
}
}
@ -778,7 +829,7 @@ switch ($action) {
$default['add_in_tab'] = $add_in_tab;
}
if ($target_blank) $target_blank_checkbox->setChecked(true);
if (!empty($target_blank)) { $target_blank_checkbox->setChecked(true); }
if ($action == 'edit_link' && (empty($link_url) || $link_url == 'http://' || $link_url == 'https://')) {
if (api_get_setting('wcag_anysurfer_public_pages')=='true') {
@ -792,9 +843,9 @@ switch ($action) {
if (in_array($action, array('edit_tabs','insert_tabs'))) {
if (api_get_setting('wcag_anysurfer_public_pages')=='true') {
$form->addElement('html', get_lang('Content').' ('.get_lang('Optional').')');
$form->addElement('html', WCAG_Rendering::create_xhtml(isset($_POST['link_html'])?$_POST['link_html']:$link_html));
$form->addElement('html', WCAG_Rendering::create_xhtml(isset($_POST['link_html'])?$_POST['link_html']:(!empty($link_html) ? $link_html : '')));
} else {
$default['link_html'] = isset($_POST['link_html']) ? $_POST['link_html'] : $link_html;
$default['link_html'] = isset($_POST['link_html']) ? $_POST['link_html'] : (!empty($link_html) ? $link_html : '');
$form->add_html_editor('link_html', get_lang('Content'), false, false, array('ToolbarSet' => 'PortalHomePage', 'Width' => '100%', 'Height' => '400'));
}
}
@ -947,10 +998,10 @@ switch ($action) {
// Add new page
$home_menu = '';
if (file_exists($homep.$menutabs.'_'.$lang.$ext)) {
$home_menu = @file($homep.$menutabs.'_'.$lang.$ext);
if (file_exists($homep.$mtloggedin.'_'.$lang.$ext)) {
$home_menu = @file($homep.$mtloggedin.'_'.$lang.$ext);
} else {
$home_menu = @file($homep.$menutabs.$ext);
$home_menu = @file($homep.$mtloggedin.$ext);
}
if (empty($home_menu)) {
$home_menu = array();
@ -1067,4 +1118,4 @@ switch ($action) {
<?php
break;
}
Display::display_footer();
Display::display_footer();

@ -1,11 +1,10 @@
<?php
/* For licensing terms, see /license.txt */
/**
* Code for Aiken import integration.
* @package chamilo.exercise
* @author Ronny Velasquez
* @author César Perales <cesar.perales@gmail.com> Updated function names and import files for Aiken format support
* @version $Id: Aiken.php 2010-03-12 12:14:25Z $
* Code for Aiken import integration.
* @package chamilo.exercise
* @author Ronny Velasquez <ronny.velasquez@beeznest.com>
* @author César Perales <cesar.perales@gmail.com> Updated function names and import files for Aiken format support
*/
/**
* Code
@ -29,7 +28,7 @@ $this_section = SECTION_COURSES;
// access restriction: only teachers are allowed here
if (!api_is_allowed_to_edit(null, true)) {
api_not_allowed();
api_not_allowed();
}
// the breadcrumbs
@ -39,18 +38,21 @@ $is_allowedToEdit = api_is_allowed_to_edit(null, true);
/**
* This function displays the form for import of the zip file with qti2
*/
function aiken_display_form() {
$name_tools = get_lang('ImportAikenQuiz');
$form = '<div class="actions">';
$form .= '<a href="exercice.php?show=test">' . Display :: return_icon('back.png', get_lang('BackToExercisesList'),'',ICON_SIZE_MEDIUM).'</a>';
$form .= '</div>';
function aiken_display_form($msg = '') {
$name_tools = get_lang('ImportAikenQuiz');
$form = '<div class="actions">';
$form .= '<a href="exercice.php?show=test">' . Display :: return_icon('back.png', get_lang('BackToExercisesList'),'',ICON_SIZE_MEDIUM).'</a>';
$form .= '</div>';
if (!empty($msg)) {
$form .= $msg;
}
$form_validator = new FormValidator('aiken_upload', 'post',api_get_self()."?".api_get_cidreq(), null, array('enctype' => 'multipart/form-data') );
$form_validator->addElement('header', $name_tools);
$form_validator->addElement('file', 'userFile', get_lang('DownloadFile'));
$form_validator->addElement('style_submit_button', 'submit', get_lang('Send'), 'class="upload"');
$form .= $form_validator->return_form();
$form .= $form_validator->return_form();
echo $form;
echo $form;
}
/**
@ -59,43 +61,44 @@ function aiken_display_form() {
*/
function aiken_import_file($array_file) {
$unzip = 0;
$lib_path = api_get_path(LIBRARY_PATH);
require_once $lib_path.'fileUpload.lib.php';
require_once $lib_path.'fileManage.lib.php';
$process = process_uploaded_file($array_file);
if (preg_match('/\.zip$/i', $array_file['name'])) {
// if it's a zip, allow zip upload
$unzip = 1;
}
if ($process && $unzip == 1) {
$main_path = api_get_path(SYS_CODE_PATH);
require_once $main_path.'exercice/export/aiken/aiken_import.inc.php';
$unzip = 0;
$lib_path = api_get_path(LIBRARY_PATH);
require_once $lib_path.'fileUpload.lib.php';
require_once $lib_path.'fileManage.lib.php';
$process = process_uploaded_file($array_file);
if (preg_match('/\.(zip|txt)$/i', $array_file['name'])) {
// if it's a zip, allow zip upload
$unzip = 1;
}
if ($process && $unzip == 1) {
$main_path = api_get_path(SYS_CODE_PATH);
require_once $main_path.'exercice/export/aiken/aiken_import.inc.php';
require_once $main_path.'exercice/export/aiken/aiken_classes.php';
$imported = import_exercise($array_file['name']);
if ($imported) {
header('Location: exercice.php?'.api_get_cidreq());
header('Location: exercice.php?'.api_get_cidreq());
} else {
Display::display_error_message(get_lang('UplNoFileUploaded'));
return false;
$msg = Display::return_message(get_lang('UplNoFileUploaded'),'error');
return $msg;
}
}
}
}
// display header
Display::display_header(get_lang('ImportAikenQuiz'), 'Exercises');
$msg = '';
// import file
if ((api_is_allowed_to_edit(null, true))) {
if (isset($_POST['submit'])) {
aiken_import_file($_FILES['userFile']);
}
if (isset($_POST['submit'])) {
$msg = aiken_import_file($_FILES['userFile']);
}
}
// display header
Display::display_header(get_lang('ImportAikenQuiz'), 'Exercises');
// display Aiken form
aiken_display_form();
aiken_display_form($msg);
// display the footer
Display::display_footer();

@ -1,4 +1,4 @@
<?php // $Id: $
<?php
/* For licensing terms, see /license.txt */
/**
* @author Claro Team <cvs@claroline.net>
@ -21,20 +21,9 @@ if (!function_exists('mime_content_type')) {
require_once(api_get_path(SYS_CODE_PATH).'/exercice/answer.class.php');
require_once(api_get_path(SYS_CODE_PATH).'/exercice/exercise.class.php');
require_once(api_get_path(SYS_CODE_PATH).'/exercice/question.class.php');
//require_once(api_get_path(SYS_CODE_PATH).'/exercice/hotspot.class.php');
require_once(api_get_path(SYS_CODE_PATH).'/exercice/unique_answer.class.php');
//require_once(api_get_path(SYS_CODE_PATH).'/exercice/multiple_answer.class.php');
//require_once(api_get_path(SYS_CODE_PATH).'/exercice/multiple_answer_combination.class.php');
//require_once(api_get_path(SYS_CODE_PATH).'/exercice/matching.class.php');
//require_once(api_get_path(SYS_CODE_PATH).'/exercice/freeanswer.class.php');
//require_once(api_get_path(SYS_CODE_PATH).'/exercice/fill_blanks.class.php');
//include_once $path . '/../../lib/answer_multiplechoice.class.php';
//include_once $path . '/../../lib/answer_truefalse.class.php';
//include_once $path . '/../../lib/answer_fib.class.php';
//include_once $path . '/../../lib/answer_matching.class.php';
/**
*
* @package chamilo.exercise
* Aiken2Question transformation class
*/
class Aiken2Question extends Question
{
@ -71,72 +60,4 @@ class Aiken2Question extends Question
*/
class AikenAnswerMultipleChoice extends Answer
{
/**
* Return the XML flow for the possible answers.
*
*/
function imsExportResponses($questionIdent, $questionStatment)
{
$this->answerList = $this->getAnswersList(true);
$out = ' <choiceInteraction responseIdentifier="' . $questionIdent . '" >' . "\n";
$out .= ' <prompt> ' . $questionStatment . ' </prompt>'. "\n";
if (is_array($this->answerList)) {
foreach ($this->answerList as $current_answer) {
$out .= ' <simpleChoice identifier="answer_' . $current_answer['id'] . '" fixed="false">' . $current_answer['answer'];
if (isset($current_answer['comment']) && $current_answer['comment'] != '')
{
$out .= '<feedbackInline identifier="answer_' . $current_answer['id'] . '">' . $current_answer['comment'] . '</feedbackInline>';
}
$out .= '</simpleChoice>'. "\n";
}
}
$out .= ' </choiceInteraction>'. "\n";
return $out;
}
/**
* Return the XML flow of answer ResponsesDeclaration
*
*/
function imsExportResponsesDeclaration($questionIdent)
{
$this->answerList = $this->getAnswersList(true);
$type = $this->getQuestionType();
if ($type == MCMA) $cardinality = 'multiple'; else $cardinality = 'single';
$out = ' <responseDeclaration identifier="' . $questionIdent . '" cardinality="' . $cardinality . '" baseType="identifier">' . "\n";
//Match the correct answers
$out .= ' <correctResponse>'. "\n";
if (is_array($this->answerList)) {
foreach($this->answerList as $current_answer) {
if ($current_answer['correct'])
{
$out .= ' <value>answer_'. $current_answer['id'] .'</value>'. "\n";
}
}
}
$out .= ' </correctResponse>'. "\n";
//Add the grading
$out .= ' <mapping>'. "\n";
if (is_array($this->answerList)) {
foreach($this->answerList as $current_answer)
{
if (isset($current_answer['grade']))
{
$out .= ' <mapEntry mapKey="answer_'. $current_answer['id'] .'" mappedValue="'.$current_answer['grade'].'" />'. "\n";
}
}
}
$out .= ' </mapping>'. "\n";
$out .= ' </responseDeclaration>'. "\n";
return $out;
}
}
}

@ -1,224 +1,257 @@
<?php
/* For licensing terms, see /license.txt */
/**
* @copyright (c) 2001-2006 Universite catholique de Louvain (UCL)
*
* @license http://www.gnu.org/copyleft/gpl.html (GPL) GENERAL PUBLIC LICENSE
*
* @package chamilo.exercise
*
* Library for the import of Aiken format
* @author claro team <cvs@claroline.net>
* @author Guillaume Lederer <guillaume@claroline.net>
* @author César Perales <cesar.perales@gmail.com> Parse function for Aiken format
* @package chamilo.exercise
*/
/**
* Security check
*/
if (count(get_included_files()) == 1)
die('---');
die('---');
/**
* function to create a temporary directory (SAME AS IN MODULE ADMIN)
* Creates a temporary directory
* @param $dir
* @param string $prefix
* @param int $mode
* @return string
*/
function tempdir($dir, $prefix = 'tmp', $mode = 0777) {
if (substr($dir, -1) != '/')
$dir .= '/';
if (substr($dir, -1) != '/')
$dir .= '/';
do {
$path = $dir . $prefix . mt_rand(0, 9999999);
} while (!mkdir($path, $mode));
do {
$path = $dir . $prefix . mt_rand(0, 9999999);
} while (!mkdir($path, $mode));
return $path;
return $path;
}
/**
* @return the path of the temporary directory where the exercise was uploaded and unzipped
* Gets the uploaded file (from $_FILES) and unzip it to the given directory
* @param string The directory where to do the work
* @param string The path of the temporary directory where the exercise was uploaded and unzipped
* @return bool True on success, false on failure
*/
function get_and_unzip_uploaded_exercise($baseWorkDir, $uploadPath) {
global $_course, $_user;
//Check if the file is valid (not to big and exists)
if (!isset ($_FILES['userFile']) || !is_uploaded_file($_FILES['userFile']['tmp_name'])) {
// upload failed
return false;
}
if (preg_match('/.zip$/i', $_FILES['userFile']['name']) && handle_uploaded_document($_course, $_FILES['userFile'], $baseWorkDir, $uploadPath, $_user['user_id'], 0, null, 1)) {
if (!function_exists('gzopen')) {
//claro_delete_file($uploadPath);
return false;
}
// upload successfull
return true;
} else {
//claro_delete_file($uploadPath);
return false;
}
global $_course, $_user;
//Check if the file is valid (not to big and exists)
if (!isset ($_FILES['userFile']) || !is_uploaded_file($_FILES['userFile']['tmp_name'])) {
// upload failed
return false;
}
if (preg_match('/.zip$/i', $_FILES['userFile']['name']) && handle_uploaded_document($_course, $_FILES['userFile'], $baseWorkDir, $uploadPath, $_user['user_id'], 0, null, 1)) {
if (!function_exists('gzopen')) {
return false;
}
// upload successful
return true;
} elseif (preg_match('/.txt/i', $_FILES['userFile']['name']) && handle_uploaded_document($_course, $_FILES['userFile'], $baseWorkDir, $uploadPath, $_user['user_id'], 0, null, 0)) {
return true;
} else {
return false;
}
}
/**
* main function to import an exercise,
*
* Main function to import the Aiken exercise
* @return an array as a backlog of what was really imported, and error or debug messages to display
*/
function import_exercise($file) {
global $exercise_info;
global $element_pile;
global $non_HTML_tag_to_avoid;
global $record_item_body;
// used to specify the question directory where files could be found in relation in any question
global $questionTempDir;
$archive_path = api_get_path(SYS_ARCHIVE_PATH) . 'aiken';
$baseWorkDir = $archive_path;
if (!is_dir($baseWorkDir)) {
mkdir($baseWorkDir, api_get_permissions_for_new_directories(), true);
}
$uploadPath = '/';
// set some default values for the new exercise
$exercise_info = array ();
$exercise_info['name'] = preg_replace('/.zip$/i', '', $file);
$exercise_info['question'] = array();
$element_pile = array ();
// create parser and array to retrieve info from manifest
$element_pile = array (); //pile to known the depth in which we are
//$module_info = array (); //array to store the info we need
// if file is not a .zip, then we cancel all
if (!preg_match('/.zip$/i', $file)) {
Display :: display_error_message(get_lang('You must upload a zip file'));
return false;
}
// unzip the uploaded file in a tmp directory
if (!get_and_unzip_uploaded_exercise($baseWorkDir, $uploadPath)) {
Display :: display_error_message(get_lang('You must upload a zip file'));
return false;
}
// find the different manifests for each question and parse them.
$exerciseHandle = opendir($baseWorkDir);
//$question_number = 0;
$file_found = false;
$operation = false;
global $exercise_info;
global $element_pile;
global $non_HTML_tag_to_avoid;
global $record_item_body;
// used to specify the question directory where files could be found in relation in any question
global $questionTempDir;
$archive_path = api_get_path(SYS_ARCHIVE_PATH) . 'aiken';
$baseWorkDir = $archive_path;
if (!is_dir($baseWorkDir)) {
mkdir($baseWorkDir, api_get_permissions_for_new_directories(), true);
}
$uploadPath = '/';
// set some default values for the new exercise
$exercise_info = array ();
$exercise_info['name'] = preg_replace('/.(zip|txt)$/i', '', $file);
$exercise_info['question'] = array();
$element_pile = array ();
// create parser and array to retrieve info from manifest
$element_pile = array (); //pile to known the depth in which we are
//$module_info = array (); //array to store the info we need
// if file is not a .zip, then we cancel all
if (!preg_match('/.(zip|txt)$/i', $file)) {
Display :: display_error_message(get_lang('YouMustUploadAZipOrTxtFile'));
return false;
}
// unzip the uploaded file in a tmp directory
if (preg_match('/.(zip|txt)$/i', $file)) {
if (!get_and_unzip_uploaded_exercise($baseWorkDir, $uploadPath)) {
Display :: display_error_message(get_lang('ThereWasAProblemWithYourFile'));
return false;
}
}
// find the different manifests for each question and parse them
$exerciseHandle = opendir($baseWorkDir);
//$question_number = 0;
$file_found = false;
$operation = false;
$result = false;
// parse every subdirectory to search txt question files
while (false !== ($file = readdir($exerciseHandle))) {
if (is_dir($baseWorkDir . '/' . $file) && $file != "." && $file != "..") {
//find each manifest for each question repository found
$questionHandle = opendir($baseWorkDir . '/' . $file);
while (false !== ($questionFile = readdir($questionHandle))) {
if (preg_match('/.txt$/i', $questionFile)) {
$result = parse_file($baseWorkDir, $file, $questionFile);
$file_found = true;
}
}
} elseif (preg_match('/.txt$/i', $file)) {
$result = parse_file($baseWorkDir, '', $file);
$file_found = true;
} // else ignore file
}
if (!$file_found) {
Display :: display_error_message(get_lang('No TXT file found in the zip'));
return false;
}
// parse every subdirectory to search txt question files
while (false !== ($file = readdir($exerciseHandle))) {
if (is_dir($baseWorkDir . '/' . $file) && $file != "." && $file != "..") {
//find each manifest for each question repository found
$questionHandle = opendir($baseWorkDir . '/' . $file);
while (false !== ($questionFile = readdir($questionHandle))) {
if (preg_match('/.txt$/i', $questionFile)) {
$result = parse_file($baseWorkDir, $file, $questionFile);
$file_found = true;
}
}
} elseif (preg_match('/.txt$/i', $file)) {
$result = parse_file($baseWorkDir, '', $file);
$file_found = true;
} // else ignore file
}
if (!$file_found) {
Display :: display_error_message(get_lang('NoTxtFileFoundInTheZip'));
return false;
}
if ($result == false ) {
return false;
}
//add exercise in tool
//add exercise in tool
//1.create exercise
$exercise = new Exercise();
$exercise->exercise = $exercise_info['name'];
//1.create exercise
$exercise = new Exercise();
$exercise->exercise = $exercise_info['name'];
$exercise->save();
$last_exercise_id = $exercise->selectId();
if (!empty($last_exercise_id)) {
//For each question found...
foreach ($exercise_info['question'] as $key => $question_array) {
//2.create question
$question = new Aiken2Question();
$question->type = $question_array['type'];
$question->setAnswer();
$question->updateTitle($question_array['title']); // question ...
$type = $question->selectType();
$question->type = constant($type); // type ...
$question->save($last_exercise_id); // save computed grade
$last_question_id = $question->selectId();
//3.create answer
$answer = new Answer($last_question_id);
$answer->new_nbrAnswers = count($question_array['answer']);
foreach ($question_array['answer'] as $key => $answers) {
$key++;
$answer->new_answer[$key] = $answers['value']; // answer ...
$answer->new_comment[$key] = $answers['feedback']; // comment ...
$answer->new_position[$key] = $key; // position ...
// correct answers ...
if (in_array($key, $question_array['correct_answers'])) {
$answer->new_correct[$key] = 1;
} else {
$answer->new_correct[$key] = 0;
}
error_log($question_array['weighting']);
$answer->new_weighting[$key] = $question_array['weighting'][$key - 1];
}
$answer->save();
}
// delete the temp dir where the exercise was unzipped
my_delete($baseWorkDir . $uploadPath);
$operation = true;
}
return $operation;
$exercise->save();
$last_exercise_id = $exercise->selectId();
if (!empty($last_exercise_id)) {
//For each question found...
foreach ($exercise_info['question'] as $key => $question_array) {
//2.create question
$question = new Aiken2Question();
$question->type = $question_array['type'];
$question->setAnswer();
$question->updateTitle($question_array['title']); // question (short)...
$question->updateDescription($question_array['description']); // question (long)...
$type = $question->selectType();
$question->type = constant($type); // type ...
$question->save($last_exercise_id); // save computed grade
$last_question_id = $question->selectId();
//3.create answer
$answer = new Answer($last_question_id);
$answer->new_nbrAnswers = count($question_array['answer']);
$max_score = 0;
foreach ($question_array['answer'] as $key => $answers) {
$key++;
$answer->new_answer[$key] = $answers['value']; // answer ...
//$answer->new_comment[$key] = $answers['feedback']; // comment ...
$answer->new_position[$key] = $key; // position ...
// correct answers ...
if (in_array($key, $question_array['correct_answers'])) {
$answer->new_correct[$key] = 1;
$answer->new_comment[$key] = $question_array['feedback'];
} else {
$answer->new_correct[$key] = 0;
}
$answer->new_weighting[$key] = $question_array['weighting'][$key - 1];
$max_score += $question_array['weighting'][$key - 1];
}
$answer->save();
// Now that we know the question score, set it!
$question->updateWeighting($max_score);
$question->save();
}
// delete the temp dir where the exercise was unzipped
my_delete($baseWorkDir . $uploadPath);
$operation = true;
}
return $operation;
}
/**
* Parses an Aiken file and builds an array of exercise + questions to be
* imported by the import_exercise() function
* @param string Path to the directory with the file to be parsed (without final /)
* @param string Name of the last directory part for the file (without /)
* @param string Name of the file to be parsed (including extension)
* @return bool True on success, false on error
* @assert ('','','') === false
*/
function parse_file($exercisePath, $file, $questionFile) {
global $exercise_info;
global $questionTempDir;
$questionTempDir = $exercisePath . '/' . $file . '/';
$questionFilePath = $questionTempDir . $questionFile;
$data = file($questionFilePath);
$question_index = 0;
$correct_answer = '';
$answers_array = array();
foreach ($data as $linea => $info) {
$exercise_info['question'][$question_index]['type'] = 'MCUA';
if (preg_match('/^([A-Z])(\)|\.)\s(.*)/', $info, $matches)) {
//adding one of the posible answers
$exercise_info['question'][$question_index]['answer'][]['value'] = $matches[3];
$answers_array[] = $matches[1];
} elseif (preg_match('/^ANSWER:\s?([A-Z])\s?/', $info, $matches)) {
//the correct answers
$correct_answer_index = array_search($matches[1], $answers_array);
$exercise_info['question'][$question_index]['correct_answers'][] = $correct_answer_index + 1;
//weight for correct answer
$exercise_info['question'][$question_index]['weighting'][$correct_answer_index] = 1;
} elseif (preg_match('/^ANSWER_EXPLANATION:\s?(.*)\s?/', $info, $matches)) {
//Comment of correct answer
$exercise_info['question'][$question_index]['answer'][$correct_answer_index]['feedback'] = $matches[1];
} elseif (preg_match('/^TAGS:\s?([A-Z])\s?/', $info, $matches)) {
//TAGS for chamilo >= 1.10
$exercise_info['question'][$question_index]['answer_tags'] = explode(',', $matches[1]);
} elseif (preg_match('/^\n/',$info)) {
//moving to next question
$question_index++;
//emptying answers array when moving to next question
$answers_array = array();
} else {
//Question itself
$exercise_info['question'][$question_index]['title'] = $info;
}
}
$total_questions = count($exercise_info['question']);
foreach ($exercise_info['question'] as $key => $question) {
$exercise_info['question'][$key]['weighting'][current(array_keys($exercise_info['question'][$key]['weighting']))] = 20 / $total_questions;
}
return true;
global $exercise_info;
global $questionTempDir;
$questionTempDir = $exercisePath . '/' . $file . '/';
$questionFilePath = $questionTempDir . $questionFile;
if (!is_file($questionFilePath)) {
return false;
}
$data = file($questionFilePath);
$question_index = 0;
$correct_answer = '';
$answers_array = array();
$new_question = true;
foreach ($data as $line => $info) {
if ($question_index > 0 && $new_question == true && preg_match('/^(\r)?\n/',$info)) {
// double empty line
continue;
}
$new_question = false;
//make sure it is transformed from iso-8859-1 to utf-8 if in that form
if (!mb_check_encoding($info,'utf-8') && mb_check_encoding($info,'iso-8859-1')) {
$info = utf8_encode($info);
}
$exercise_info['question'][$question_index]['type'] = 'MCUA';
if (preg_match('/^([A-Z])(\)|\.)\s(.*)/', $info, $matches)) {
//adding one of the posible answers
$exercise_info['question'][$question_index]['answer'][]['value'] = $matches[3];
$answers_array[] = $matches[1];
} elseif (preg_match('/^ANSWER:\s?([A-Z])\s?/', $info, $matches)) {
//the correct answers
$correct_answer_index = array_search($matches[1], $answers_array);
$exercise_info['question'][$question_index]['correct_answers'][] = $correct_answer_index + 1;
//weight for correct answer
$exercise_info['question'][$question_index]['weighting'][$correct_answer_index] = 1;
} elseif (preg_match('/^ANSWER_EXPLANATION:\s?(.*)/', $info, $matches)) {
//Comment of correct answer
$correct_answer_index = array_search($matches[1], $answers_array);
//$exercise_info['question'][$question_index]['answer'][$correct_answer_index]['feedback'] = $matches[1];
$exercise_info['question'][$question_index]['feedback'] = $matches[1];
} elseif (preg_match('/^TAGS:\s?([A-Z])\s?/', $info, $matches)) {
//TAGS for chamilo >= 1.10
$exercise_info['question'][$question_index]['answer_tags'] = explode(',', $matches[1]);
} elseif (preg_match('/^(\r)?\n/',$info)) {
//moving to next question (tolerate \r\n or just \n)
$question_index++;
//emptying answers array when moving to next question
$answers_array = array();
$new_question = true;
} else {
//Question itself (use a 40-chars long description)
$exercise_info['question'][$question_index]['title'] = trim(substr($info,0,40)).'...';
$exercise_info['question'][$question_index]['description'] = $info;
}
}
$total_questions = count($exercise_info['question']);
foreach ($exercise_info['question'] as $key => $question) {
$exercise_info['question'][$key]['weighting'][current(array_keys($exercise_info['question'][$key]['weighting']))] = 20 / $total_questions;
}
return true;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

@ -368,9 +368,10 @@ function return_menu() {
$homep = api_get_path(SYS_PATH).'home/';
}
$ext = '.html';
$menutabs = 'home_tabs';
$home_top = '';
$ext = '.html';
$menutabs = 'home_tabs';
$mtloggedin = 'home_tabs_logged_in';
$home_top = '';
if (is_file($homep.$menutabs.'_'.$lang.$ext) && is_readable($homep.$menutabs.'_'.$lang.$ext)) {
$home_top = @(string)file_get_contents($homep.$menutabs.'_'.$lang.$ext);
@ -385,16 +386,40 @@ function return_menu() {
$open = str_replace('{rel_path}',api_get_path(REL_PATH), $home_top);
$open = api_to_system_encoding($open, api_detect_encoding(strip_tags($open)));
$open_mtloggedin = '';
if (api_get_user_id() && !api_is_anonymous()) {
if (is_file($homep.$mtloggedin.'_'.$lang.$ext) && is_readable($homep.$mtloggedin.'_'.$lang.$ext)) {
$home_top = @(string)file_get_contents($homep.$mtloggedin.'_'.$lang.$ext);
$home_top = str_replace('::private', '', $home_top);
} elseif (is_file($homep.$mtloggedin.$lang.$ext) && is_readable($homep.$mtloggedin.$lang.$ext)) {
$home_top = @(string)file_get_contents($homep.$mtloggedin.$lang.$ext);
$home_top = str_replace('::private', '', $home_top);
} else {
//$errorMsg = get_lang('HomePageFilesNotReadable');
}
$home_top = api_to_system_encoding($home_top, api_detect_encoding(strip_tags($home_top)));
$open_mtloggedin = str_replace('{rel_path}',api_get_path(REL_PATH), $home_top);
$open_mtloggedin = api_to_system_encoding($open_mtloggedin, api_detect_encoding(strip_tags($open_mtloggedin)));
}
$lis = '';
if (!empty($open)) {
if (strpos($open, 'show_menu') === false) {
if (!empty($open) OR !empty($open_mtloggedin)) {
if (strpos($open.$open_mtloggedin, 'show_menu') === false) {
if (api_is_anonymous()) {
$navigation[SECTION_CAMPUS] = null;
}
} else {
//$lis .= Display::tag('li', $open);
$lis .= $open;
if (api_get_user_id() && !api_is_anonymous()) {
$lis .= $open_mtloggedin;
} else {
$lis .= $open;
}
}
}

@ -2,6 +2,7 @@
/*
for more information: see languages.txt in the lang folder.
*/
$GlobalLinkUseDoubleColumnPrivateToShowPrivately = "Use ::private at the end of the link to show it only to logged-in users";
$CourseVisibilityHidden = "Hidden - Completely hidden to all users except the administrators";
$ApplyAllLanguages = "Apply this change to all available languages";
$CareerUpdated = "Career updated successfully";

@ -2,6 +2,10 @@
/*
for more information: see languages.txt in the lang folder.
*/
$ThereWasAProblemWithYourFile = "There was an unknown issue with your file. Please review its format and try again.";
$YouMustUploadAZipOrTxtFile = "You must upload a .txt or .zip file";
$NoTxtFileFoundInTheZip = "No .txt file found in zip";
$ImportAikenQuiz = "Import Aiken quiz";
$ExerciseWasActivatedFromXToY = "Exercise was activated from %s to %s";
$SelectAnAnswerToContinue = "Select an answer to continue";
$IfYouContinueYourAnswerWillBeSavedAnyChangeWillBeNotAllowed = "If you continue your answers will be saved, any change will be not allowed later. Are you sure you want to continue?";

@ -2,6 +2,7 @@
/*
for more information: see languages.txt in the lang folder.
*/
$DateTimezoneSettingNotSet = "We have detected that your PHP installation does not define the date.timezone setting. This is a requirement of Chamilo. Please make sure it is configured by checking your php.ini configuration, otherwise you will run into problems. We warned you!";
$langStatDB = "Tracking DB.";
$langEnableTracking = "Enable Tracking";
$langInstituteShortName = "Your company short name";

@ -2,6 +2,28 @@
/*
for more information: see languages.txt in the lang folder.
*/
$NumberOfGroupsToCreate = "Number of groups to create";
$CoachesSubscribedAsATeacherInCourseX = "Coaches subscribed as teachers in course %s";
$EnrollStudentsFromExistingSessions = "Enroll students from existing sessions";
$EnrollTrainersFromExistingSessions = "Enroll trainers from existing sessions";
$AddingStudentsFromSessionXToSessionY = "Adding students from session <b>%s</b> to session <b>%s</b>";
$AddUserGroupToThatURL = "Add user group to this URL";
$FirstLetter = "First letter";
$UserGroupList = "User groups list";
$AddUserGroupToURL = "Add group to URL";
$UserGroupListInX = "Groups in %s";
$UserGroupListInPlatform = "Platform groups list";
$EditUserGroupToURL = "Edit groups for one URL";
$ManageUserGroup = "Manage user groups";
$RegistrationDisabled = "Sorry, you are trying to access the registration page for this portal, but registration is currently disabled. Please contact the administrator (see contact information in the footer). If you already have an account on this site.";
$CasDirectCourseAccess = "Enter course with CAS authentication";
$TeachersWillBeAddedAsCoachInAllCourseSessions = "Teachers will be added as a coach in all course sessions.";
$YesImSure = "Yes, I'm sure";
$NoIWantToTurnBack = "No, I want to return";
$IfYouContinueYourAnswerWillBeSavedAnyChangeWillBeNotAllowed = "If you continue your answer will be saved. Any change will be not allowed.";
$SpecialCourses = "Special courses";
$Roles = "Roles";
$ToolCurriculum = "Curriculum";
$ToReviewXYZ = "%s to review (%s)";
$UnansweredXYZ = "%s unanswered (%s)";
$AnsweredXYZ = "%s answered (%s)+(%s)";
@ -1463,8 +1485,4 @@ $DataTableSearch = "Search";
$HideColumn = "Hide column";
$DisplayColumn = "Show column";
$LegalAgreementAccepted = "Legal agreement accepted";
$AddingStudentsFromSessionXToSessionY = "Adding students from session <b>%s</b> to session <b>%s </b>";
$EnrollTrainersFromExistingSessions = "Enroll trainers from existing sessions";
$EnrollStudentsFromExistingSessions = "Enroll students from existing sessions";
$CoachesSubscribedAsATeacherInCourseX = "Coaches will be subcribed as a teacher in the course %s";
?>

@ -2,6 +2,7 @@
/*
for more information: see languages.txt in the lang folder.
*/
$FolderDoesntExistsInFileSystem = "Target folder doesn't exist on the server.";
$HandedOutDate = "Time of reception";
$HandedOut = "Handed out";
$HandOutDateLimit = "Deadline";

@ -2,6 +2,7 @@
/*
for more information: see languages.txt in the lang folder.
*/
$GlobalLinkUseDoubleColumnPrivateToShowPrivately = "Use ::private pegado al fin del enlace si quiere mostrarlo solo a los usuarios identificados";
$CourseVisibilityHidden = "Invisible - Totalmente invisible para todos los usuarios a parte de los administradores";
$ApplyAllLanguages = "Aplicar cambio a todos los lenguajes habilitados";
$CareerUpdated = "Carrera actualizada satisfactoriamente";

@ -2,6 +2,10 @@
/*
for more information: see languages.txt in the lang folder.
*/
$ThereWasAProblemWithYourFile = "Hubo un error desconocido en su archivo. Por favor revise su formato e intente nuevamente.";
$YouMustUploadAZipOrTxtFile = "Tiene que subir un archivo .txt o .zip";
$NoTxtFileFoundInTheZip = "No se encontró ningun archivo .txt en el zip";
$ImportAikenQuiz = "Importar quiz en formato Aiken";
$ExerciseWasActivatedFromXToY = "El ejercicio estuvo disponible desde %s hasta %s";
$SelectAnAnswerToContinue = "Tiene que seleccionar una respuesta para poder continuar";
$IfYouContinueYourAnswerWillBeSavedAnyChangeWillBeNotAllowed = "Si continua, sus respuestas serán guardadas, y no podrá más modificarlas. Está seguro que desea terminar?";

@ -2,6 +2,7 @@
/*
for more information: see languages.txt in the lang folder.
*/
$DateTimezoneSettingNotSet = "Hemos detectado que su instalación de PHP no tiene el parámetro date.timezone configurado. Este es un requerimiento para instalar Chamilo. Asegúrese que esté configurado verificando su archivo de configuración php.ini, sino tendrá problemas al usar Chamilo. Ahora ya lo sabe!";
$langStatDB = "Base de datos de seguimiento. Úsela sólo si hay varias bases de datos.";
$langEnableTracking = "Permitir seguimiento";
$langInstituteShortName = "Acrónimo de la organización";

@ -2,6 +2,28 @@
/*
for more information: see languages.txt in the lang folder.
*/
$NumberOfGroupsToCreate = "Cantidad de grupos a crear";
$CoachesSubscribedAsATeacherInCourseX = "Tutores inscritos como profesores en curso %s";
$EnrollStudentsFromExistingSessions = "Suscribir estudiantes de sesiones existentes";
$EnrollTrainersFromExistingSessions = "Suscribir tutores de sesiones existentes";
$AddingStudentsFromSessionXToSessionY = "Añadiendo estudiantes de la sesión %s a la sesión %s";
$AddUserGroupToThatURL = "Agregar clases a una URL";
$FirstLetter = "Primer letra";
$UserGroupList = "Lista de clases";
$AddUserGroupToURL = "Agregar clases a una URL";
$UserGroupListInX = "Clases de %s";
$UserGroupListInPlatform = "Lista de clases en la plataforma.";
$EditUserGroupToURL = "Editar clases de una URL";
$ManageUserGroup = "Administrar clases";
$RegistrationDisabled = "Disculpe, está intentando acceder a la página de registro del portal, pero el registro de usuarios está actualmente deshabilitada. Por favor, contacte al administrador(Véase información de contacto). Si usted ya tiene una cuenta en nuestro sitio.";
$CasDirectCourseAccess = "Ingrese el curso con autentificación CAS";
$TeachersWillBeAddedAsCoachInAllCourseSessions = "Los profesores serán agregados como tutores en todos los cursos dentre de las sesiones.";
$YesImSure = "Si, estoy seguro.";
$NoIWantToTurnBack = "No, deseo regresar.";
$IfYouContinueYourAnswerWillBeSavedAnyChangeWillBeNotAllowed = "Si continúa se guardará sus respuestas. Cualquier cambio no posterir no será permitido.";
$SpecialCourses = "Cursos especiales";
$Roles = "Roles";
$ToolCurriculum = "Curriculum";
$ToReviewXYZ = "%s por revisar (%s)";
$UnansweredXYZ = "%s sin responder (%s)";
$AnsweredXYZ = "%s respondidas (%s)+(%s)";
@ -1468,17 +1490,4 @@ $DataTableSearch = "Buscar";
$HideColumn = "Ocultar columna";
$DisplayColumn = "Mostrar columna";
$LegalAgreementAccepted = "Condiciones legales aceptadas";
$ManageUserGroup = "Administrar clases";
$EditUserGroupToURL = "Editar clases de una URL";
$UserGroupListInPlatform = "Lista de clases en la plataforma.";
$UserGroupListIn = "Clases de ";
$AddUserGroupToURL = "Agregar clases a una URL";
$UserGroupList = "Lista de clases";
$FirstLetter = "Primer letra";
$AddUserGroupToThatURL = "Agregar clases a una URL";
$AddingStudentsFromSessionXToSessionY = "Adding students from session <b>%s</b> to session <b>%s </b>";
$EnrollTrainersFromExistingSessions = "Enroll trainers from existing sessions";
$EnrollStudentsFromExistingSessions = "Enroll students from existing sessions";
$CoachesSubscribedAsATeacherInCourseX = "Coaches will be subcribed as a teacher in the course %s";
?>

@ -2,6 +2,7 @@
/*
for more information: see languages.txt in the lang folder.
*/
$FolderDoesntExistsInFileSystem = "La carpeta destino no existe en el servidor";
$HandedOutDate = "Fecha de recepción";
$HandedOut = "Entregado";
$HandOutDateLimit = "Fecha límite de entrega";

Loading…
Cancel
Save