- {{ 'User has participate dans de platforme %s the contrat date %s certificate date %s' | trans | format(_s.site_name, certificate_generated_date_no_time, terms_validation_date_no_time, time_in_platform_in_hours)}}
-
-
-
{{ 'This preparation corresponds to a volume of approximately %s training hours.' | trans | format(time_spent_in_lps_in_hours)}}
-
{{ 'The following contents have been validated' | trans }}:
- {% if sessions %}
-
- {% for session in sessions %}
-
{{ session.session_name }}
- {% endfor %}
-
- {% endif %}
-
{{ complete_name }}
-
{{ 'Obtained the following skills' | trans }}:
- {% if skills %}
-
- {% for skill in skills %}
-
{{ skill.title }}
- {% endfor %}
-
- {% endif %}
-
-
Berlin/Paris, {{ 'The' | trans }} {{ certificate_generated_date_no_time }}
- {{ 'The platform team' | trans }}
-
+
+
+
+
+
+
+
+
+ {{ complete_name }}
+
+
+ {{ 'User has participate dans de platforme %s the contrat date %s certificate date %s' | trans | format(_s.site_name, certificate_generated_date_no_time, terms_validation_date_no_time, time_in_platform_in_hours)}}
+
+
+
{{ 'This preparation corresponds to a volume of approximately %s training hours.' | trans | format(time_spent_in_lps_in_hours)}}
+
{{ 'The following contents have been validated' | trans }}:
+ {% if sessions %}
+
+ {% for session in sessions %}
+
{{ session.session_name }}
+ {% endfor %}
+
+ {% endif %}
+
{{ complete_name }}
+
{{ 'Obtained the following skills' | trans }}:
+ {% if skills %}
+
+ {% for skill in skills %}
+
{{ skill.title }}
+ {% endfor %}
+
+ {% endif %}
+
+
Berlin/Paris, {{ 'The' | trans }} {{ certificate_generated_date_no_time }}
+ {{ 'The platform team' | trans }}
'
.sprintf(
- get_lang('Update successfulByX'),
+ get_lang('Updated by %s'),
$message['user_info']['complete_name_with_message_link']
);
From 0692310dc4fb328777f6958666069aa2ee96ac93 Mon Sep 17 00:00:00 2001
From: NicoDucou
Date: Sat, 27 Apr 2024 13:04:54 +0200
Subject: [PATCH 069/413] Language: Exercise: Add variable and translation for
Oral question recording help - refs BT#21578
---
translations/messages.de.po | 6 ++++++
translations/messages.fr.po | 6 ++++++
translations/messages.pot | 6 ++++++
3 files changed, 18 insertions(+)
diff --git a/translations/messages.de.po b/translations/messages.de.po
index 96a518663aa..a7f239ad491 100644
--- a/translations/messages.de.po
+++ b/translations/messages.de.po
@@ -25112,3 +25112,9 @@ msgstr "Kontakt"
msgid "Send"
msgstr "Senden"
+
+msgid "Recording help"
+msgstr "Hilfe Aufnahme"
+
+msgid "While recording, you can pause whenever you want. If you are not satisfied, register again. This will overwrite the previous version. Satisfied ? To send the recording to your teacher, click on “Stop recording” then select “End exercise”. The teacher will be able to listen to your recording and give you feedback! All your transmitted recordings can be viewed on the exercise home page."
+msgstr "Während der Aufnahme können Sie jederzeit pausieren. Wenn Sie nicht zufrieden sind, nehmen Sie erneut auf. Dadurch wird die vorherige Version überschrieben. Befriedigt ? Um die Aufzeichnung an Ihren Lehrer zu senden, klicken Sie auf „Aufzeichnung beenden“ und wählen Sie dann „Übung beenden“. Der Lehrer kann sich Ihre Aufnahme anhören und Ihnen Feedback geben! Alle von Ihnen übermittelten Aufzeichnungen können Sie auf der Übungshomepage einsehen."
diff --git a/translations/messages.fr.po b/translations/messages.fr.po
index e11fb3fb9e0..865febc2e40 100644
--- a/translations/messages.fr.po
+++ b/translations/messages.fr.po
@@ -29189,3 +29189,9 @@ msgstr ""
msgid "Receiver profile picture"
msgstr "Photo de profil du destinataire"
+
+msgid "Recording help"
+msgstr "Aide enregistrement"
+
+msgid "While recording, you can pause whenever you want. If you are not satisfied, register again. This will overwrite the previous version. Satisfied ? To send the recording to your teacher, click on “Stop recording” then select “End exercise”. The teacher will be able to listen to your recording and give you feedback! All your transmitted recordings can be viewed on the exercise home page."
+msgstr "Pendant l'enregistrement, vous pouvez faire une pause quand vous le souhaitez. Si vous n'êtes pas satisfait, enregistrez-vous à nouveau. Cela écrasera la version précédente. Satisfait ? Pour envoyer l'enregistrement à votre professeur, cliquez sur « Arrêter l'enregistrement » puis sélectionnez « Fin de l'exercice ». Le professeur pourra écouter votre enregistrement et vous donner son feedback ! Tous vos enregistrements transmis peuvent être consultés sur la page d'accueil de l'exercice."
diff --git a/translations/messages.pot b/translations/messages.pot
index 396832781a3..138b5908e25 100644
--- a/translations/messages.pot
+++ b/translations/messages.pot
@@ -27488,3 +27488,9 @@ msgstr ""
msgid "Save diagnosis changes"
msgstr ""
+
+msgid "Recording help"
+msgstr ""
+
+msgid "While recording, you can pause whenever you want. If you are not satisfied, register again. This will overwrite the previous version. Satisfied ? To send the recording to your teacher, click on “Stop recording” then select “End exercise”. The teacher will be able to listen to your recording and give you feedback! All your transmitted recordings can be viewed on the exercise home page."
+msgstr ""
From 61b6c0ccc0bbb445342705f8f76b771013dad835 Mon Sep 17 00:00:00 2001
From: NicoDucou
Date: Sat, 27 Apr 2024 13:06:54 +0200
Subject: [PATCH 070/413] Language: Exercise: Add variable and translation for
Oral question recording help add missing EN translation- refs BT#21578
---
translations/messages.en.po | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/translations/messages.en.po b/translations/messages.en.po
index 53a248aad5d..4db933fce17 100644
--- a/translations/messages.en.po
+++ b/translations/messages.en.po
@@ -27495,3 +27495,9 @@ msgstr "Show diagnosis"
msgid "Save diagnosis changes"
msgstr "Save diagnosis changes"
+
+msgid "Recording help"
+msgstr "Recording help"
+
+msgid "While recording, you can pause whenever you want. If you are not satisfied, register again. This will overwrite the previous version. Satisfied ? To send the recording to your teacher, click on “Stop recording” then select “End exercise”. The teacher will be able to listen to your recording and give you feedback! All your transmitted recordings can be viewed on the exercise home page."
+msgstr "While recording, you can pause whenever you want. If you are not satisfied, register again. This will overwrite the previous version. Satisfied ? To send the recording to your teacher, click on “Stop recording” then select “End exercise”. The teacher will be able to listen to your recording and give you feedback! All your transmitted recordings can be viewed on the exercise home page."
From 17e8c70ad22dec8c36be126adced92e412006ec3 Mon Sep 17 00:00:00 2001
From: NicoDucou
Date: Sat, 27 Apr 2024 13:24:10 +0200
Subject: [PATCH 071/413] Certificate: Gradebook: Languages: fix date order and
translation variable in english - refs BT#21007
---
.../template/default/gradebook/custom_certificate.html.twig | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/public/main/template/default/gradebook/custom_certificate.html.twig b/public/main/template/default/gradebook/custom_certificate.html.twig
index f20f00e5803..79f5c8956c3 100644
--- a/public/main/template/default/gradebook/custom_certificate.html.twig
+++ b/public/main/template/default/gradebook/custom_certificate.html.twig
@@ -48,7 +48,7 @@
{{ complete_name }}
- {{ 'User has participate dans de platforme %s the contrat date %s certificate date %s' | trans | format(_s.site_name, certificate_generated_date_no_time, terms_validation_date_no_time, time_in_platform_in_hours)}}
+ {{ 'User has participate at a training session on the platforme %s from %s until %s' | trans | format(_s.site_name, terms_validation_date_no_time, certificate_generated_date_no_time, time_in_platform_in_hours)}}
{{ 'This preparation corresponds to a volume of approximately %s training hours.' | trans | format(time_spent_in_lps_in_hours)}}
From e4125dee98e28856408ee5ba77d1ad877515a3dc Mon Sep 17 00:00:00 2001
From: NicoDucou
Date: Sat, 27 Apr 2024 13:48:05 +0200
Subject: [PATCH 072/413] Certificate: Gradebook: Languages: add general
certificate language variable and translation in FR, DE, EN
---
translations/messages.de.po | 18 ++++++++++++++++++
translations/messages.en.po | 18 ++++++++++++++++++
translations/messages.fr.po | 18 ++++++++++++++++++
translations/messages.pot | 18 ++++++++++++++++++
4 files changed, 72 insertions(+)
diff --git a/translations/messages.de.po b/translations/messages.de.po
index a7f239ad491..7be0d03ba74 100644
--- a/translations/messages.de.po
+++ b/translations/messages.de.po
@@ -25118,3 +25118,21 @@ msgstr "Hilfe Aufnahme"
msgid "While recording, you can pause whenever you want. If you are not satisfied, register again. This will overwrite the previous version. Satisfied ? To send the recording to your teacher, click on “Stop recording” then select “End exercise”. The teacher will be able to listen to your recording and give you feedback! All your transmitted recordings can be viewed on the exercise home page."
msgstr "Während der Aufnahme können Sie jederzeit pausieren. Wenn Sie nicht zufrieden sind, nehmen Sie erneut auf. Dadurch wird die vorherige Version überschrieben. Befriedigt ? Um die Aufzeichnung an Ihren Lehrer zu senden, klicken Sie auf „Aufzeichnung beenden“ und wählen Sie dann „Übung beenden“. Der Lehrer kann sich Ihre Aufnahme anhören und Ihnen Feedback geben! Alle von Ihnen übermittelten Aufzeichnungen können Sie auf der Übungshomepage einsehen."
+
+msgid "Certificate of participation"
+msgstr "Teilnahmebestätigung"
+
+msgid "User has participate at a training session on the platforme %s from %s until %s"
+msgstr "hat vom %s bis zum %s an einer Online-Fortbildung auf der PARKUR-Plattform des Deutsch-Französischen Jugendwerk teilgenommen."
+
+msgid "This preparation corresponds to a volume of approximately %s training hours."
+msgstr "Diese Vorbereitung entspricht einem Zeitumfang von %s Stunden."
+
+msgid "The following contents have been validated"
+msgstr "Folgende Inhalte wurden behandelt"
+
+msgid "Obtained the following skills"
+msgstr "hat folgende Kompetenzen erworben"
+
+msgid "Certificate Footer"
+msgstr ""
diff --git a/translations/messages.en.po b/translations/messages.en.po
index 4db933fce17..6fff3807f02 100644
--- a/translations/messages.en.po
+++ b/translations/messages.en.po
@@ -27501,3 +27501,21 @@ msgstr "Recording help"
msgid "While recording, you can pause whenever you want. If you are not satisfied, register again. This will overwrite the previous version. Satisfied ? To send the recording to your teacher, click on “Stop recording” then select “End exercise”. The teacher will be able to listen to your recording and give you feedback! All your transmitted recordings can be viewed on the exercise home page."
msgstr "While recording, you can pause whenever you want. If you are not satisfied, register again. This will overwrite the previous version. Satisfied ? To send the recording to your teacher, click on “Stop recording” then select “End exercise”. The teacher will be able to listen to your recording and give you feedback! All your transmitted recordings can be viewed on the exercise home page."
+
+msgid "Certificate of participation"
+msgstr "Certificate of participation"
+
+msgid "User has participate at a training session on the platforme %s from %s until %s"
+msgstr "User has participate at a training session on the platforme %s from %s until %s"
+
+msgid "This preparation corresponds to a volume of approximately %s training hours."
+msgstr "This preparation corresponds to a volume of approximately %s training hours."
+
+msgid "The following contents have been validated"
+msgstr "The following contents have been validated"
+
+msgid "Obtained the following skills"
+msgstr "Obtained the following skills"
+
+msgid "Certificate Footer"
+msgstr ""
diff --git a/translations/messages.fr.po b/translations/messages.fr.po
index 865febc2e40..290a7fad4b6 100644
--- a/translations/messages.fr.po
+++ b/translations/messages.fr.po
@@ -29195,3 +29195,21 @@ msgstr "Aide enregistrement"
msgid "While recording, you can pause whenever you want. If you are not satisfied, register again. This will overwrite the previous version. Satisfied ? To send the recording to your teacher, click on “Stop recording” then select “End exercise”. The teacher will be able to listen to your recording and give you feedback! All your transmitted recordings can be viewed on the exercise home page."
msgstr "Pendant l'enregistrement, vous pouvez faire une pause quand vous le souhaitez. Si vous n'êtes pas satisfait, enregistrez-vous à nouveau. Cela écrasera la version précédente. Satisfait ? Pour envoyer l'enregistrement à votre professeur, cliquez sur « Arrêter l'enregistrement » puis sélectionnez « Fin de l'exercice ». Le professeur pourra écouter votre enregistrement et vous donner son feedback ! Tous vos enregistrements transmis peuvent être consultés sur la page d'accueil de l'exercice."
+
+msgid "Certificate of participation"
+msgstr "Attestation de participation"
+
+msgid "User has participate at a training session on the platforme %s from %s until %s"
+msgstr "a participé à une formation en ligne sur la plateforme %s. Du %s au %s."
+
+msgid "This preparation corresponds to a volume of approximately %s training hours."
+msgstr "Cette préparation correspond à un volume d'environ %s heures de formation."
+
+msgid "The following contents have been validated"
+msgstr "Les contenus suivants ont été validés "
+
+msgid "Obtained the following skills"
+msgstr "a obtenu les compétences suivantes "
+
+msgid "Certificate Footer"
+msgstr ""
diff --git a/translations/messages.pot b/translations/messages.pot
index 138b5908e25..3009eebcc38 100644
--- a/translations/messages.pot
+++ b/translations/messages.pot
@@ -27494,3 +27494,21 @@ msgstr ""
msgid "While recording, you can pause whenever you want. If you are not satisfied, register again. This will overwrite the previous version. Satisfied ? To send the recording to your teacher, click on “Stop recording” then select “End exercise”. The teacher will be able to listen to your recording and give you feedback! All your transmitted recordings can be viewed on the exercise home page."
msgstr ""
+
+msgid "Certificate of participation"
+msgstr ""
+
+msgid "User has participate at a training session on the platforme %s from %s until %s"
+msgstr ""
+
+msgid "This preparation corresponds to a volume of approximately %s training hours."
+msgstr ""
+
+msgid "The following contents have been validated"
+msgstr ""
+
+msgid "Obtained the following skills"
+msgstr ""
+
+msgid "Certificate Footer"
+msgstr ""
From 8ae4249efa08cefe5affccbc7650dd7555024baa Mon Sep 17 00:00:00 2001
From: NicoDucou
Date: Sat, 27 Apr 2024 15:10:07 +0200
Subject: [PATCH 073/413] Language: Adding variable for date picker
---
translations/messages.pot | 3 +++
1 file changed, 3 insertions(+)
diff --git a/translations/messages.pot b/translations/messages.pot
index 3009eebcc38..507176b543b 100644
--- a/translations/messages.pot
+++ b/translations/messages.pot
@@ -27512,3 +27512,6 @@ msgstr ""
msgid "Certificate Footer"
msgstr ""
+
+msgid "Select date .."
+msgstr ""
From 3cc08e4434dcfcabe138da5f4b25d4dbea8c7a77 Mon Sep 17 00:00:00 2001
From: christianbeeznst
Date: Sat, 27 Apr 2024 09:36:07 -0500
Subject: [PATCH 074/413] Internal: Add cidReq to validate course access in Lp
- refs BT#21540
---
public/main/exercise/result.php | 6 +++++-
public/main/inc/lib/api.lib.php | 3 +++
public/main/lp/learnpathItem.class.php | 2 +-
3 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/public/main/exercise/result.php b/public/main/exercise/result.php
index 785d5f96fa6..8739576cc06 100644
--- a/public/main/exercise/result.php
+++ b/public/main/exercise/result.php
@@ -23,7 +23,11 @@
$show_headers = false;
}
-api_protect_course_script($show_headers);
+$cid = isset($_REQUEST['cid']) ? (int) $_REQUEST['cid'] : null;
+$sid = isset($_REQUEST['sid']) ? (int) $_REQUEST['sid'] : null;
+
+// A notice for unauthorized people.
+api_protect_course_script($show_headers, false, '', $cid);
if (empty($id)) {
api_not_allowed($show_headers);
diff --git a/public/main/inc/lib/api.lib.php b/public/main/inc/lib/api.lib.php
index 362b8aa95f0..4e78d1debf6 100644
--- a/public/main/inc/lib/api.lib.php
+++ b/public/main/inc/lib/api.lib.php
@@ -2041,6 +2041,9 @@ function api_get_cidreq_params($courseId, $sessionId = 0, $groupId = 0)
function api_get_cidreq($addSessionId = true, $addGroupId = true, $origin = '')
{
$courseId = api_get_course_int_id();
+ if (0 === $courseId && isset($_REQUEST['cid'])) {
+ $courseId = (int) $_REQUEST['cid'];
+ }
$url = empty($courseId) ? '' : 'cid='.$courseId;
$origin = empty($origin) ? api_get_origin() : Security::remove_XSS($origin);
diff --git a/public/main/lp/learnpathItem.class.php b/public/main/lp/learnpathItem.class.php
index 349988dd4e8..fd6ecd53b88 100644
--- a/public/main/lp/learnpathItem.class.php
+++ b/public/main/lp/learnpathItem.class.php
@@ -3696,7 +3696,7 @@ public function write_to_db()
WHERE exe_id = $exeId";
$res = Database::query($sql);
$exeRow = Database::fetch_array($res);
- $duration = $exeRow['exe_duration'];
+ $duration = isset($exeRow['exe_duration']) ? (int) $exeRow['exe_duration'] : 0;
$total_time = " total_time = ".$duration.", ";
if ($debug) {
error_log("quiz: $total_time");
From 111ec63d0d41a5dab82bb85655d7a57672d83e57 Mon Sep 17 00:00:00 2001
From: Angel Fernando Quiroz Campos
Date: Sat, 27 Apr 2024 10:30:18 -0500
Subject: [PATCH 075/413] Display: Improve legacy panel collapsible - refs
BT#21559
---
public/main/inc/lib/display.lib.php | 13 ++++++-------
1 file changed, 6 insertions(+), 7 deletions(-)
diff --git a/public/main/inc/lib/display.lib.php b/public/main/inc/lib/display.lib.php
index f7aef668073..2e06181fd87 100644
--- a/public/main/inc/lib/display.lib.php
+++ b/public/main/inc/lib/display.lib.php
@@ -2445,9 +2445,9 @@ public static function panelCollapse(
button.addEventListener("click", function() {
menus.forEach((menu, menuIndex) => {
if (index === menuIndex) {
- button.setAttribute("aria-expanded", "true" === button.getAttribute("aria-expanded") ? "true" : "false")
- button.parentNode.querySelector(".mdi").classList.toggle("mdi-chevron-down")
- button.parentNode.querySelector(".mdi").classList.toggle("mdi-chevron-up")
+ button.setAttribute("aria-expanded", "true" === button.getAttribute("aria-expanded") ? "false" : "true")
+ button.classList.toggle("mdi-chevron-down")
+ button.classList.toggle("mdi-chevron-up")
menu.classList.toggle("active");
} else {
menu.classList.remove("active");
@@ -2459,11 +2459,10 @@ public static function panelCollapse(
';
$html = '
- {{ 'Certificate of participation' | trans }}
+ {{ 'Certificate of participation' | trans | raw }}
@@ -48,11 +48,11 @@
{{ complete_name }}
- {{ 'User has participate at a training session on the platforme %s from %s until %s' | trans | format(_s.site_name, terms_validation_date_no_time, certificate_generated_date_no_time, time_in_platform_in_hours)}}
+ {{ 'User has participate at a training session on the platforme %s from %s until %s' | trans | format(_s.site_name, terms_validation_date_no_time, certificate_generated_date_no_time, time_in_platform_in_hours) | raw }}
-
{{ 'This preparation corresponds to a volume of approximately %s training hours.' | trans | format(time_spent_in_lps_in_hours)}}
-
{{ 'The following contents have been validated' | trans }}:
+
{{ 'This preparation corresponds to a volume of approximately %s training hours.' | trans | format(time_spent_in_lps_in_hours) | raw }}
+
{{ 'The following contents have been validated' | trans | raw }}:
{% if sessions %}
{% for session in sessions %}
@@ -61,7 +61,7 @@
{% endif %}
{{ complete_name }}
-
{{ 'Obtained the following skills' | trans }}:
+
{{ 'Obtained the following skills' | trans | raw }}:
{% if skills %}
{% for skill in skills %}
@@ -71,7 +71,7 @@
{% endif %}
Berlin/Paris, {{ 'The' | trans }} {{ certificate_generated_date_no_time }}
- {{ 'The platform team' | trans }}
+ {{ 'The platform team' | trans | raw }}
@@ -88,7 +88,7 @@
- {{ 'Certificate Footer' | trans }}
+ {{ 'Certificate Footer' | trans | raw }}
From 95ca70279cf10cd8febd4440608f4f96a8909b38 Mon Sep 17 00:00:00 2001
From: Yannick Warnier
Date: Fri, 3 May 2024 08:26:40 +0200
Subject: [PATCH 132/413] Language: Update language terms
---
translations/messages.es.po | 116 +++++++++++++++++++++++++++++++++++-
1 file changed, 115 insertions(+), 1 deletion(-)
diff --git a/translations/messages.es.po b/translations/messages.es.po
index 3ad22dc5040..80b2b93b3af 100644
--- a/translations/messages.es.po
+++ b/translations/messages.es.po
@@ -1,7 +1,7 @@
msgid ""
msgstr ""
"Project-Id-Version: chamilo\n"
-"PO-Revision-Date: 2024-05-02 12:16+0000\n"
+"PO-Revision-Date: 2024-05-03 06:23+0000\n"
"Last-Translator: Yannick Warnier \n"
"Language-Team: Spanish \n"
@@ -25654,3 +25654,117 @@ msgid "When on screens where the left menu is visible, do not display the « Co
msgstr ""
"Cuando esté en pantallas donde el menú izquierdo es visible, no mostrar la "
"sección «Cursos»."
+
+msgid "When using resources sequencing with courses or sessions, show the dependencies of the course on the course’s homepage."
+msgstr ""
+"Al utilizar la secuenciación de recursos con cursos o sesiones, mostrar las "
+"dependencias del curso en la página de inicio del curso."
+
+msgid "Add a message box in the course creation page for teachers, asking them to donate to the project."
+msgstr ""
+"Añade un cuadro de mensaje en la página de creación de cursos para los "
+"profesores, pidiéndoles que donen al proyecto."
+
+msgid "On the courses/sessions page, the session title can be either of the following : 0 = no link (hide session title) ; 1 = link title to a special session page ; 2 = link to the course if there is only one course ; 3 = session title makes the courses list foldable ; 4 = no link (show session title)."
+msgstr ""
+"En la página de cursos/sesiones, el título de la sesión puede ser uno de los "
+"siguientes: 0 = sin enlace (ocultar título de la sesión); 1 = enlazar el "
+"título a una página especial de la sesión; 2 = enlazar al curso si solo hay "
+"un curso; 3 = el título de la sesión hace que la lista de cursos sea "
+"plegable; 4 = sin enlace (mostrar título de la sesión)."
+
+msgid "When creating a course, make the course category a required setting."
+msgstr ""
+"Al crear un curso, haga que la categoría del curso sea una configuración "
+"obligatoria."
+
+msgid "Hide course catalogue’s public link"
+msgstr "Ocultar enlace público del catálogo de cursos"
+
+msgid "Course catalogue settings"
+msgstr "Configuración del catálogo de cursos"
+
+msgid "Donation link on course creation page"
+msgstr "Enlace de donación en la página de creación de curso"
+
+msgid "Course student info display"
+msgstr "Presentación de información del alumno del curso"
+
+msgid "Remove course code field from course creation form"
+msgstr ""
+"Eliminar el campo de código del curso del formulario de creación de cursos"
+
+msgid "Hide course teacher info on course details page"
+msgstr ""
+"Ocultar información del profesor del curso en la página de detalles del curso"
+
+msgid "This array gives you the possibility to configure which columns to hide in the main course stats page and in the total time report."
+msgstr ""
+"Esta matriz le permite configurar qué columnas ocultar en la página "
+"principal de estadísticas del curso y en el informe de tiempo total."
+
+msgid "On the course details page, hide the teacher information."
+msgstr "En la página de detalles del curso, oculta la información del profesor."
+
+msgid "Display course catalogue on homepage"
+msgstr "Mostrar catálogo de cursos en la página de inicio"
+
+msgid "Remove the possibility for non-admins to change the course visibility. Visibility can be an issue when there are too many teachers to control directly. Forcing visibilities allows the organization to better manage courses catalogues."
+msgstr ""
+"Elimine la posibilidad de que los no administradores cambien la visibilidad "
+"del curso. La visibilidad puede ser un problema cuando hay demasiados "
+"profesores que requieran mayor supervisión. Forzar las visibilidades permite "
+"a la organización gestionar mejor los catálogos de cursos."
+
+msgid "The page the donation message should link to (full URL)."
+msgstr "La página a la que debe enlazar el mensaje de donación (URL completa)."
+
+msgid "User extra fields by default in course stats page"
+msgstr ""
+"Campos de perfil de usuario por defecto en la página de estadísticas del "
+"curso"
+
+msgid "Set course category mandatory"
+msgstr "Establecer la categoría del curso como obligatoria"
+
+msgid "Hides the link to the course catalogue in the menu when the catalogue is public."
+msgstr ""
+"Ocultar el enlace al catálogo de cursos en el menú cuando el catálogo es "
+"público."
+
+msgid "Type of link for the session title"
+msgstr "Tipo de enlace para el título de la sesión"
+
+msgid "On the ‘My courses’/’My sessions’ pages, show additional information regarding the score, progress and/or certificate acquisition by the student."
+msgstr ""
+"En las páginas de 'Mis cursos'/'Mis sesiones' del alumno, mostrar "
+"información adicional sobre la puntuación, el progreso y/o la adquisición de "
+"certificados por parte suya."
+
+msgid "Course visibility changes for admins only"
+msgstr "Cambios de visibilidad del curso solo disponibles para administradores"
+
+msgid "Hide columns from course logs"
+msgstr "Ocultar columnas del seguimiento del curso"
+
+msgid "The course rating feature comes by default in different places. If you don’t want it, enable this option."
+msgstr ""
+"La función de calificación del curso viene por defecto en diferentes "
+"lugares. Si no la desea, active esta opción."
+
+msgid "Hide course rating"
+msgstr "Ocultar calificación de cursos"
+
+msgid "Show dependencies in course intro"
+msgstr "Mostrar dependencias en la introducción del curso"
+
+msgid "This array gives you the possibility to configure many aspects of the course catalogue."
+msgstr ""
+"Este arreglo le ofrece la posibilidad de configurar muchos aspectos del "
+"catálogo de cursos."
+
+msgid "If not provided, the course code is generated by default based on the course title, so enable this option to remove the code field from the course creation form altogether."
+msgstr ""
+"Si no se proporciona, el código del curso se genera automáticamente en base "
+"al título del curso, así que active esta opción para eliminar por completo "
+"el campo de código del formulario de creación de cursos."
From 18fe2b0d1054280e041c3d98788ed4232206a02b Mon Sep 17 00:00:00 2001
From: Angel Fernando Quiroz Campos
Date: Fri, 3 May 2024 02:55:40 -0500
Subject: [PATCH 133/413] Display: Fix styles for the tool icon in course home
- refs BT#21560
---
assets/css/scss/molecules/_course_tool.scss | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/assets/css/scss/molecules/_course_tool.scss b/assets/css/scss/molecules/_course_tool.scss
index 0a711439ad6..2c6f48d7ca3 100644
--- a/assets/css/scss/molecules/_course_tool.scss
+++ b/assets/css/scss/molecules/_course_tool.scss
@@ -11,7 +11,9 @@
}
&__icon {
- @apply text-transparent bg-clip-text bg-gradient-to-br from-primary to-primary-gradient text-header;
+ @apply text-transparent bg-clip-text bg-gradient-to-br from-primary to-primary-gradient leading-none;
+
+ font-size: 52px;
&::before {
}
From a4a8bfb642e2f05c25aeb9276164ab60ba049f8f Mon Sep 17 00:00:00 2001
From: Angel Fernando Quiroz Campos
Date: Fri, 3 May 2024 02:56:37 -0500
Subject: [PATCH 134/413] Display: Fix styles for autocomplete component
BT#21615
---
assets/css/scss/atoms/_autocomplete.scss | 127 ++++++++++++++++++
assets/css/scss/atoms/_dropdown.scss | 8 +-
.../basecomponents/BaseAutocomplete.vue | 26 ++--
3 files changed, 143 insertions(+), 18 deletions(-)
diff --git a/assets/css/scss/atoms/_autocomplete.scss b/assets/css/scss/atoms/_autocomplete.scss
index 55766d6dab0..1d2207489a3 100644
--- a/assets/css/scss/atoms/_autocomplete.scss
+++ b/assets/css/scss/atoms/_autocomplete.scss
@@ -1,3 +1,130 @@
.p-autocomplete {
@apply flex;
+
+ &-loader {
+ @apply absolute top-1/2 -mt-2 right-3;
+ }
+
+ &-dd &-input {
+ @apply flex-auto w-[1%];
+ }
+
+ &-dd &-input,
+ &-dd &-multiple-container {
+ @apply rounded-r-lg;
+ }
+
+ &-dd &-dropdown {
+ @apply rounded-l-lg;
+ }
+
+ & &-panel {
+ @apply min-w-full;
+ }
+
+ &-panel {
+ @apply absolute overflow-auto top-0 left-0 bg-white drop-shadow-lg rounded-lg border-none text-gray-90
+ before:content-[""] before:w-full before:block before:h-3 before:sticky before:bg-white before:z-[2] before:top-0 before:rounded-t-lg before:rounded-b-none
+ after:content-[""] after:w-full after:block after:h-3 after:sticky after:bg-white after:z-[2] after:bottom-0 after:rounded-b-lg after:rounded-t-none;
+
+ .p-autocomplete-items {
+ @apply p-0;
+
+ .p-autocomplete-item {
+ @apply m-0 px-4 py-2 transition text-body-2 outline-0 outline-none text-gray-90 border-none bg-transparent rounded-none;
+
+ &:first-child {
+ @apply mt-0;
+ }
+
+ &:last-child {
+ @apply mb-0;
+ }
+
+ &.p-highlight {
+ @apply bg-support-3 text-primary;
+ }
+
+ &:not(.p-highlight):not(.p-disabled).p-focus {
+ @apply text-primary;
+ }
+
+ &-group {
+ @apply m-0 px-3 py-4 bg-white text-gray-90;
+ }
+ }
+ }
+ }
+
+ &-items {
+ @apply m-0 p-0 list-none;
+ }
+
+ &-item {
+ @apply cursor-pointer whitespace-nowrap relative overflow-hidden;
+ }
+
+ &-multiple-container {
+ @apply m-0 p-3 list-none cursor-text overflow-hidden flex items-center flex-wrap gap-2 outline-transparent;
+
+ .p-autocomplete-input-token {
+ @apply p-0;
+
+ input {
+ @apply p-0 m-0 text-gray-90;
+ }
+ }
+
+ .p-autocomplete-token {
+ @apply px-1.5 py-0 rounded-lg text-gray-90 bg-gray-20;
+
+ .p-autocomplete-token-icon {
+ @apply ml-2;
+ }
+
+ &.p-focus {
+ @apply text-primary;
+ }
+ }
+ }
+
+ &-token {
+ @apply cursor-default inline-flex items-center flex-initial;
+
+ &-icon {
+ @apply cursor-pointer;
+ }
+ }
+
+ &-input-token {
+ @apply flex-1 inline-flex;
+
+ input {
+ @apply border-none outline-none bg-transparent m-0 p-0 shadow-none rounded-none w-full;
+ }
+ }
+
+ &.p-autocomplete-dd {
+ &.p-autocomplete-loader {
+ @apply right-[3.75rem];
+ }
+ }
+
+ &:not(.p-disabled) {
+ &:hover {
+ .p-autocomplete-multiple-container {
+ @apply border-primary;
+ }
+ }
+
+ &.p-focus {
+ .p-autocomplete-multiple-container {
+ @apply outline-none outline-offset-0 border-primary;
+ }
+ }
+ }
+
+ &.p-invalid.p-component > .p-inputtext {
+ @apply border-danger;
+ }
}
diff --git a/assets/css/scss/atoms/_dropdown.scss b/assets/css/scss/atoms/_dropdown.scss
index 990bbff1efd..ea56fba02c3 100644
--- a/assets/css/scss/atoms/_dropdown.scss
+++ b/assets/css/scss/atoms/_dropdown.scss
@@ -3,7 +3,7 @@
border border-support-3 bg-white rounded-lg transition w-full duration-200
hover:border-primary hover:text-gray-90 hover:outline-0 hover:outline-none;
- .p-dropdown-panel, .p-autocomplete-panel, .p-multiselect-panel {
+ .p-dropdown-panel, .p-multiselect-panel {
@apply min-w-full;
}
@@ -31,14 +31,14 @@
@apply overflow-hidden opacity-0;
}
-.p-dropdown-panel, .p-autocomplete-panel, .p-multiselect-panel {
+.p-dropdown-panel, .p-multiselect-panel {
@apply absolute min-w-full top-2 left-0
bg-white rounded-lg text-gray-90 drop-shadow-lg;
.p-dropdown-items {
@apply rounded-lg
- after:content-[""] after:w-full after:block after:h-3 after:sticky after:bg-white after:z-[2] after:bottom-0 after:rounded-b-lg
- before:content-[""] before:w-full before:block before:h-3 before:sticky before:bg-white before:z-[2] before:top-0 before:rounded-b-lg;
+ before:content-[""] before:w-full before:block before:h-3 before:sticky before:bg-white before:z-[2] before:top-0 before:rounded-t-lg before:rounded-b-none
+ after:content-[""] after:w-full after:block after:h-3 after:sticky after:bg-white after:z-[2] after:bottom-0 after:rounded-b-lg after:rounded-t-none;
.p-dropdown-item {
@apply px-4 py-2 transition text-body-2 outline-0 outline-none text-gray-90;
diff --git a/assets/vue/components/basecomponents/BaseAutocomplete.vue b/assets/vue/components/basecomponents/BaseAutocomplete.vue
index 06bd4bb1459..4d6dcfd49d2 100644
--- a/assets/vue/components/basecomponents/BaseAutocomplete.vue
+++ b/assets/vue/components/basecomponents/BaseAutocomplete.vue
@@ -1,8 +1,8 @@
';
}
}
From dc4ca7cb25843801e0d682d107bb47b31fd5f945 Mon Sep 17 00:00:00 2001
From: Angel Fernando Quiroz Campos
Date: Tue, 7 May 2024 09:30:17 -0500
Subject: [PATCH 165/413] Minor: Format code
---
src/CoreBundle/Entity/Skill.php | 4 +-
src/CoreBundle/Filter/SearchOr.php | 18 ++--
src/CoreBundle/Form/ContactType.php | 2 +-
src/CoreBundle/Form/ProfileType.php | 9 +-
.../Schema/V200/Version20201215072918.php | 3 +-
.../Schema/V200/Version20230904173400.php | 3 +-
.../Schema/V200/Version20230913162700.php | 82 +++++++++++--------
.../Schema/V200/Version20231110194300.php | 4 +-
.../Schema/V200/Version20240323181500.php | 2 +-
.../Schema/V200/Version20240425192900.php | 7 +-
.../Schema/V200/Version20240506165900.php | 6 +-
.../Settings/AbstractSettingsSchema.php | 4 +-
src/CourseBundle/Entity/CCalendarEvent.php | 1 -
src/CourseBundle/Entity/CLpItem.php | 4 +-
.../Repository/CCalendarEventRepository.php | 1 -
.../Settings/SettingsCourseManager.php | 7 +-
16 files changed, 84 insertions(+), 73 deletions(-)
diff --git a/src/CoreBundle/Entity/Skill.php b/src/CoreBundle/Entity/Skill.php
index 9c493e51c43..a51060a20f0 100644
--- a/src/CoreBundle/Entity/Skill.php
+++ b/src/CoreBundle/Entity/Skill.php
@@ -9,8 +9,8 @@
use ApiPlatform\Doctrine\Orm\Filter\SearchFilter;
use ApiPlatform\Metadata\ApiFilter;
use ApiPlatform\Metadata\ApiResource;
-use Chamilo\CoreBundle\Repository\SkillRepository;
use Chamilo\CoreBundle\Component\Utils\ChamiloApi;
+use Chamilo\CoreBundle\Repository\SkillRepository;
use DateTime;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
@@ -126,6 +126,7 @@ public function getTitle($translated = true): string
return $translation;
}
}
+
return $this->title;
}
public function getShortCode($translated = true): string
@@ -137,6 +138,7 @@ public function getShortCode($translated = true): string
return $translation;
}
}
+
return $this->shortCode;
}
public function setShortCode(string $shortCode): self
diff --git a/src/CoreBundle/Filter/SearchOr.php b/src/CoreBundle/Filter/SearchOr.php
index 661139d3f59..2112acd34e7 100644
--- a/src/CoreBundle/Filter/SearchOr.php
+++ b/src/CoreBundle/Filter/SearchOr.php
@@ -1,5 +1,7 @@
getRootAliases()[0];
@@ -48,12 +48,10 @@ protected function filterProperty(
$queryBuilder
->andWhere(
$queryBuilder->expr()->orX(...$ors)
- );
+ )
+ ;
}
- /**
- * @inheritDoc
- */
public function getDescription(string $resourceClass): array
{
return [
@@ -65,4 +63,4 @@ public function getDescription(string $resourceClass): array
],
];
}
-}
\ No newline at end of file
+}
diff --git a/src/CoreBundle/Form/ContactType.php b/src/CoreBundle/Form/ContactType.php
index d37c6ab2b34..b0f89de2a44 100644
--- a/src/CoreBundle/Form/ContactType.php
+++ b/src/CoreBundle/Form/ContactType.php
@@ -7,6 +7,7 @@
namespace Chamilo\CoreBundle\Form;
use Chamilo\CoreBundle\Entity\ContactCategory;
+use Gregwar\CaptchaBundle\Type\CaptchaType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
@@ -18,7 +19,6 @@
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Contracts\Translation\TranslatorInterface;
-use Gregwar\CaptchaBundle\Type\CaptchaType;
/**
* @template-extends AbstractType
diff --git a/src/CoreBundle/Form/ProfileType.php b/src/CoreBundle/Form/ProfileType.php
index 72370fd2164..85cbf2054ec 100644
--- a/src/CoreBundle/Form/ProfileType.php
+++ b/src/CoreBundle/Form/ProfileType.php
@@ -28,8 +28,10 @@ class ProfileType extends AbstractType
{
private LanguageRepository $languageRepository;
- public function __construct(LanguageRepository $languageRepository, private readonly SettingsManager $settingsManager)
- {
+ public function __construct(
+ LanguageRepository $languageRepository,
+ private readonly SettingsManager $settingsManager
+ ) {
$this->languageRepository = $languageRepository;
}
@@ -72,7 +74,8 @@ public function buildForm(FormBuilderInterface $builder, array $options): void
if ('true' === $this->settingsManager->getSetting('use_users_timezone')) {
$builder
- ->add('timezone', TimezoneType::class, ['label' => 'Timezone', 'required' => true]);
+ ->add('timezone', TimezoneType::class, ['label' => 'Timezone', 'required' => true])
+ ;
}
$builder
diff --git a/src/CoreBundle/Migrations/Schema/V200/Version20201215072918.php b/src/CoreBundle/Migrations/Schema/V200/Version20201215072918.php
index 63dc7148759..f1803600918 100644
--- a/src/CoreBundle/Migrations/Schema/V200/Version20201215072918.php
+++ b/src/CoreBundle/Migrations/Schema/V200/Version20201215072918.php
@@ -6,7 +6,6 @@
namespace Chamilo\CoreBundle\Migrations\Schema\V200;
-use Chamilo\CoreBundle\Entity\AgendaReminder;
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Migrations\AbstractMigrationChamilo;
use Chamilo\CoreBundle\Repository\Node\CourseRepository;
@@ -151,7 +150,7 @@ private function updateAgendaReminders(array $oldNewEventMap): void
$newEvent = $oldNewEventMap[$oldEventId];
$this->addSql(
sprintf(
- "UPDATE agenda_reminder SET event_id = %d WHERE id = %d",
+ 'UPDATE agenda_reminder SET event_id = %d WHERE id = %d',
$newEvent->getIid(),
$reminder['id']
)
diff --git a/src/CoreBundle/Migrations/Schema/V200/Version20230904173400.php b/src/CoreBundle/Migrations/Schema/V200/Version20230904173400.php
index 054aaed4490..3599c61acaa 100644
--- a/src/CoreBundle/Migrations/Schema/V200/Version20230904173400.php
+++ b/src/CoreBundle/Migrations/Schema/V200/Version20230904173400.php
@@ -6,7 +6,6 @@
namespace Chamilo\CoreBundle\Migrations\Schema\V200;
-use Chamilo\CoreBundle\Entity\AgendaReminder;
use Chamilo\CoreBundle\Entity\User;
use Chamilo\CoreBundle\Migrations\AbstractMigrationChamilo;
use Chamilo\CoreBundle\Repository\Node\UserRepository;
@@ -238,7 +237,7 @@ private function updateAgendaReminders(array $oldNewEventIdMap): void
$newEvent = $oldNewEventIdMap[$oldEventId];
$this->addSql(
sprintf(
- "UPDATE agenda_reminder SET event_id = %d WHERE id = %d",
+ 'UPDATE agenda_reminder SET event_id = %d WHERE id = %d',
$newEvent->getIid(),
$reminder['id']
)
diff --git a/src/CoreBundle/Migrations/Schema/V200/Version20230913162700.php b/src/CoreBundle/Migrations/Schema/V200/Version20230913162700.php
index e63a0897578..8f8f50bee5b 100644
--- a/src/CoreBundle/Migrations/Schema/V200/Version20230913162700.php
+++ b/src/CoreBundle/Migrations/Schema/V200/Version20230913162700.php
@@ -12,6 +12,11 @@
use Chamilo\CourseBundle\Entity\CDocument;
use Chamilo\CourseBundle\Repository\CDocumentRepository;
use Doctrine\DBAL\Schema\Schema;
+use Exception;
+use RecursiveDirectoryIterator;
+use RecursiveIteratorIterator;
+
+use const PHP_URL_PATH;
final class Version20230913162700 extends AbstractMigrationChamilo
{
@@ -65,7 +70,7 @@ private function updateContent($config, $courseDirectory, $courseId, $documentRe
} elseif (isset($config['fields'])) {
$fields = $config['fields'];
} else {
- throw new \Exception('No field or fields specified for updating.');
+ throw new Exception('No field or fields specified for updating.');
}
foreach ($fields as $field) {
@@ -94,11 +99,10 @@ private function replaceOldURLsWithNew($itemDataText, $courseDirectory, $courseI
preg_match_all($specificCoursePattern, $contentText, $matches);
foreach ($matches[2] as $index => $fullUrl) {
-
$videoPath = parse_url($fullUrl, PHP_URL_PATH) ?: $fullUrl;
$actualCourseDirectory = $matches[5][$index];
if ($actualCourseDirectory !== $courseDirectory) {
- $videoPath = preg_replace("/^\/courses\/$actualCourseDirectory\//i", "/courses/$courseDirectory/", $videoPath);
+ $videoPath = preg_replace("/^\\/courses\\/$actualCourseDirectory\\//i", "/courses/$courseDirectory/", $videoPath);
}
$documentPath = str_replace('/courses/'.$courseDirectory.'/document/', '/', $videoPath);
@@ -114,7 +118,7 @@ private function replaceOldURLsWithNew($itemDataText, $courseDirectory, $courseI
if ($document) {
$newUrl = $documentRepo->getResourceFileUrl($document);
if ($newUrl) {
- $replacement = $matches[1][$index] . '="' . $newUrl . '"';
+ $replacement = $matches[1][$index].'="'.$newUrl.'"';
$contentText = str_replace($matches[0][$index], $replacement, $contentText);
}
}
@@ -132,8 +136,8 @@ private function replaceDocumentLinks($documents, $documentRepo, $matches, $inde
if ($documentFile) {
$newUrl = $documentRepo->getResourceFileUrl($documentFile);
if (!empty($newUrl)) {
- $patternForReplacement = '/' . preg_quote($matches[0][$index], '/') . '/';
- $replacement = $matches[1][$index] . '="' . $newUrl . '"';
+ $patternForReplacement = '/'.preg_quote($matches[0][$index], '/').'/';
+ $replacement = $matches[1][$index].'="'.$newUrl.'"';
$contentText = preg_replace($patternForReplacement, $replacement, $contentText, 1);
}
}
@@ -146,17 +150,17 @@ private function createNewDocument($videoPath, $courseId)
$documentRepo = $this->container->get(CDocumentRepository::class);
$kernel = $this->container->get('kernel');
$rootPath = $kernel->getProjectDir();
- $appCourseOldPath = $rootPath . '/app' . $videoPath;
+ $appCourseOldPath = $rootPath.'/app'.$videoPath;
$title = basename($appCourseOldPath);
$courseRepo = $this->container->get(CourseRepository::class);
$course = $courseRepo->find($courseId);
if (!$course) {
- throw new \Exception("Course with ID $courseId not found.");
+ throw new Exception("Course with ID $courseId not found.");
}
$document = $documentRepo->findCourseResourceByTitle($title, $course->getResourceNode(), $course);
- if ($document !== null) {
+ if (null !== $document) {
return $document;
}
@@ -168,49 +172,55 @@ private function createNewDocument($videoPath, $courseId)
->setReadonly(false)
->setCreator($this->getAdmin())
->setParent($course)
- ->addCourseLink($course);
+ ->addCourseLink($course)
+ ;
$this->entityManager->persist($document);
$this->entityManager->flush();
$documentRepo->addFileFromPath($document, $title, $appCourseOldPath);
+
return $document;
- } else {
- $generalCoursesPath = $rootPath . '/app/courses/';
- $foundPath = $this->recursiveFileSearch($generalCoursesPath, $title);
- if ($foundPath) {
- $document = new CDocument();
- $document->setFiletype('file')
- ->setTitle($title)
- ->setComment(null)
- ->setReadonly(false)
- ->setCreator($this->getAdmin())
- ->setParent($course)
- ->addCourseLink($course);
-
- $this->entityManager->persist($document);
- $this->entityManager->flush();
-
- $documentRepo->addFileFromPath($document, $title, $foundPath);
- error_log("File found in new location: " . $foundPath);
- return $document;
- } else {
- throw new \Exception("File not found in any location.");
- }
}
- } catch (\Exception $e) {
- error_log('Migration error: ' . $e->getMessage());
+ $generalCoursesPath = $rootPath.'/app/courses/';
+ $foundPath = $this->recursiveFileSearch($generalCoursesPath, $title);
+ if ($foundPath) {
+ $document = new CDocument();
+ $document->setFiletype('file')
+ ->setTitle($title)
+ ->setComment(null)
+ ->setReadonly(false)
+ ->setCreator($this->getAdmin())
+ ->setParent($course)
+ ->addCourseLink($course)
+ ;
+
+ $this->entityManager->persist($document);
+ $this->entityManager->flush();
+
+ $documentRepo->addFileFromPath($document, $title, $foundPath);
+ error_log('File found in new location: '.$foundPath);
+
+ return $document;
+ }
+
+ throw new Exception('File not found in any location.');
+ } catch (Exception $e) {
+ error_log('Migration error: '.$e->getMessage());
+
return null;
}
}
- private function recursiveFileSearch($directory, $title) {
- $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($directory));
+ private function recursiveFileSearch($directory, $title)
+ {
+ $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory));
foreach ($iterator as $file) {
if ($file->isFile() && $file->getFilename() === $title) {
return $file->getRealPath();
}
}
+
return null;
}
}
diff --git a/src/CoreBundle/Migrations/Schema/V200/Version20231110194300.php b/src/CoreBundle/Migrations/Schema/V200/Version20231110194300.php
index 44a5446e406..05eb7e3f8df 100644
--- a/src/CoreBundle/Migrations/Schema/V200/Version20231110194300.php
+++ b/src/CoreBundle/Migrations/Schema/V200/Version20231110194300.php
@@ -111,13 +111,13 @@ private function updateWebpackConfig(string $rootPath, array $newThemes): void
}
$content = file_get_contents($webpackConfigPath);
- $pattern = "/(const themes = \[\s*\")([^\"\]]+)(\"\s*\])/";
+ $pattern = '/(const themes = \\[\\s*")([^"\\]]+)("\\s*\\])/';
$replacement = function ($matches) use ($newThemes) {
$existingThemes = explode('", "', trim($matches[2], '"'));
$allThemes = array_unique(array_merge($existingThemes, $newThemes));
$newThemesString = implode('", "', $allThemes);
- return $matches[1] . $newThemesString . $matches[3];
+ return $matches[1].$newThemesString.$matches[3];
};
$newContent = preg_replace_callback($pattern, $replacement, $content);
diff --git a/src/CoreBundle/Migrations/Schema/V200/Version20240323181500.php b/src/CoreBundle/Migrations/Schema/V200/Version20240323181500.php
index cda25c8925e..520f6d95be2 100644
--- a/src/CoreBundle/Migrations/Schema/V200/Version20240323181500.php
+++ b/src/CoreBundle/Migrations/Schema/V200/Version20240323181500.php
@@ -118,7 +118,7 @@ private function updateAgendaReminders(array $oldNewEventIdMap): void
$newEvent = $oldNewEventIdMap[$oldEventId];
$this->addSql(
sprintf(
- "UPDATE agenda_reminder SET event_id = %d WHERE id = %d",
+ 'UPDATE agenda_reminder SET event_id = %d WHERE id = %d',
$newEvent->getIid(),
$reminder['id']
)
diff --git a/src/CoreBundle/Migrations/Schema/V200/Version20240425192900.php b/src/CoreBundle/Migrations/Schema/V200/Version20240425192900.php
index e21e641b0a1..f744af0d7b8 100644
--- a/src/CoreBundle/Migrations/Schema/V200/Version20240425192900.php
+++ b/src/CoreBundle/Migrations/Schema/V200/Version20240425192900.php
@@ -1,5 +1,7 @@
hasTable('agenda_reminder')) {
@@ -31,4 +30,4 @@ public function up(Schema $schema): void
$this->addSql('ALTER TABLE agenda_reminder ADD CONSTRAINT FK_416FFA2471F7E88B FOREIGN KEY (event_id) REFERENCES c_calendar_event (iid)');
$this->addSql('CREATE INDEX IDX_416FFA2471F7E88B ON agenda_reminder (event_id)');
}
-}
\ No newline at end of file
+}
diff --git a/src/CoreBundle/Migrations/Schema/V200/Version20240506165900.php b/src/CoreBundle/Migrations/Schema/V200/Version20240506165900.php
index c07617db0fe..d6554ebbe65 100644
--- a/src/CoreBundle/Migrations/Schema/V200/Version20240506165900.php
+++ b/src/CoreBundle/Migrations/Schema/V200/Version20240506165900.php
@@ -11,6 +11,8 @@
use Chamilo\CoreBundle\Repository\Node\UserRepository;
use Doctrine\DBAL\Schema\Schema;
+use const PREG_SET_ORDER;
+
final class Version20240506165900 extends AbstractMigrationChamilo
{
public function getDescription(): string
@@ -75,13 +77,13 @@ private function replaceOldURLsWithNew(string $content): string
foreach ($matches as $match) {
$attribute = $match[1];
- $baseUrlWithApp = $match[2] ? $match[2] . $match[3] : $match[3];
+ $baseUrlWithApp = $match[2] ? $match[2].$match[3] : $match[3];
$folderId = (int) $match[4];
$userId = (int) $match[5];
$filename = $match[6];
$user = $userRepo->find($userId);
- if ($user !== null) {
+ if (null !== $user) {
$personalFile = $personalRepo->getResourceByCreatorFromTitle($filename, $user, $user->getResourceNode());
if ($personalFile) {
$newUrl = $personalRepo->getResourceFileUrl($personalFile);
diff --git a/src/CoreBundle/Settings/AbstractSettingsSchema.php b/src/CoreBundle/Settings/AbstractSettingsSchema.php
index d512ff62445..145d6750506 100644
--- a/src/CoreBundle/Settings/AbstractSettingsSchema.php
+++ b/src/CoreBundle/Settings/AbstractSettingsSchema.php
@@ -65,7 +65,7 @@ protected function updateFormFieldsFromSettingsInfo(FormBuilderInterface $builde
foreach ($builder->all() as $fieldName => $field) {
$options = $field->getOptions();
$labelAttributes = $options['label_attr'] ?? [];
- $labelAttributes['class'] = (isset($labelAttributes['class']) ? $labelAttributes['class'] . ' ' : '') . 'settings-label';
+ $labelAttributes['class'] = (isset($labelAttributes['class']) ? $labelAttributes['class'].' ' : '').'settings-label';
$options['label_attr'] = $labelAttributes;
if (isset($settingsInfo[$fieldName])) {
@@ -75,7 +75,7 @@ protected function updateFormFieldsFromSettingsInfo(FormBuilderInterface $builde
$helpFromDb = $this->translator->trans($fieldConfig['help']);
$existingHelp = $options['help'] ?? '';
- $combinedHelp = !empty($existingHelp) ? $helpFromDb . ' ' . $existingHelp : $helpFromDb;
+ $combinedHelp = !empty($existingHelp) ? $helpFromDb.' '.$existingHelp : $helpFromDb;
$options['label'] = $labelFromDb;
$options['help'] = $combinedHelp;
diff --git a/src/CourseBundle/Entity/CCalendarEvent.php b/src/CourseBundle/Entity/CCalendarEvent.php
index 025b8a8955f..9fd600637c9 100644
--- a/src/CourseBundle/Entity/CCalendarEvent.php
+++ b/src/CourseBundle/Entity/CCalendarEvent.php
@@ -22,7 +22,6 @@
use Chamilo\CoreBundle\Entity\Career;
use Chamilo\CoreBundle\Entity\Promotion;
use Chamilo\CoreBundle\Entity\ResourceInterface;
-use Chamilo\CoreBundle\Entity\ResourceLink;
use Chamilo\CoreBundle\Entity\Room;
use Chamilo\CoreBundle\Filter\CidFilter;
use Chamilo\CoreBundle\Filter\GlobalEventFilter;
diff --git a/src/CourseBundle/Entity/CLpItem.php b/src/CourseBundle/Entity/CLpItem.php
index 72c0054a8f5..a887b80df35 100644
--- a/src/CourseBundle/Entity/CLpItem.php
+++ b/src/CourseBundle/Entity/CLpItem.php
@@ -520,12 +520,12 @@ public function setLvl(int $lvl): self
return $this;
}
- public function getRoot(): ?CLpItem
+ public function getRoot(): ?self
{
return $this->root;
}
- public function setRoot(?CLpItem $root): CLpItem
+ public function setRoot(?self $root): self
{
$this->root = $root;
diff --git a/src/CourseBundle/Repository/CCalendarEventRepository.php b/src/CourseBundle/Repository/CCalendarEventRepository.php
index 49e5388979f..47970cf9f86 100644
--- a/src/CourseBundle/Repository/CCalendarEventRepository.php
+++ b/src/CourseBundle/Repository/CCalendarEventRepository.php
@@ -8,7 +8,6 @@
use Chamilo\CoreBundle\Entity\AbstractResource;
use Chamilo\CoreBundle\Entity\Course;
-use Chamilo\CoreBundle\Entity\ResourceLink;
use Chamilo\CoreBundle\Entity\Session;
use Chamilo\CoreBundle\Entity\User;
use Chamilo\CoreBundle\Repository\ResourceRepository;
diff --git a/src/CourseBundle/Settings/SettingsCourseManager.php b/src/CourseBundle/Settings/SettingsCourseManager.php
index 0ce642a9a7d..7c67a780d85 100644
--- a/src/CourseBundle/Settings/SettingsCourseManager.php
+++ b/src/CourseBundle/Settings/SettingsCourseManager.php
@@ -155,15 +155,16 @@ private function getParameters(string $namespace): array
/**
* Fetches the value of a specific setting for the given course and variable.
*
- * @param string $variableName The name of the variable to fetch.
- * @return string|null The value of the setting if found, or null if not.
+ * @param string $variableName the name of the variable to fetch
+ *
+ * @return string|null the value of the setting if found, or null if not
*/
public function getCourseSettingValue(string $variableName): ?string
{
$repo = $this->manager->getRepository(CCourseSetting::class);
$courseSetting = $repo->findOneBy([
'cId' => $this->course->getId(),
- 'variable' => $variableName
+ 'variable' => $variableName,
]);
return $courseSetting ? $courseSetting->getValue() : null;
From 476601ef2a991ad6964f879c0056f037d62cf636 Mon Sep 17 00:00:00 2001
From: Angel Fernando Quiroz Campos
Date: Tue, 7 May 2024 09:48:53 -0500
Subject: [PATCH 166/413] CI: Fix count of default page categories
---
tests/CoreBundle/Repository/PageRepositoryTest.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/CoreBundle/Repository/PageRepositoryTest.php b/tests/CoreBundle/Repository/PageRepositoryTest.php
index 336711e96af..c4b5ecbd9a7 100644
--- a/tests/CoreBundle/Repository/PageRepositoryTest.php
+++ b/tests/CoreBundle/Repository/PageRepositoryTest.php
@@ -318,7 +318,7 @@ public function testCreateDefaultPages(): void
$this->assertTrue($result);
$this->assertSame(2, $pageRepo->count([]));
$this->assertSame(
- 6 + \count(CreateDefaultPages::getCategoriesForAdminBlocks()),
+ 7 + \count(CreateDefaultPages::getCategoriesForAdminBlocks()),
$pageCategoryRepo->count([])
);
From f69efaea59ef4e6b8cf8096f4ed5a73e151dd9df Mon Sep 17 00:00:00 2001
From: Yannick Warnier
Date: Tue, 7 May 2024 17:45:47 +0200
Subject: [PATCH 167/413] Language: Update language terms
---
translations/messages.de.po | 79 ++++++++++++++++++++++++-------------
1 file changed, 52 insertions(+), 27 deletions(-)
diff --git a/translations/messages.de.po b/translations/messages.de.po
index dc2f72f7220..ee008264e07 100644
--- a/translations/messages.de.po
+++ b/translations/messages.de.po
@@ -1,7 +1,7 @@
msgid ""
msgstr ""
"Project-Id-Version: chamilo\n"
-"PO-Revision-Date: 2024-05-03 08:19+0000\n"
+"PO-Revision-Date: 2024-05-07 15:44+0000\n"
"Last-Translator: Yannick Warnier \n"
"Language-Team: German \n"
@@ -22333,115 +22333,140 @@ msgid "Require e-mail confirmation"
msgstr "E-Mail-Bestätigung erforderlich"
msgid "Registration confirmation"
-msgstr ""
+msgstr "Bestätigung der Registrierung"
msgid "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"
msgstr ""
+"Ihr Konto ist inaktiv, da Sie es noch nicht bestätigt haben. Überprüfen Sie "
+"Ihre E-Mails und folgen Sie den Anweisungen oder klicken Sie auf den "
+"folgenden Link, um die E-Mail erneut zu senden"
msgid "To complete your platform registration you need confirm your account by clicking the following link"
msgstr ""
+"Um Ihre Plattformregistrierung abzuschließen, müssen Sie Ihr Konto "
+"bestätigen, indem Sie auf den folgenden Link klicken"
msgid "Confirmation for new account"
-msgstr ""
+msgstr "Bestätigung für neues Konto"
msgid "You need confirm your account via email to access the platform"
msgstr ""
+"Sie müssen Ihr Konto per E-Mail bestätigen, um Zugang zur Plattform zu "
+"erhalten"
msgid "Enable Cloud files link addition"
-msgstr ""
+msgstr "Aktivieren Sie das Hinzufügen von Cloud-Dateilinks"
msgid "Allow users to link to a file hosted on a public cloud service as if they were documents in the Chamilo documents tool."
msgstr ""
+"Erlauben Sie Benutzern, eine Verknüpfung zu einer Datei herzustellen, die "
+"auf einem öffentlichen Cloud-Dienst gehostet wird, als wären es Dokumente im "
+"Chamilo-Dokumentenwerkzeug."
msgid "This URL already exists"
-msgstr ""
+msgstr "Diese URL existiert bereits"
msgid "An error occurred while adding the link to a cloud file."
msgstr ""
+"Beim Hinzufügen des Links zu einer Cloud-Datei ist ein Fehler aufgetreten."
msgid "Add link to Cloud file"
-msgstr ""
+msgstr "Fügen Sie einen Link zur Cloud-Datei hinzu"
msgid "Cloud link deleted"
-msgstr ""
+msgstr "Link zur Cloud gelöscht"
msgid "Cloud link moved"
-msgstr ""
+msgstr "Der Cloud-Link wurde verschoben"
msgid "Error deleting the cloud link."
-msgstr ""
+msgstr "Fehler beim Löschen des Cloud-Links."
msgid "Cloud link added"
-msgstr ""
+msgstr "Cloud-Link hinzugefügt"
msgid "Please enter a name for this Cloud link"
-msgstr ""
+msgstr "Bitte geben Sie einen Namen für diesen Cloud-Link ein"
msgid "Cloud file link updated."
-msgstr ""
+msgstr "Der Link zur Cloud-Datei wurde aktualisiert."
msgid "The domain is not valid. It must be one of the following:"
msgstr ""
+"Der Domainname ist nicht gültig. Er muss einem der folgenden entsprechen:"
msgid "List of valid domains"
-msgstr ""
+msgstr "Liste gültiger Domänen"
msgid "URL field format invalid. Example of expected format: http://dropbox.com/sh/loremipsum/loremipsum?dl=0"
msgstr ""
+"Das Format des URL-Feldes ist ungültig. Beispiel für das erwartete Format: "
+"https://dropbox.com/sh/loremipsum/loremipsum?dl=0"
msgid "File extension"
-msgstr ""
+msgstr "Dateierweiterung"
msgid "Audit report"
-msgstr ""
+msgstr "Prüfbericht"
msgid "The Google Translate API used by this feature returned and empty answer. Please check or ask your translate_app_google_key setting is set correctly, or kindly ask an administrator to do so."
msgstr ""
+"Die Google Translate API, die von dieser Funktion verwendet wird, gab eine "
+"leere Antwort zurück. Bitte überprüfen Sie, ob Ihre Einstellung "
+"translate_app_google_key korrekt gesetzt ist, oder bitten Sie einen "
+"Administrator dies zu tun."
msgid "Link me to student"
-msgstr ""
+msgstr "Verknüpfen Sie mich mit dem Lernenden"
msgid "Please select the student you want to request a link to, so the administrators can review and approve your request. Please note that proper administrative procedures should have been followed first to ensure the admin can legally accept your request."
msgstr ""
+"Bitte wählen Sie den Lernenden aus, für den Sie einen Link anfordern "
+"möchten, damit die Administratoren Ihre Anfrage überprüfen und genehmigen "
+"können. Bitte beachten Sie, dass zuerst die entsprechenden administrativen "
+"Verfahren befolgt werden sollten, um sicherzustellen, dass der Administrator "
+"Ihre Anfrage rechtmäßig akzeptieren kann."
msgid "Request linking with student"
-msgstr ""
+msgstr "Anfrage zur Verknüpfung mit Lernenden"
msgid "Send pending announcements manually"
-msgstr ""
+msgstr "Senden Sie ausstehende Ankündigungen manuell"
msgid "Student linking request rejected"
-msgstr ""
+msgstr "Anfrage zur Verknüpfung von Lernenden abgelehnt"
msgid "Student link removed"
-msgstr ""
+msgstr "Link des Lernenden entfernt"
msgid "Session template"
-msgstr ""
+msgstr "Vorlagen Session"
msgid "Cloud file link"
-msgstr ""
+msgstr "Link zur Cloud-Datei"
msgid "Reset %s"
-msgstr ""
+msgstr "Zurücksetzen %s"
msgid "My global certificate"
msgstr "Mein Zertifikat"
msgid "Message tracking"
-msgstr ""
+msgstr "Nachrichtenverfolgung"
msgid "Messages exchange between %s and %s"
-msgstr ""
+msgstr "Austausch von Nachrichten zwischen %s und %s"
msgid "You will receive another email with your password"
-msgstr ""
+msgstr "Sie erhalten eine weitere E-Mail mit Ihrem Passwort."
msgid "You must have received another email with your username."
-msgstr ""
+msgstr "Du musst eine weitere E-Mail mit deinem Benutzernamen erhalten haben."
msgid "You must upload a zip file with the same name as the original SCORM file."
msgstr ""
+"Sie müssen eine Zip-Datei hochladen, die denselben Namen wie die "
+"ursprüngliche SCORM-Datei hat."
msgid "You need to create a skill profile"
msgstr ""
From 8571e455c800d72ad3d147b01e26c2f454e2fece Mon Sep 17 00:00:00 2001
From: Angel Fernando Quiroz Campos
Date: Tue, 7 May 2024 11:10:28 -0500
Subject: [PATCH 168/413] CI: Fix test to check document access
---
tests/CourseBundle/Repository/CDocumentRepositoryTest.php | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/tests/CourseBundle/Repository/CDocumentRepositoryTest.php b/tests/CourseBundle/Repository/CDocumentRepositoryTest.php
index b8977a75e29..283122de469 100644
--- a/tests/CourseBundle/Repository/CDocumentRepositoryTest.php
+++ b/tests/CourseBundle/Repository/CDocumentRepositoryTest.php
@@ -440,7 +440,7 @@ public function testUploadFile(): void
'headers' => ['Content-Type' => 'application/json'],
]
);
- $this->assertResponseStatusCodeSame(403); // Unauthorized
+ $this->assertResponseStatusCodeSame(200); // Course OPEN_PLATFORM, then document is accesible
$client->request('GET', '/api/documents', [
'query' => [
@@ -449,7 +449,8 @@ public function testUploadFile(): void
'cid' => $courseId,
],
]);
- $this->assertResponseStatusCodeSame(200);
+
+ $this->assertResponseStatusCodeSame(200); // Course OPEN_PLATFORM, then documents is accesible
// Test access with another user. He CAN see the file, the cid is pass as a parameter
// and the course is open to the world by default.
From 707d667ac1a078f84b4b87376395c963a9b531dc Mon Sep 17 00:00:00 2001
From: Yannick Warnier
Date: Tue, 7 May 2024 19:02:56 +0200
Subject: [PATCH 169/413] Language: Update language terms
---
translations/messages.de.po | 829 ++++++++++++++++++++++++------------
1 file changed, 547 insertions(+), 282 deletions(-)
diff --git a/translations/messages.de.po b/translations/messages.de.po
index ee008264e07..f10b4281af0 100644
--- a/translations/messages.de.po
+++ b/translations/messages.de.po
@@ -1,7 +1,7 @@
msgid ""
msgstr ""
"Project-Id-Version: chamilo\n"
-"PO-Revision-Date: 2024-05-07 15:44+0000\n"
+"PO-Revision-Date: 2024-05-07 17:02+0000\n"
"Last-Translator: Yannick Warnier \n"
"Language-Team: German \n"
@@ -393,7 +393,7 @@ msgid "Add me as coach"
msgstr "Mich als Trainer hinzufügen"
msgid "Add me as teacher in the imported courses."
-msgstr "Mich als Lehrer in den importierten Kursen hinzufügen."
+msgstr "Mich als Lehrer in den importierten Kurse hinzufügen."
msgid "Progress of exercises taken by the student"
msgstr "Fortschritt der von den Kursteilnehmern durchgeführten Übungen."
@@ -585,7 +585,9 @@ msgid "Show description"
msgstr "Beschreibung anzeigen"
msgid "Human resources managers should not be registered to courses. The corresponding users you selected have not been subscribed."
-msgstr "HR-Manager sollten nicht in Kursen registriert sein. Die gewählten Benutzer sind daher nicht zugewiesen worden."
+msgstr ""
+"HR-Manager sollten nicht in Kurse registriert sein. Die gewählten Benutzer "
+"sind daher nicht zugewiesen worden."
msgid "Clean and update course coaches"
msgstr "Bereinige und aktualisiere Kursleiter"
@@ -681,7 +683,14 @@ msgid "Number submitted"
msgstr "Eingereichte Anzahl"
msgid "Warning: the installer detected an error while trying to reach the test file at %s. It looks like the PHP script could not be interpreted. This could be a warning sign for future problems when creating courses. Please check the installation guide for more information about permissions. If you are installing a site with a URL that doesn't resolve yet, you can probably ignore this message."
-msgstr "Achtung: Das Installationsprogramm hat beim Versuch, die Testdatei auf %s zu erreichen, einen Fehler festgestellt. Scheinbar konnte das PHP-Skript nicht interpretiert werden. Dies könnte ein Warnhinweis auf zukünftige Probleme bei der Erstellung von Kursen sein. Bitte lesen Sie die Installationsanleitung für weitere Informationen zu Berechtigungen. Wenn Sie eine Website mit einer URL installieren, die sich noch nicht auflöst, können Sie diese Meldung wahrscheinlich ignorieren."
+msgstr ""
+"Achtung: Das Installationsprogramm hat beim Versuch, die Testdatei auf %s zu "
+"erreichen, einen Fehler festgestellt. Scheinbar konnte das PHP-Skript nicht "
+"interpretiert werden. Dies könnte ein Warnhinweis auf zukünftige Probleme "
+"bei der Erstellung von Kurse sein. Bitte lesen Sie die "
+"Installationsanleitung für weitere Informationen zu Berechtigungen. Wenn Sie "
+"eine Website mit einer URL installieren, die sich noch nicht auflöst, können "
+"Sie diese Meldung wahrscheinlich ignorieren."
msgid "Before %s"
msgstr "Vor %s"
@@ -1789,7 +1798,11 @@ msgid "has been deleted"
msgstr "wurde gelöscht"
msgid "Deleting this area will permanently delete all the content (documents, links...) it contains and unregister all its members (not remove them from other courses).
Do you really want to delete the course?"
-msgstr "Wenn der Kurs gelöscht wird, werden auch alle enthaltenen Dokumente und die Registrierungen der Kursteilnehmer gelöscht. (Kursteilnehmer werden jedoch nicht aus anderen Kursen entfernt). Ebenso werden auch alle verlinkten virtuellen Kurse entfernt.
Soll der Kurs wirklich gelöscht werden?"
+msgstr ""
+"Wenn der Kurs gelöscht wird, werden auch alle enthaltenen Dokumente und die "
+"Registrierungen der Kursteilnehmer gelöscht. (Kursteilnehmer werden jedoch "
+"nicht aus anderen Kurse entfernt). Ebenso werden auch alle verlinkten "
+"virtuellen Kurse entfernt.
Soll der Kurs wirklich gelöscht werden?"
msgid "YES"
msgstr "JA"
@@ -23237,84 +23250,111 @@ msgstr "Wie und wofür können wir die persönlichen Daten verwenden?"
msgid "With whom can we share them? In what opportunities? Through what processes (safe or not)?"
msgstr ""
+"Mit wem können wir sie teilen? Bei welchen Gelegenheiten? Durch welche "
+"Prozesse (sicher oder nicht)?"
msgid "Do we have another system with which Chamilo interacts? What is the interconnection process? What are the data pieces exchanged and in what way?"
msgstr ""
+"Haben wir ein weiteres System, mit dem Chamilo interagiert? Wie läuft der "
+"Verbindungsprozess ab? Welche Daten werden ausgetauscht und auf welche Weise?"
msgid "What are the limits that we will always respect when using personal data? How far can we go?"
msgstr ""
+"Welche Grenzen werden wir beim Umgang mit personenbezogenen Daten immer "
+"respektieren? Wie weit dürfen wir gehen?"
msgid "After how long do we erase the data? (event, last use, contract validity, etc.) What are the elimination processes?"
msgstr ""
+"Nach welcher Zeit löschen wir die Daten? (Veranstaltung, letzte Nutzung, "
+"Vertragslaufzeit usw.) Wie lauten die Löschvorgänge?"
msgid "What happens if the data is destroyed as a result of a technical failure? (unauthorized deletion or loss of material, for example)"
msgstr ""
+"Was passiert, wenn die Daten infolge eines technischen Ausfalls zerstört "
+"werden? (zum Beispiel unbefugtes Löschen oder Verlust von Material)"
msgid "For what purpose do we process personal data? Do we use it to filter the access users have to certain parts of our application? (negative or positive discrimination)"
msgstr ""
+"Zu welchem Zweck verarbeiten wir personenbezogene Daten? Nutzen wir sie, um "
+"den Zugang der Nutzer zu bestimmten Teilen unserer Anwendung zu filtern? ("
+"negative oder positive Diskriminierung)"
msgid "By name"
-msgstr ""
+msgstr "Nach Namen"
msgid "Ask for a revision"
-msgstr ""
+msgstr "Um eine Überarbeitung bitten"
msgid "This feature has been disabled because the libraries it depends on are no longer unmaintained."
msgstr ""
+"Diese Funktion wurde deaktiviert, da die Bibliotheken, von denen sie "
+"abhängt, nicht mehr gewartet werden."
msgid "By geolocalization"
-msgstr ""
+msgstr "Durch Geolokalisierung"
msgid "Give revision"
-msgstr ""
+msgstr "Geben Sie eine Überarbeitung"
msgid "Post reported"
-msgstr ""
+msgstr "Beitrag gemeldet"
msgid "User %s has reported the message %s in the forum %s"
-msgstr ""
+msgstr "Benutzer %s hat die Nachricht %s im Forum %s gemeldet"
msgid "My communities"
-msgstr ""
+msgstr "Meine Gemeinschaften"
msgid "See all communities"
-msgstr ""
+msgstr "Alle Gemeinschaften anzeigen"
msgid "Hide forum notifications"
-msgstr ""
+msgstr "Forum-Benachrichtigungen ausblenden"
msgid "Forum Category fields"
-msgstr ""
+msgstr "Kategoriefelder im Forum"
msgid "Forum post fields"
-msgstr ""
+msgstr "Felder für Forenbeiträge"
msgid "Show only global score (not question score) and show only the correct answers, do not show incorrect answers at all"
msgstr ""
+"Zeigen Sie nur die Gesamtpunktzahl (nicht die Punktzahl pro Frage) und "
+"zeigen Sie nur die richtigen Antworten, zeigen Sie falsche Antworten "
+"überhaupt nicht an"
msgid "Reported"
-msgstr ""
+msgstr "Gemeldet"
msgid "To %s"
msgstr "bis %s"
msgid "Survey invitation link"
-msgstr ""
+msgstr "Einladungslink zur Umfrage"
msgid "Revision proposed"
-msgstr ""
+msgstr "Vorgeschlagene Überarbeitung"
msgid "Sessions plan calendar"
-msgstr ""
+msgstr "Kalender für Sitzungspläne"
msgid "Limit of questions per day"
-msgstr ""
+msgstr "Begrenzung der Fragen pro Tag"
msgid "If set to greater than 0, this option will prevent the learner from entering a test that has more than what remains for the daily allowance. For example, is the limit is 50 and the learner has already taken 2 tests of 20 questions, it will not let the learner enter another 20 questions test (20+20+20=60 > 50). However, it will let the learner enter a 10 questions test (20+20+10=50)."
msgstr ""
+"Wenn dieser Wert größer als 0 eingestellt ist, verhindert diese Option, dass "
+"der Lernende einen Test beginnt, der über das verbleibende tägliche "
+"Kontingent hinausgeht. Wenn zum Beispiel das Limit 50 ist und der Lernende "
+"bereits 2 Tests mit je 20 Fragen absolviert hat, wird ihm der Zugang zu "
+"einem weiteren Test mit 20 Fragen verwehrt (20+20+20=60 > 50). Allerdings "
+"wird dem Lernenden die Teilnahme an einem Test mit 10 Fragen erlaubt "
+"(20+20+10=50)."
msgid "Sorry, you have reached the maximum number of questions (%s) for the day. Please try again tomorrow."
msgstr ""
+"Entschuldigung, Sie haben die maximale Anzahl an Fragen (%s) für den "
+"heutigen Tag erreicht. Bitte versuchen Sie es morgen erneut."
msgid "Like"
msgstr ""
@@ -23323,190 +23363,211 @@ msgid "Dislike"
msgstr ""
msgid "Generate statistics"
-msgstr ""
+msgstr "Generieren Sie Statistiken"
msgid "Basic course documents"
-msgstr ""
+msgstr "Grundlegende Kursunterlagen"
msgid "Week %s"
-msgstr ""
+msgstr "Woche %s"
msgid "Wrong answer. The correct one was:"
-msgstr ""
+msgstr "Falsche Antwort. Die richtige war:"
msgid "This quiz can be embeddable on videos or mobile content"
-msgstr ""
+msgstr "Dieses Quiz kann in Videos oder mobile Inhalte eingebettet werden"
msgid "Search for this location"
-msgstr ""
+msgstr "Suche nach diesem Ort"
msgid "Terms of use agreement status"
-msgstr ""
+msgstr "Nutzungsbedingungen Zustimmungsstatus"
msgid "Hide survey invitation link"
-msgstr ""
+msgstr "Ausblenden des Einladungslinks zur Umfrage"
msgid "Leave a message"
-msgstr ""
+msgstr "Hinterlassen Sie eine Nachricht"
msgid "Orphan question"
-msgstr ""
+msgstr "Verwaiste Frage"
msgid "Welcome to portal %s Course session: %s"
-msgstr ""
+msgstr "Willkommen im Portal %s Kurs-Session: %s"
msgid "Welcome to portal %s in course %s, part of career %s"
-msgstr ""
+msgstr "Willkommen im Portal %s im Kurs %s, Teil der Laufbahn %s"
msgid "Your next module"
-msgstr ""
+msgstr "Ihr nächstes Modul"
msgid "First lesson"
-msgstr ""
+msgstr "Erste Lektion"
msgid "Import course teachers as course coach in the session"
-msgstr ""
+msgstr "Importieren Sie Kurstrainer als Kursbetreuer in die Session"
msgid "Resume import"
-msgstr ""
+msgstr "Lebenslauf-Import"
msgid "Candidate"
-msgstr ""
+msgstr "Kandidat"
msgid "General total"
-msgstr ""
+msgstr "Gesamtsumme"
msgid "Domains"
-msgstr ""
+msgstr "Domänen"
msgid "Logins by date"
-msgstr ""
+msgstr "Anmeldungen nach Datum"
msgid "Allow htaccess in the SCORM import"
-msgstr ""
+msgstr "Erlaube htaccess beim SCORM-Import"
msgid "Auto-evaluation mode and ranking"
-msgstr ""
+msgstr "Modus zur Selbstbewertung und Rangliste"
msgid "You're receiving a copy because, you're a course coach"
-msgstr ""
+msgstr "Sie erhalten eine Kopie, weil Sie ein Kurs-Tutor sind"
msgid "Generate report"
-msgstr ""
+msgstr "Bericht erstellen"
msgid "Version from the version file"
-msgstr ""
+msgstr "Version aus der Versionsdatei"
msgid "Version from the config file"
-msgstr ""
+msgstr "Version aus der Konfigurationsdatei"
+#, fuzzy
msgid "The version from the version.php file is updated with each version but only available if the main/install/ directory is present."
msgstr ""
+"Die Version aus der Datei version.php wird mit jeder Version aktualisiert, "
+"ist aber nur verfügbar, wenn das Verzeichnis main/install/ vorhanden ist."
msgid "The version from the main configuration file shows on the main administration page, but has to be changed manually on upgrade."
msgstr ""
+"Die Version aus der Hauptkonfigurationsdatei wird auf der "
+"Hauptadministrationsseite angezeigt, muss jedoch bei einem Upgrade manuell "
+"geändert werden."
msgid "Results page configuration"
-msgstr ""
+msgstr "Konfiguration der Ergebnisseite"
msgid "Hide expected answers column"
-msgstr ""
+msgstr "Ausblenden der Spalte mit erwarteten Antworten"
msgid "Hide total score"
-msgstr ""
+msgstr "Gesamtpunktzahl ausblenden"
msgid "Hide question score"
-msgstr ""
+msgstr "Ausblenden der Fragepunktzahl"
msgid "Save answers"
-msgstr ""
+msgstr "Antworten speichern"
msgid "Pre-fill with answers from previous attempt"
-msgstr ""
+msgstr "Vorausfüllen mit Antworten aus dem vorherigen Versuch"
msgid "Subscribe automatically all users to all forum notifications"
msgstr "Automatisch alle Benutzer anmelden"
msgid "Direct feedback as pop-up"
-msgstr ""
+msgstr "Direktes Feedback als Pop-up"
msgid "Total time spent"
-msgstr ""
+msgstr "Gesamtzeit verbracht"
msgid "Certificate of achievement"
-msgstr ""
+msgstr "Zertifikat über die Leistung"
msgid "Surveys report"
-msgstr ""
+msgstr "Berichte über Umfragen"
msgid "Enter your new password here."
-msgstr ""
+msgstr "Geben Sie hier Ihr neues Passwort ein."
msgid "Type your new password once again, to reduce the likeliness of typing errors."
msgstr ""
+"Geben Sie Ihr neues Passwort erneut ein, um die Wahrscheinlichkeit von "
+"Tippfehlern zu verringern."
msgid "Extraction from %s"
-msgstr ""
+msgstr "Extraktion aus %s"
msgid "Compilatio"
-msgstr ""
+msgstr "Compilatio"
msgid "Verify that it contains text (and not only images)"
-msgstr ""
+msgstr "Stellen Sie sicher, dass es Text enthält (und nicht nur Bilder)"
msgid "and that it is not corrupted"
-msgstr ""
+msgstr "und dass es nicht beschädigt ist"
msgid "Analyse"
-msgstr ""
+msgstr "Analysieren"
msgid "(Pourcentage of file analysis)"
-msgstr ""
+msgstr "(Prozentsatz der Dateianalyse)"
msgid "Pending Analysis"
-msgstr ""
+msgstr "Ausstehende Analyse"
msgid "Waiting for analysis"
-msgstr ""
+msgstr "Wartende auf Analyse"
msgid "Ending analysis"
-msgstr ""
+msgstr "Abschlussanalyse"
msgid "If the file is in pdf format, check that it is not protected by modification."
msgstr ""
+"Wenn die Datei im PDF-Format vorliegt, überprüfen Sie, dass sie nicht gegen "
+"Änderungen geschützt ist."
msgid "Connecting with the Compilatio server"
-msgstr ""
+msgstr "Verbindung mit dem Compilatio-Server"
msgid "with Compilatio"
-msgstr ""
+msgstr "mit Compilatio"
msgid "Start Compilatio analysis"
-msgstr ""
+msgstr "Starten Sie die Compilatio-Analyse"
msgid "See report"
-msgstr ""
+msgstr "Siehe Bericht"
msgid "Your selection contains no jobs to analyze. Only jobs managed by Compilatio and not already scanned can be sent."
msgstr ""
+"Ihre Auswahl enthält keine zu analysierenden Aufgaben. Nur von Compilatio "
+"verwaltete und noch nicht gescannte Aufgaben können gesendet werden."
msgid "AJAX communication with the Compilatio server impossible. Please retry later."
msgstr ""
+"Die AJAX-Kommunikation mit dem Compilatio-Server ist nicht möglich. Bitte "
+"versuchen Sie es später noch einmal."
msgid "Information: The list of classes below contains the list of classes you have already registered in your course. If this list is empty, use the + green above to add classes."
msgstr ""
+"Information: Die untenstehende Liste enthält die Klassen, für die Sie sich "
+"bereits in Ihrem Kurs angemeldet haben. Wenn diese Liste leer ist, verwenden "
+"Sie das grüne Pluszeichen oben, um Klassen hinzuzufügen."
msgid "Insert your two names"
-msgstr ""
+msgstr "Geben Sie Ihre beiden Namen ein"
msgid "Add right logo"
-msgstr ""
+msgstr "Richtige Logo hinzufügen"
msgid "Use score as progress"
-msgstr ""
+msgstr "Punktzahl als Fortschritt verwenden"
msgid "Use the score returned, by the only SCO in this learning path, as the progress indicator in the progress bar. This modifies the SCORM behaviour in the strict sense, but improves visual feedback to the learner."
msgstr ""
+"Verwenden Sie die von dem einzigen SCO in diesem Lernpfad zurückgegebene "
+"Punktzahl als Fortschrittsanzeige in der Fortschrittsleiste. Dies "
+"modifiziert das SCORM-Verhalten im strengen Sinne, verbessert jedoch das "
+"visuelle Feedback für den Lernenden."
msgid "Planned"
msgstr "geplannt"
@@ -23536,745 +23597,841 @@ msgid "CAS 3"
msgstr "CAS 3"
msgid "Go back to video"
-msgstr ""
+msgstr "Zurück zum Video"
msgid "Some SCORM learning paths, specifically those with one single SCO, can report their progress as the SCO's score (cmi.core.score.raw). By checking this option (only available for single SCO learning paths), Chamilo will show the progress based on the score received from the SCO item. Beware that, by using this trick, you lose the ability to get any real score from the item."
msgstr ""
+"Einige SCORM-Lernpfade, insbesondere solche mit einem einzigen SCO, können "
+"ihren Fortschritt als SCO-Bewertung (cmi.core.score.raw) melden. Wenn Sie "
+"diese Option aktivieren (nur verfügbar für Lernpfade mit einem einzigen SCO)"
+", zeigt Chamilo den Fortschritt basierend auf der vom SCO-Element erhaltenen "
+"Bewertung an. Beachten Sie jedoch, dass Sie durch diesen Trick die "
+"Möglichkeit verlieren, eine echte Bewertung vom Element zu erhalten."
msgid "There is a sequence resource linked to this course. You must delete this link first."
msgstr ""
+"Es gibt eine Sequenzressource, die mit diesem Kurs verknüpft ist. Sie müssen "
+"zuerst diese Verknüpfung löschen."
msgid "Prevent moving backwards to previous questions"
-msgstr ""
+msgstr "Verhindern Sie das Zurückgehen zu vorherigen Fragen"
msgid "Upload plugin"
-msgstr ""
+msgstr "Plugin hochladen"
msgid "Please remember that uploading third party plugins can be harmful to both your portal and your server. Always ensure you install plugins from secure sources or that you can count on professional support from their developers."
msgstr ""
+"Bitte beachten Sie, dass das Hochladen von Plugins Dritter sowohl für Ihr "
+"Portal als auch für Ihren Server schädlich sein kann. Stellen Sie immer "
+"sicher, dass Sie Plugins aus sicheren Quellen installieren oder dass Sie auf "
+"professionelle Unterstützung ihrer Entwickler zählen können."
msgid "Uploading the same plugin more than once will overwrite the previous plugin files. As in the first upload, uploading a third party plugin can have harmful effects."
msgstr ""
+"Das Hochladen desselben Plugins mehrmals wird die vorherigen Plugin-Dateien "
+"überschreiben. Wie beim ersten Hochladen kann das Hochladen eines "
+"Drittanbieter-Plugins schädliche Auswirkungen haben."
msgid "Select the new plugin"
-msgstr ""
+msgstr "Wählen Sie das neue Plugin"
msgid "The third party plugins upload is not enabled. Make sure the 'plugin_upload_enable' is set to 'true' in the platform configuration file."
msgstr ""
+"Das Hochladen von Drittanbieter-Plugins ist nicht aktiviert. Stellen Sie "
+"sicher, dass 'plugin_upload_enable' in der Konfigurationsdatei der Plattform "
+"auf 'true' gesetzt ist."
msgid "Plugin uploaded"
-msgstr ""
+msgstr "Plugin hochgeladen"
msgid "Official"
-msgstr ""
+msgstr "Offiziell"
msgid "Third party"
-msgstr ""
+msgstr "Drittanbieter"
msgid "Your plugin has the same name as an official plugin. Official plugins cannot be overwritten. Please change your plugin's zip file name."
msgstr ""
+"Ihr Plugin hat denselben Namen wie ein offizielles Plugin. Offizielle "
+"Plugins können nicht überschrieben werden. Bitte ändern Sie den Namen Ihrer "
+"Plugin-Zip-Datei."
msgid "Courses of %s %s"
-msgstr ""
+msgstr "Kurse von %s %s"
msgid "You cannot subscribe to the course any more because your session has expired."
msgstr ""
+"Sie können sich nicht mehr für den Kurs anmelden, da Ihre Session abgelaufen "
+"ist."
msgid "Certificate of achievement by day"
-msgstr ""
+msgstr "Leistungszertifikat nach Tag"
msgid "Reduced report"
-msgstr ""
+msgstr "Reduzierter Bericht"
msgid "Outside courses"
-msgstr ""
+msgstr "Externe Kurse"
msgid "Learnpaths category"
-msgstr ""
+msgstr "Lernpfadkategorie"
msgid "Mail templates"
-msgstr ""
+msgstr "E-Mail-Vorlagen"
msgid "An email to reset your password has been sent."
-msgstr ""
+msgstr "Eine E-Mail zum Zurücksetzen Ihres Passworts wurde gesendet."
msgid "Total number of available courses"
-msgstr ""
+msgstr "Gesamtanzahl der verfügbaren Kurse"
msgid "Number of matching courses"
-msgstr ""
+msgstr "Anzahl der passenden Kurse"
msgid "Sessions by date"
-msgstr ""
+msgstr "Sessionen nach Datum"
msgid "Global statistics"
-msgstr ""
+msgstr "Globale Statistiken"
msgid "Weeks"
-msgstr ""
+msgstr "Wochen"
msgid "Sessions count"
-msgstr ""
+msgstr "Anzahl der Sessionen"
msgid "Sessions per week"
-msgstr ""
+msgstr "Sessionen pro Woche"
msgid "Average number of users per session"
-msgstr ""
+msgstr "Durchschnittliche Anzahl von Nutzern pro Session"
msgid "Average number of sessions per general session coach"
-msgstr ""
+msgstr "Durchschnittliche Anzahl der Sessions pro allgemeinem Session-Trainer"
msgid "Sessions per category"
-msgstr ""
+msgstr "Sessionen pro Kategorie"
msgid "Sessions per language"
-msgstr ""
+msgstr "Sessionen pro Sprache"
msgid "Courses in sessions"
-msgstr ""
+msgstr "Kursen in Sessions"
msgid "Users statistics"
-msgstr ""
+msgstr "Benutzerstatistiken"
msgid "Total number of students"
-msgstr ""
+msgstr "Gesamtzahl der Lernenden"
msgid "Users created in the selected period"
-msgstr ""
+msgstr "Benutzer im ausgewählten Zeitraum erstellt"
msgid "Users per language"
-msgstr ""
+msgstr "Benutzer pro Sprache"
msgid "Count"
-msgstr ""
+msgstr "Zählen"
msgid "Sort by"
-msgstr ""
+msgstr "Sortieren nach"
msgid "Subscription count"
-msgstr ""
+msgstr "Anzahl der Abonnements"
msgid "Vote count"
-msgstr ""
+msgstr "Stimmenzahl"
msgid "Export as compact CSV"
-msgstr ""
+msgstr "Als kompaktes CSV exportieren"
msgid "Promoted messages"
-msgstr ""
+msgstr "Beförderte Nachrichten"
msgid "Publish for group tutors"
-msgstr ""
+msgstr "Für Gruppentutoren veröffentlichen"
msgid "Group survey for %s"
-msgstr ""
+msgstr "Gruppenumfrage für %s"
msgid "Hi %s
As group tutor for the group %s you are invited to participate at the following survey :"
msgstr ""
+"Hallo %s
Als Gruppentutor für die Gruppe %s sind Sie eingeladen, "
+"an der folgenden Umfrage teilzunehmen:"
msgid "Survey %s multiplicated"
-msgstr ""
+msgstr "Umfrage %s vervielfacht"
msgid "Survey %s not multiplicated"
-msgstr ""
+msgstr "Umfrage %s nicht vervielfacht"
msgid "Export survey results"
-msgstr ""
+msgstr "Exportieren Sie die Ergebnisse der Umfrage"
msgid "Score Sum"
-msgstr ""
+msgstr "Punktesumme"
msgid "Export results"
-msgstr ""
+msgstr "Ergebnisse exportieren"
msgid "Your browser has been verified. You can safely proceed."
-msgstr ""
+msgstr "Ihr Browser wurde verifiziert. Sie können sicher fortfahren."
msgid "Your browser could not be verified. Please try again, or try another browser or device before starting your test."
msgstr ""
+"Ihr Browser konnte nicht verifiziert werden. Bitte versuchen Sie es erneut, "
+"oder verwenden Sie einen anderen Browser oder ein anderes Gerät, bevor Sie "
+"Ihren Test starten."
msgid "Partially correct"
-msgstr ""
+msgstr "Teilweise korrekt"
msgid "%d / %d answers saved."
-msgstr ""
+msgstr "%d / %d Antworten gespeichert."
msgid "Test your browser"
-msgstr ""
+msgstr "Testen Sie Ihren Browser"
msgid "Sort the following options from the list as you see fit by dragging them to the lower areas. You can put them back in this area to modify your answer."
msgstr ""
+"Sortieren Sie die folgenden Optionen aus der Liste nach Belieben, indem Sie "
+"sie in die unteren Bereiche ziehen. Sie können sie zurück in diesen Bereich "
+"legen, um Ihre Antwort zu ändern."
msgid "Average time in the course"
-msgstr ""
+msgstr "Durchschnittliche Zeit im Kurs"
msgid "Users active in a test"
-msgstr ""
+msgstr "Benutzer aktiv in einem Test"
msgid "Selective display"
-msgstr ""
+msgstr "Selektive Anzeige"
msgid "This question, when located on a single survey page with a first multiple choice question, will only show if the first *option* of the first question is selected. For example, 'Did you go on holiday?' -> if answering the first option 'Yes', the selective display question will appear with a list of possible holiday locations to select from."
msgstr ""
+"Diese Frage wird auf einer einzelnen Umfrageseite mit einer ersten "
+"Mehrfachauswahlfrage nur angezeigt, wenn die erste *Option* der ersten Frage "
+"ausgewählt ist. Zum Beispiel bei der Frage 'Waren Sie im Urlaub?' -> wenn "
+"die erste Option 'Ja' ausgewählt wird, erscheint die selektive Anzeigefrage "
+"mit einer Liste möglicher Urlaubsorte zur Auswahl."
msgid "Multiple choice with free text"
-msgstr ""
+msgstr "Mehrfachauswahl mit Freitext"
msgid "Offer some pre-defined options, then let the user answer by text if no option matches."
msgstr ""
+"Bieten Sie einige vordefinierte Optionen an und lassen Sie den Benutzer dann "
+"per Text antworten, wenn keine Option zutrifft."
msgid "Multiple choice with 'other' option"
-msgstr ""
+msgstr "Mehrfachauswahl mit Option 'Andere'"
msgid "Other..."
-msgstr ""
+msgstr "Andere..."
msgid "Please specify:"
-msgstr ""
+msgstr "Bitte präzisieren Sie:"
msgid "User %s has posted a document in the Assignments tool in the course %s"
msgstr ""
+"Benutzer %s hat ein Dokument im Arbeitsaufgaben-Tool im Kurs %s "
+"veröffentlicht"
msgid "Download documents first"
-msgstr ""
+msgstr "Zuerst die Dokumente herunter laden"
msgid "File %s is empty or only contains empty lines."
-msgstr ""
+msgstr "Die Datei %s ist leer oder enthält nur leere Zeilen."
msgid "File %s has %d non-empty lines."
-msgstr ""
+msgstr "Die Datei %s hat %d nicht-leere Zeilen."
msgid "There are duplicates: only %d unique user names were extracted."
msgstr ""
+"Es wurden Duplikate gefunden: Nur %d einzigartige Benutzernamen wurden "
+"extrahiert."
msgid "No line matched any actual user name."
-msgstr ""
+msgstr "Keine Zeile entsprach einem tatsächlichen Benutzernamen."
msgid "Only %d lines matched actual users."
-msgstr ""
+msgstr "Nur %d Zeilen entsprachen tatsächlichen Benutzern."
msgid "The following %d line(s) do not match any actual user:"
msgstr ""
+"Die folgenden %d Zeile(n) stimmen mit keinem tatsächlichen Benutzer überein:"
msgid "%d users are about to be anonymized :"
-msgstr ""
+msgstr "%d Benutzer werden gleich anonymisiert:"
msgid "Loading %d users..."
-msgstr ""
+msgstr "Lade %d Benutzer..."
msgid "Anonymizing %d users..."
-msgstr ""
+msgstr "Anonymisierung von %d Benutzern..."
msgid "All %d users were anonymized."
-msgstr ""
+msgstr "Alle %d Benutzer wurden anonymisiert."
msgid "Only %d users were anonymized."
-msgstr ""
+msgstr "Nur %d Benutzer wurden anonymisiert."
msgid "Attempted anonymization of the following %d users failed:"
msgstr ""
+"Bei dem Versuch, die folgenden %d Benutzer zu anonymisieren, ist ein Fehler "
+"aufgetreten:"
msgid "Please upload a text file listing the users to be anonymized, one username per line."
msgstr ""
+"Bitte laden Sie eine Textdatei hoch, die die zu anonymisierenden Benutzer "
+"auflistet, jeweils einen Benutzernamen pro Zeile."
msgid "Internal inconsistency found : %d users found from %d submitted usernames. Please start over."
msgstr ""
+"Interne Inkonsistenz festgestellt: %d Benutzer von %d übermittelten "
+"Benutzernamen gefunden. Bitte beginnen Sie von vorne."
msgid "Anonymise users list"
-msgstr ""
+msgstr "Benutzerliste anonymisieren"
msgid "Username list"
-msgstr ""
+msgstr "Benutzerlistе"
msgid "Users about to be anonymized:"
-msgstr ""
+msgstr "Benutzer, die anonymisiert werden sollen:"
msgid "Could not read file."
-msgstr ""
+msgstr "Die Datei konnte nicht gelesen werden."
msgid "Could not read file lines."
-msgstr ""
+msgstr "Die Dateizeilen konnten nicht gelesen werden."
msgid "Certificates in sessions"
-msgstr ""
+msgstr "Zertifikate in Sessions"
msgid "Filter certificates in sessions"
-msgstr ""
+msgstr "Filter Zertifikate in Sessions"
msgid "Update user list"
-msgstr ""
+msgstr "Benutzerliste aktualisieren"
msgid "Chamilo is an Open Source project and this portal is provided to our community free of charge by the Chamilo Association, which pursues the goal of improving the availability of a quality education around the globe.
"
msgstr ""
+"Chamilo ist ein Open-Source-Projekt und dieses Portal wird unserer Community "
+"kostenlos von der Chamilo Association zur Verfügung gestellt, die das Ziel "
+"verfolgt, die Verfügbarkeit einer qualitativ hochwertigen Bildung weltweit "
+"zu verbessern.
"
msgid "My assignments"
-msgstr ""
+msgstr "Meine Aufgaben"
msgid "Add to editor"
-msgstr ""
+msgstr "Zum Editor hinzufügen"
msgid "Image URL"
-msgstr ""
+msgstr "Bild-URL"
msgid "px width"
-msgstr ""
+msgstr "Pixelbreite"
msgid "Add image with zoom"
-msgstr ""
+msgstr "Bild mit Zoom hinzufügen"
msgid "Delete in all languages"
-msgstr ""
+msgstr "Löschen in allen Sprachen"
msgid "My students schedule"
-msgstr ""
+msgstr "Mein Lernenden-Zeitplan"
msgid "I accept the number of saved responses in this section."
msgstr ""
+"Ich akzeptiere die Anzahl der gespeicherten Antworten in diesem Abschnitt."
msgid "If you are not satisfied, do not check the acceptance box and consult the course manager or the platform administrator."
msgstr ""
+"Wenn Sie nicht zufrieden sind, markieren Sie das Akzeptanzfeld nicht und "
+"wenden Sie sich an den Kursmanager oder den Plattformadministrator."
msgid "Student's superior follow up"
-msgstr ""
+msgstr "Lernender Follow-up"
msgid "General Coaches planning"
-msgstr ""
+msgstr "Allgemeine Coachplanung"
msgid "Sent or past assignments"
-msgstr ""
+msgstr "Gesendete oder vergangene Aufgaben"
msgid "Pending assignments"
-msgstr ""
+msgstr "Ausstehende Aufgaben"
msgid "All Assignments"
-msgstr ""
+msgstr "Alle Aufgaben"
msgid "You will find below all your assignment from all the courses and session in which you are registered."
msgstr ""
+"Sie finden unten alle Ihre Aufgaben aus allen Kursen und Sessions, in denen "
+"Sie registriert sind."
msgid "Required courses"
-msgstr ""
+msgstr "Pflichtkurse"
msgid "Standard List"
-msgstr ""
+msgstr "Standardliste"
msgid "Management List"
-msgstr ""
+msgstr "Managementliste"
msgid "Anonymize user's sessions"
-msgstr ""
+msgstr "Benutzersessionen anonymisieren"
msgid "Continue last import"
-msgstr ""
+msgstr "Letzte Importierung fortsetzen"
msgid "Notifications"
-msgstr ""
+msgstr "Benachrichtigungen"
msgid "Justification"
-msgstr ""
+msgstr "Rechtfertigung"
msgid "Periodic export"
-msgstr ""
+msgstr "Periodischer Export"
msgid "Dates"
-msgstr ""
+msgstr "Termine"
msgid "Error: Some of the files inside the zip package have unauthorized extensions."
-msgstr ""
+msgstr "Einige der Dateien im ZIP-Paket haben nicht autorisierte Erweiterungen."
msgid "Users by status"
-msgstr ""
+msgstr "Benutzer nach Status"
msgid "Sessions per status"
-msgstr ""
+msgstr "Sessionen nach Status"
msgid "Users by target language"
-msgstr ""
+msgstr "Benutzer nach Zielsprache"
msgid "Users by career"
-msgstr ""
+msgstr "Benutzer nach Karriere"
msgid "Users by contract"
-msgstr ""
+msgstr "Benutzer nach Vertrag"
msgid "Users by certificate"
-msgstr ""
+msgstr "Benutzer nach Zertifikat"
msgid "Users by age"
-msgstr ""
+msgstr "Benutzer nach Alter"
msgid "Continue the import"
-msgstr ""
+msgstr "Fahren Sie mit dem Import fort"
msgid "LDAP connect operation failed."
-msgstr ""
+msgstr "Die LDAP-Verbindungsoperation ist fehlgeschlagen."
msgid "ldap_bind() failed."
-msgstr ""
+msgstr "ldap_bind() ist fehlgeschlagen."
msgid "ldap_search() failed."
-msgstr ""
+msgstr "ldap_search() ist fehlgeschlagen."
msgid "ldap_first_entry() failed."
-msgstr ""
+msgstr "ldap_first_entry() ist fehlgeschlagen."
msgid "ldap_get_values() failed."
-msgstr ""
+msgstr "ldap_get_values() ist fehlgeschlagen."
msgid "More than one attribute value was found."
-msgstr ""
+msgstr "Mehr als ein Attributwert wurde gefunden."
msgid "More than one user matched."
-msgstr ""
+msgstr "Mehr als ein Benutzer gefunden."
msgid "Course code confirmation"
-msgstr ""
+msgstr "Kurscodebestätigung"
msgid "Unsupported IMS/QTI version."
-msgstr ""
+msgstr "Nicht unterstützte IMS/QTI-Version."
msgid "Export all certificates to ZIP"
-msgstr ""
+msgstr "Alle Zertifikate als ZIP exportieren"
msgid "Current score"
-msgstr ""
+msgstr "Aktuelle Punktzahl"
msgid "Add attempt"
-msgstr ""
+msgstr "Versuch hinzufügen"
msgid "survey"
-msgstr ""
+msgstr "Umfrage"
msgid "Private between users"
-msgstr ""
+msgstr "Privat zwischen Benutzern"
msgid "Nothing"
-msgstr ""
+msgstr "Nichts"
msgid "Compilatio analysis in progress"
-msgstr ""
+msgstr "Compilatio-Analyse läuft"
msgid "Account expiration"
-msgstr ""
+msgstr "Kontoablauf"
msgid "Justification expiration"
-msgstr ""
+msgstr "Rechtfertigungsablauf"
msgid "Justification type"
-msgstr ""
+msgstr "Rechtfertigungstyp"
msgid "Persistent"
-msgstr ""
+msgstr "Beständig"
msgid "Logout from your %s account"
-msgstr ""
+msgstr "Abmelden von Ihrem %s-Konto"
msgid "Days difference"
-msgstr ""
+msgstr "Tageunterschied"
msgid "Graduated"
-msgstr ""
+msgstr "Absolvent"
msgid "Absent"
-msgstr ""
+msgstr "Abwesend"
msgid "Internal database error"
-msgstr ""
+msgstr "Interner Datenbankfehler"
msgid "Wrong number of days"
-msgstr ""
+msgstr "Falsche Anzahl von Tagen"
msgid "Subscription not allowed"
-msgstr ""
+msgstr "Abonnement nicht erlaubt"
msgid "You have passed the %s minutes limit to see the results."
msgstr ""
+"Sie haben das Zeitlimit von %s Minuten überschritten, um die Ergebnisse "
+"einzusehen."
msgid "Last updated"
-msgstr ""
+msgstr "Letzte Aktualisierung"
msgid "Export to XLS"
-msgstr ""
+msgstr "Exportieren nach XLS"
msgid "Learning paths generic stats"
-msgstr ""
+msgstr "Lernpfade allgemeine Statistiken"
msgid "Failed to create extra field cas_user."
-msgstr ""
+msgstr "Das Erstellen des zusätzlichen Profilfelds cas_user ist fehlgeschlagen."
msgid "Failed to create user."
-msgstr ""
+msgstr "Benutzererstellung fehlgeschlagen."
msgid "No such user in LDAP."
-msgstr ""
+msgstr "Kein solcher Benutzer in LDAP."
msgid "No such user in the internal database."
-msgstr ""
+msgstr "Kein solcher Benutzer in der internen Datenbank."
msgid "The user could not be updated."
-msgstr ""
+msgstr "Der Benutzer konnte nicht aktualisiert werden."
msgid "The template session does not exist."
-msgstr ""
+msgstr "Die Vorlage für die Session existiert nicht."
msgid "Session not registered."
-msgstr ""
+msgstr "Session nicht registriert."
msgid "Courses not added to session."
-msgstr ""
+msgstr "Kurse nicht zur Session hinzugefügt."
msgid "Session not found."
-msgstr ""
+msgstr "Session nicht gefunden."
msgid "User not found."
-msgstr ""
+msgstr "Benutzer nicht gefunden."
msgid "User not subscribed."
-msgstr ""
+msgstr "Benutzer nicht abonniert."
msgid "No session matched."
-msgstr ""
+msgstr "Keine Session entspricht den Kriterien."
msgid "More than one session matched."
-msgstr ""
+msgstr "Mehr als eine Session entspricht den Kriterien."
msgid "Could not load user."
-msgstr ""
+msgstr "Benutzer konnte nicht geladen werden."
msgid "Language unavailable."
-msgstr ""
+msgstr "Sprache nicht verfügbar."
msgid "Could not update extra field value."
-msgstr ""
+msgstr "Konnte den Wert des zusätzlichen Feldes nicht aktualisieren."
msgid "Unsupported update."
-msgstr ""
+msgstr "Nicht unterstütztes Update."
msgid "No user matched."
-msgstr ""
+msgstr "Kein Benutzer gefunden."
msgid "Resume"
-msgstr ""
+msgstr "Lebenslauf"
msgid "Attendance from %s to %s"
-msgstr ""
+msgstr "Von %s bis %s Anwesenheit"
msgid "Add time"
-msgstr ""
+msgstr "Zeit hinzufügen"
msgid "Add user"
-msgstr ""
+msgstr "Benutzer hinzufügen"
msgid "Time spent on assignment"
-msgstr ""
+msgstr "Zeitaufwand für die Arbeit"
msgid "User %s signed the agreement on %s"
-msgstr ""
+msgstr "Benutzer %s hat die Vereinbarung am %s unterschrieben"
msgid "Available"
-msgstr ""
+msgstr "Verfügbar"
msgid "Compilatio anti-plagiarism module"
-msgstr ""
+msgstr "Modul zur Plagiatsprüfung Compilatio"
msgid "Quotas"
-msgstr ""
+msgstr "Kontingente"
msgid "Credits: %s on %s"
-msgstr ""
+msgstr "Guthaben: %s am %s"
msgid "SOAP connection test..."
-msgstr ""
+msgstr "SOAP-Verbindungstest..."
msgid "Connection to Compilatio's SOAP server"
-msgstr ""
+msgstr "Verbindung zum SOAP-Server von Compilatio"
msgid "Connection successful."
-msgstr ""
+msgstr "Verbindung erfolgreich."
msgid "Sending text to the Compilatio server"
-msgstr ""
+msgstr "Text an den Compilatio-Server senden"
msgid "This is a text sending test to the Compilatio server via its API.\nCompilatio key used: %s"
msgstr ""
+"Dies ist ein Textsendetest an den Compilatio-Server über seine API.\n"
+"Verwendeter Compilatio-Schlüssel: %s"
msgid "Transfer successful."
-msgstr ""
+msgstr "Übertragung erfolgreich."
msgid "Transfer failed."
-msgstr ""
+msgstr "Die Übertragung ist fehlgeschlagen."
msgid "Could not connect to Compilatio's SOAP server."
-msgstr ""
+msgstr "Konnte keine Verbindung zum SOAP-Server von Compilatio herstellen."
msgid "Check your key, your server ports and possibly your proxy settings."
msgstr ""
+"Überprüfen Sie Ihren Schlüssel, Ihre Serverports und möglicherweise Ihre "
+"Proxy-Einstellungen."
msgid "Last visited course"
-msgstr ""
+msgstr "Zuletzt besuchter Kurs"
msgid "You haven't visited any courses yet, here is the list of your courses."
-msgstr ""
+msgstr "Sie haben noch keine Kurse besucht, hier ist die Liste Ihrer Kurse."
msgid "No organization"
-msgstr ""
+msgstr "Keine Organisation"
msgid "User by organization"
-msgstr ""
+msgstr "Benutzer nach Organisation"
msgid "Learning path by author"
-msgstr ""
+msgstr "Lernpfad vom Autor"
msgid "Import assignments from base course"
-msgstr ""
+msgstr "Aufgaben aus dem Basiskurs importieren"
msgid "Redirect to the platform home page"
-msgstr ""
+msgstr "Weiterleitung zur Startseite der Plattform"
msgid "My learning paths"
-msgstr ""
+msgstr "Meine Lernpfade"
msgid "Last visited learning path"
-msgstr ""
+msgstr "Zuletzt besuchter Lernpfad"
msgid "You haven't visited any learning paths yet, here is the list of your learning paths."
msgstr ""
+"Sie haben noch keine Lernpfade besucht, hier ist die Liste Ihrer Lernpfade."
msgid "This course is used in at least one other portal"
-msgstr ""
+msgstr "Dieser Kurs wird in mindestens einem anderen Portal verwendet"
msgid "Add classes to a learning path"
-msgstr ""
+msgstr "Lernpfad um Klassen ergänzen"
msgid "Replace file"
-msgstr ""
+msgstr "Datei ersetzen"
msgid "Subscribe classes to category"
-msgstr ""
+msgstr "Klassen zu Kategorien hinzufügen"
msgid "Export response report"
-msgstr ""
+msgstr "Antwortbericht exportieren"
msgid "Response report"
-msgstr ""
+msgstr "Antwortbericht"
msgid "Results only available online"
-msgstr ""
+msgstr "Ergebnisse nur online verfügbar"
msgid "Question stats"
-msgstr ""
+msgstr "Fragenstatistik"
msgid "Wrong answer"
-msgstr ""
+msgstr "Falsche Antwort"
msgid "Failure on attempt %s at %s"
-msgstr ""
+msgstr "Fehler beim Versuch %s um %s"
msgid "Validation of exercise at %s"
-msgstr ""
+msgstr "Überprüfung der Übung um %s"
msgid "You finished the questions related to this question category, it's your last chance to go back and revise those questions. Once you click on follow exercise you will go to the next question category and will not be able to go back to this part of the test."
msgstr ""
+"Sie haben die Fragen zu dieser Kategorie abgeschlossen. Dies ist Ihre letzte "
+"Chance, zurückzugehen und die Fragen zu überprüfen. Sobald Sie auf Übung "
+"fortsetzen klicken, gelangen Sie zur nächsten Kategorie und können nicht "
+"mehr zu diesem Teil des Tests zurückkehren."
msgid "Remaining time to finish exercise"
-msgstr ""
+msgstr "Verbleibende Zeit, um die Übung zu beenden"
msgid "Remaining time to finish question"
-msgstr ""
+msgstr "Verbleibende Zeit, um die Frage zu beenden"
msgid "Detailed questions stats"
-msgstr ""
+msgstr "Detaillierte Statistiken zu Fragen"
msgid "A short presentation of yourself, your professional or personal experiences and beliefs."
msgstr ""
+"Eine kurze Vorstellung Ihrer Person, Ihrer beruflichen oder persönlichen "
+"Erfahrungen und Überzeugungen."
msgid "The skills you have acquired, formally or non-formally, social or technical."
msgstr ""
+"Die Fähigkeiten, die Sie formell oder informell, sozial oder technisch "
+"erworben haben."
msgid "The relevant diplomas and certificates you have obtained and you are proud of. You should specify at a minimum the title that appears on the document, the organization and the year."
msgstr ""
+"Die relevanten Diplome und Zertifikate, die Sie erworben haben und auf die "
+"Sie stolz sind. Sie sollten mindestens den Titel, der auf dem Dokument "
+"erscheint, die Organisation und das Jahr angeben."
msgid "Given your experience and skills, you can usually teach in the fields where your skills are at the highest level. If you feel you could indeed teach someone else in some specific field, mention it here. Otherwise leave empty."
msgstr ""
+"Angesichts Ihrer Erfahrung und Fähigkeiten können Sie normalerweise in den "
+"Bereichen unterrichten, in denen Ihre Fähigkeiten am höchsten sind. Wenn Sie "
+"glauben, dass Sie tatsächlich jemand anderen in einem bestimmten Bereich "
+"unterrichten könnten, erwähnen Sie es hier. Andernfalls lassen Sie es leer."
msgid "User guides"
-msgstr ""
+msgstr "Benutzerhandbücher"
msgid "You have written a paper that you can share, or want to attach your CV for download? Add those here."
msgstr ""
+"Sie haben eine Arbeit verfasst, die Sie teilen möchten, oder wollen Ihren "
+"Lebenslauf zum Herunterladen anhängen? Fügen Sie diese hier hinzu."
msgid "Correct attempts"
-msgstr ""
+msgstr "Korrekte Versuche"
msgid "Incorrect attempts"
-msgstr ""
+msgstr "Falsche Versuche"
msgid "Students with correct answers"
-msgstr ""
+msgstr "Lernende mit richtigen Antworten"
msgid "Students with incorrect answers"
-msgstr ""
+msgstr "Lernende mit falschen Antworten"
msgid "List of contents"
-msgstr ""
+msgstr "Inhaltsverzeichnis"
msgid "Tariff"
-msgstr ""
+msgstr "Tarif"
msgid "To invoice"
-msgstr ""
+msgstr "In Rechnung stellen"
msgid "LP item by author"
-msgstr ""
+msgstr "Lernpfad-Element pro Autor"
msgid "Delete also the exercise attempts. If not check then the exercise results will still be available in the exercise tool."
msgstr ""
+"Löschen Sie auch die Versuchsdaten der Übungen. Wenn nicht markiert, bleiben "
+"die Ergebnisse der Übungen im Übungstool verfügbar."
msgid "Only show a radar of scores by category, instead of a table of categories. Do not show individual scores or feedback."
msgstr ""
+"Zeigen Sie nur ein Radar der Punktzahlen nach Kategorie an, anstatt einer "
+"Tabelle der Kategorien. Einzelne Punktzahlen oder Rückmeldungen sollen nicht "
+"angezeigt werden."
msgid "All attempts blocked because you did not reach the minimum score of %s %% at one of your attempts."
msgstr ""
msgid "Authors that have been registered :"
-msgstr ""
+msgstr "Autoren, die registriert wurden :"
msgid "Price"
-msgstr ""
+msgstr "Preis"
msgid "Price updated"
-msgstr ""
+msgstr "Preis aktualisiert"
msgid "Remove selected authors"
-msgstr ""
+msgstr "Ausgewählte Autoren entfernen"
msgid "Authors have been removed"
-msgstr ""
+msgstr "Autoren wurden entfernt"
msgid "Hide category table"
-msgstr ""
+msgstr "Kategorie-Tabelle ausblenden"
msgid "Only %d questions will be selected based on the test configuration, for a total score of %s."
msgstr ""
+"Nur %d Fragen werden basierend auf der Testkonfiguration ausgewählt, für "
+"eine Gesamtpunktzahl von %s."
msgid "This question is also used in the following tests"
-msgstr ""
+msgstr "Diese Frage wird auch in den folgenden Tests verwendet"
msgid "Link to test edition"
-msgstr ""
+msgstr "Link zur Testbearbeitung"
msgid "Move users results from base course to a session"
-msgstr ""
+msgstr "Verschieben Sie Benutzerergebnisse vom Basiskurs zum eine Session"
+#, fuzzy
msgid "If your quiz have hotspot questions included, you should select the images related from the documents."
msgstr ""
+"Wenn Ihr Quiz Hotspot-Fragen enthält, sollten Sie die zugehörigen Bilder aus "
+"den Dokumenten auswählen."
msgid "Back to the attempt list"
msgstr "Zurück zur Versuchsliste"
msgid "Show the result to the learner: Show the score, the learner's choice and his feedback on each attempt, add the correct answer and his feedback when the chosen limit of attempts is reached."
msgstr ""
+"Zeigen Sie dem Lernenden das Ergebnis: Zeigen Sie die Punktzahl, die Auswahl "
+"des Lernenden und sein Feedback bei jedem Versuch, fügen Sie die richtige "
+"Antwort und sein Feedback hinzu, wenn das festgelegte Limit an Versuchen "
+"erreicht ist."
msgid "Signed in as"
msgstr "Eingeloggt als"
@@ -25325,3 +25482,111 @@ msgstr ""
"Diese Frage wird in anderen Übungen verwendet. Wenn Sie ihre Bearbeitung "
"fortsetzen, werden die Änderungen alle Übungen beeinflussen, die diese Frage "
"enthalten."
+
+msgid "You don't have any course yet."
+msgstr "Sie haben noch keinen Kurs."
+
+msgid "By checking this box, I confirm that I accept the data processing by the platform"
+msgstr ""
+"Indem ich dieses Kästchen ankreuze, bestätige ich, dass ich die "
+"Datenverarbeitung durch die Plattform akzeptiere"
+
+msgid "The platform owner, responsible for the processing, implements processing of personal data to respond to your contact request. The data is mandatory. In their absence, it will not be possible to process your request."
+msgstr ""
+"Der Plattformbetreiber, verantwortlich für die Datenverarbeitung, setzt die "
+"Verarbeitung personenbezogener Daten um, um auf Ihre Kontaktanfrage zu "
+"antworten. Die Angabe der Daten ist verpflichtend. Ohne diese ist eine "
+"Bearbeitung Ihrer Anfrage nicht möglich."
+
+msgid "You don't have any session yet."
+msgstr "Sie haben noch keine Session."
+
+msgid "Past session tab"
+msgstr "Vergangen"
+
+msgid "All attempts blocked because you did not reach the minimum score of %s % at one of your attempts."
+msgstr ""
+"Alle Versuche wurden blockiert, da Sie nicht die Mindestpunktzahl von %s % "
+"bei einem Ihrer Versuche erreicht haben."
+
+msgid "Add a forumCategory"
+msgstr "Eine Forumskategorie hinzufügen"
+
+msgid "Send diagnostic finalization message"
+msgstr "Senden Sie die Abschlussnachricht zur Diagnose"
+
+msgid "Hide question numbering"
+msgstr "Fragennummerierung ausblenden"
+
+msgid "Welcome, please go to diagnostic at %s."
+msgstr "Willkommen, bitte gehen Sie zum Diagnosetest unter %s."
+
+msgid "Add a course introduction to display to your students."
+msgstr "Fügen Sie eine Kurseinführung hinzu, um Ihren Lernenden zu zeigen."
+
+msgid "DiagnosticfinalizationmessageContent"
+msgstr ""
+"Hallo %s, ich bin %s und überprüfe Ihre Diagnose, um den Kurs festzulegen, "
+"den Sie belegen werden."
+
+msgid "Prevent moving backwards between questions"
+msgstr "Verhindern Sie das Zurückgehen zwischen den Fragen"
+
+msgid "You don't have any course content yet."
+msgstr "Sie haben noch keine Kursinhalte."
+
+msgid "Go to \"Explore\" to find a topic of interest, or wait for someone to subscribe you."
+msgstr ""
+"Gehen Sie zu 'Entdecken', um ein Thema von Interesse zu finden, oder warten "
+"Sie, bis jemand Sie abonniert."
+
+msgid "See as student"
+msgstr "Als Lernender ansehen"
+
+msgid "Current session tab"
+msgstr "Aktuell"
+
+msgid "Text appearing at the end of the test when the user has succeeded or if no pass percentage was set."
+msgstr ""
+"Text, der am Ende des Tests erscheint, wenn der Benutzer erfolgreich war "
+"oder wenn kein Bestehensprozentsatz festgelegt wurde."
+
+msgid "Direct pop-up mode"
+msgstr "Direkter Popup-Modus"
+
+msgid "Number of times the question was answered"
+msgstr "Anzahl der beantworteten Fragen"
+
+msgid "DiagnosticfinalizationmessageTitle"
+msgstr "Diagnoseabschluss"
+
+msgid "Show score by category on a radar/spiderweb chart"
+msgstr "Zeige Punktzahl nach Kategorie in einem Radar-/Netzdiagramm"
+
+msgid "Official code"
+msgstr "Offizieller Code"
+
+msgid "Number of times this answer was selected"
+msgstr "Anzahl der Auswahl dieser Antwort"
+
+msgid "Sticky courses"
+msgstr "Spezialkurse"
+
+msgid "Course introduction"
+msgstr "Kurseinführung"
+
+msgid "Upcoming session tab"
+msgstr "Bevorstehend"
+
+msgid "Back to tests list"
+msgstr "Zurück zur Testliste"
+
+msgid "Text appearing at the end of the test when the user has failed."
+msgstr ""
+"Text, der am Ende des Tests erscheint, wenn der Benutzer nicht bestanden hat."
+
+msgid "Your session search diagnosis is saved"
+msgstr "Ihre Session-Suchdiagnose ist gespeichert"
+
+msgid "Create surveyDoodle"
+msgstr "Erstellen Sie eine Doodle-Umfrage"
From b63efa11ce7f22f503ff46d0e364789c73492da8 Mon Sep 17 00:00:00 2001
From: Yannick Warnier
Date: Tue, 7 May 2024 19:33:32 +0200
Subject: [PATCH 170/413] Language: Update language terms
---
translations/messages.de.po | 329 +++++++++++++++++++++++-------------
1 file changed, 208 insertions(+), 121 deletions(-)
diff --git a/translations/messages.de.po b/translations/messages.de.po
index f10b4281af0..61824f34f2b 100644
--- a/translations/messages.de.po
+++ b/translations/messages.de.po
@@ -1,7 +1,7 @@
msgid ""
msgstr ""
"Project-Id-Version: chamilo\n"
-"PO-Revision-Date: 2024-05-07 17:02+0000\n"
+"PO-Revision-Date: 2024-05-07 17:32+0000\n"
"Last-Translator: Yannick Warnier \n"
"Language-Team: German \n"
@@ -22482,40 +22482,42 @@ msgstr ""
"ursprüngliche SCORM-Datei hat."
msgid "You need to create a skill profile"
-msgstr ""
+msgstr "Sie müssen ein Kompetenzprofil erstellen"
msgid "Skill level"
-msgstr ""
+msgstr "Kompetenzniveau"
msgid "Add item to portfolio"
-msgstr ""
+msgstr "Element zum Portfolio hinzufügen"
msgid "New document added to course %s"
-msgstr ""
+msgstr "Neues Dokument zum Kurs %s hinzugefügt"
msgid "A new document %s has been added to the document tool in your course %s by %s."
msgstr ""
+"Ein neues Dokument %s wurde von %s im Dokumenten-Tool Ihres Kurses %s "
+"hinzugefügt."
msgid "Pending surveys"
-msgstr ""
+msgstr "Ausstehende Umfragen"
msgid "No pending surveys"
-msgstr ""
+msgstr "Keine ausstehenden Umfragen"
msgid "Most popular sessions"
-msgstr ""
+msgstr "Beliebteste Sessions"
msgid "Item can be viewed - Prerequisites completed"
-msgstr ""
+msgstr "Element kann angesehen werden - Voraussetzungen abgeschlossen"
msgid "Item %s blocks this step"
-msgstr ""
+msgstr "Element %s blockiert diesen Schritt"
msgid "Your result at %s blocks this step"
-msgstr ""
+msgstr "Ihr Ergebnis bei %s blockiert diesen Schritt"
msgid "What do you want to do?"
-msgstr ""
+msgstr "Was möchten Sie tun?"
msgid "Follow courses"
msgstr "Belegen Sie Kurse"
@@ -23094,6 +23096,8 @@ msgstr "Die Ankündigung wird gesendet an"
msgid "You need attach a audio file according to the text, clicking on the %s icon."
msgstr ""
+"Sie müssen eine Audiodatei entsprechend dem Text anhängen, indem Sie auf das "
+"%s-Symbol klicken."
msgid "Create read-out text"
msgstr "Erstellen Sie Vorlesetext"
@@ -24470,373 +24474,410 @@ msgid "Email reply header"
msgstr "Am %s schrieb %s (%s):"
msgid "Latest login in a course"
-msgstr ""
+msgstr "Letzter Login in einem Kurs"
msgid "The"
msgstr ""
msgid "Multiplicate questions by class"
-msgstr ""
+msgstr "Fragen nach Klasse vervielfachen"
msgid "Multiplicate questions by user"
-msgstr ""
+msgstr "Fragen vervielfachen pro Benutzer"
msgid "Questions about next user"
-msgstr ""
+msgstr "Fragen zum nächsten Benutzer"
msgid "Course code to be entered in capital letters to confirm the deletion: %s"
msgstr ""
+"Geben Sie den Kurscode in Großbuchstaben ein, um die Löschung zu bestätigen: "
+"%s"
msgid "Badge: %s"
-msgstr ""
+msgstr "Abzeichen: %s"
msgid "Comment by %s"
-msgstr ""
+msgstr "Kommentar von %s"
msgid "Portfolio item by %s"
-msgstr ""
+msgstr "Portfolio-Element von %s"
msgid "Copy to my portfolio"
-msgstr ""
+msgstr "In mein Portfolio kopieren"
msgid "Copy to student portfolio"
-msgstr ""
+msgstr "In das Portfolio des Lernenden kopieren"
msgid "Originally published as \"%s\" by %s"
-msgstr ""
+msgstr "Ursprünglich veröffentlicht als '%s' von %s"
msgid "Originally commented by %s in \"%s\""
-msgstr ""
+msgstr "Ursprünglich kommentiert von %s in '%s'"
msgid "Item added to students own portfolio"
-msgstr ""
+msgstr "Element zum Portfolio des Lernenden hinzugefügt"
msgid "Mark comment as important"
-msgstr ""
+msgstr "Kommentar als wichtig markieren"
msgid "Unmark comment as important"
-msgstr ""
+msgstr "Kommentar als nicht wichtig markieren"
msgid "Portfolio item marked as important"
-msgstr ""
+msgstr "Portfolioelement als wichtig markiert"
msgid "Select a learner portfolio"
-msgstr ""
+msgstr "Wählen Sie ein Lernendenportfolio"
msgid "See my portfolio in this course"
-msgstr ""
+msgstr "Mein Portfolio in diesem Kurs sehen"
msgid "Portfolio details"
-msgstr ""
+msgstr "Portfolio-Details"
msgid "Item title"
-msgstr ""
+msgstr "Elementbezeichnung"
msgid "Creation date: %s"
-msgstr ""
+msgstr "Erstellungsdatum: %s"
msgid "Update date: %s"
-msgstr ""
+msgstr "Aktualisierungsdatum: %s"
msgid "Category: %s"
-msgstr ""
+msgstr "Kategorie: %s"
msgid "Date: %s"
-msgstr ""
+msgstr "Datum: %s"
msgid "Item title: %s"
-msgstr ""
+msgstr "Elementbezeichnung: %s"
msgid "No items in your portfolio"
-msgstr ""
+msgstr "Keine Elemente in Ihrem Portfolio"
msgid "You have not commented"
-msgstr ""
+msgstr "Sie haben keinen Kommentar hinterlassen"
msgid "Portfolio items"
-msgstr ""
+msgstr "Portfolio-Elemente"
msgid "Portfolio comments"
-msgstr ""
+msgstr "Portfolio-Kommentare"
msgid "Comments made"
-msgstr ""
+msgstr "Kommentare abgegeben"
msgid "Grade this item"
-msgstr ""
+msgstr "Bewerten Sie diesen Element"
msgid "Portfolio item was graded"
-msgstr ""
+msgstr "Portfolio-Element wurde bewertet"
+#, fuzzy
msgid "Context for the comment to be grade"
-msgstr ""
+msgstr "Kontext für den zu bewertenden Kommentar"
msgid "Grade this comment"
-msgstr ""
+msgstr "Bewerten Sie diesen Kommentar"
msgid "Portfolio comment was graded"
-msgstr ""
+msgstr "Der Portfolio-Kommentar wurde bewertet"
msgid "Grade items"
-msgstr ""
+msgstr "Elemente bewerten"
msgid "Grade comments"
-msgstr ""
+msgstr "Kommentare bewerten"
msgid "Hide correct answered questions"
-msgstr ""
+msgstr "Ausgeblendete richtig beantwortete Fragen"
msgid "The setting \"%s\" will change to \"%s\""
-msgstr ""
+msgstr "Die Einstellung '%s' wird auf '%s' geändert"
msgid "Verification of answered questions"
-msgstr ""
+msgstr "Überprüfung beantworteter Fragen"
msgid "Student's assignments to be corrected"
-msgstr ""
+msgstr "Lernenden-Aufgaben zur Korrektur"
msgid "You will find below all the work that have been submitted by students in one of your course (it could be in the base course or in a course in a session). You can filter the list selecting a specific course or a work status."
msgstr ""
+"Sie finden unten alle Arbeiten, die von Lernenden in einem Ihrer Kurse "
+"eingereicht wurden (es kann sich um den Basiskurs oder um einen Kurs in "
+"einer Session handeln). Sie können die Liste filtern, indem Sie einen "
+"bestimmten Kurs oder einen Arbeitsstatus auswählen."
msgid "Back to the main course portfolio"
-msgstr ""
+msgstr "Zurück zum Hauptkursportfolio"
msgid "Export my portfolio data in a PDF file"
-msgstr ""
+msgstr "Exportieren Sie meine Portfoliodaten in eine PDF-Datei"
msgid "Export my portfolio data in a ZIP file"
-msgstr ""
+msgstr "Exportieren Sie meine Portfoliodaten in einer ZIP-Datei"
msgid "Categories are for organization only in personal portfolio."
-msgstr ""
+msgstr "Kategorien sein nur vor im persönlichen Portfolio organizieren."
msgid "Export my portfolio data to a PDF file"
-msgstr ""
+msgstr "Exportieren Sie meine Portfolio-Daten in eine PDF-Datei"
msgid "Export my portfolio data to a ZIP file"
-msgstr ""
+msgstr "Exportieren Sie meine Portfoliodaten in eine ZIP-Datei"
msgid "New learning path available"
-msgstr ""
+msgstr "Neuer Lernpfad verfügbar"
msgid "There is a new learning path called %s that has been added to your %s course. Go to this learning path here : %s"
msgstr ""
+"Es wurde ein neuer Lernpfad namens %s zu Ihrem %s Kurs hinzugefügt. Gehen "
+"Sie hier zu diesem Lernpfad: %s"
msgid "%s %% Completed"
-msgstr ""
+msgstr "%s %% abgeschlossen"
msgid "E-mail to teachers on new user's post in the portfolio tool"
-msgstr ""
+msgstr "E-Mail an Trainer über einen neuen Beitrag im Portfolio-Tool"
msgid "There is a new post by %s in the portfolio of course %s. To view it go here."
msgstr ""
+"Es gibt einen neuen Beitrag von %s im Portfolio des Kurses %s. Um ihn "
+"anzusehen klicken Sie hier."
msgid "[Portfolio] New post in course %s"
-msgstr ""
+msgstr "[Portfolio] Neuer Beitrag im Kurs %s"
msgid "Ongoing training"
-msgstr ""
+msgstr "Laufende Schulung"
msgid "Dear %s,
als sein/ihr Erziehungsberechtigter erhalten "
+"Sie diese E-Mail, um Sie darüber zu informieren, dass %s gerade eine neue "
+"Klassenarbeit/Kurztest %s im Kurs %s erhalten hat.
Lernender: "
+"%s Kurs: %s Name der Klassenarbeit/des Kurztests: %s "
msgid "Test duration: %s "
-msgstr ""
+msgstr "Testdauer: %s "
msgid "Test start date: %s "
-msgstr ""
+msgstr "Prüfungsbeginn: %s "
msgid "Test end date: %s "
-msgstr ""
+msgstr "Prüfungsbeginn: %s "
msgid "Career Diagram Legend"
-msgstr ""
+msgstr "Legende zum Karrierediagramm"
msgid "Career Diagram Disclaimer"
-msgstr ""
+msgstr "Karriere-Diagramm Haftungsausschluss"
msgid "Successful Attempt"
-msgstr ""
+msgstr "Erfolgreicher Versuch"
msgid "Failed attempt"
-msgstr ""
+msgstr "Fehlgeschlagener Versuch"
msgid "Students with successful attempt"
-msgstr ""
+msgstr "Lernende mit erfolgreichem Versuch"
msgid "Students with failed attempt"
-msgstr ""
+msgstr "Lernende mit nicht bestandenem Versuch"
msgid "Exercise attempt stats report"
-msgstr ""
+msgstr "Statistikbericht zu Übungsversuchen"
msgid "Comparative group report"
-msgstr ""
+msgstr "Vergleichsgruppenbericht"
msgid "Courses usage"
-msgstr ""
+msgstr "Kursnutzung"
msgid "Hide connection time"
-msgstr ""
+msgstr "Verbindungsdauer ausblenden"
msgid "Course in which the question was initially created."
-msgstr ""
+msgstr "Kurs, in dem die Frage ursprünglich erstellt wurde."
msgid "Apprenticeship contract"
-msgstr ""
+msgstr "Ausbildungsvertrag"
msgid "Export Common Cartridge v1.3"
-msgstr ""
+msgstr "Exportieren zum Common Cartridge v1.3"
msgid "Import Common Cartridge v1.3"
-msgstr ""
+msgstr "Importieren von Common Cartridge v1.3"
msgid "Export your course content in the IMS Common Cartridge 1.3 format, to share it on other platforms."
msgstr ""
+"Exportieren Sie Ihre Kursinhalte im IMS Common Cartridge 1.3-Format, um sie "
+"auf anderen Plattformen zu teilen."
msgid "Import a course in IMS Common Cartridge 1.3 format, from another platform compatible with this format. The version is important."
msgstr ""
+"Einen Kurs im IMS Common Cartridge 1.3-Format von einer anderen Plattform, "
+"die mit diesem Format kompatibel ist, importieren. Die Version ist wichtig."
msgid "IMS CC file created."
-msgstr ""
+msgstr "IMS CC-Datei erstellt."
msgid "IMS CC file"
-msgstr ""
+msgstr "IMS CC-Datei"
msgid "IMS CC file imported."
-msgstr ""
+msgstr "IMS CC-Datei importiert."
msgid "Upload any IMS CC (.imscc or .zip) file in the right version and it will be extracted directly into your course."
msgstr ""
+"Laden Sie eine IMS CC-Datei (.imscc oder .zip) in der richtigen Version "
+"hoch, und sie wird direkt in Ihren Kurs extrahiert."
msgid "IMS Common Cartridge v1.3"
-msgstr ""
+msgstr "IMS Common Cartridge v1.3"
msgid "Hide question number"
-msgstr ""
+msgstr "Frage Nummer ausblenden"
msgid "Pending attempts"
-msgstr ""
+msgstr "Ausstehende Versuche"
msgid "Edit in profile"
-msgstr ""
+msgstr "Profil bearbeiten"
msgid "Guidance"
-msgstr ""
+msgstr "Anleitung"
msgid "Remove time"
-msgstr ""
+msgstr "Zeit entfernen"
msgid "Copy with session content"
-msgstr ""
+msgstr "Kopieren mit Session-Inhalten"
msgid "Export by class"
-msgstr ""
+msgstr "Exportieren nach Klasse"
msgid "Upload answer"
-msgstr ""
+msgstr "Antwort hochladen"
msgid "Token expired, action already realized"
-msgstr ""
+msgstr "Token abgelaufen, Aktion bereits durchgeführt"
msgid "Corrector"
-msgstr ""
+msgstr "Korrektor"
msgid "Correction date"
-msgstr ""
+msgstr "Korrekturdatum"
msgid "Hide attempts table on start page"
-msgstr ""
+msgstr "Versuche-Tabelle auf der Startseite ausblenden"
msgid "Maximum progress in learning paths"
-msgstr ""
+msgstr "Maximaler Fortschritt in Lernpfaden"
msgid "Hide skills"
-msgstr ""
+msgstr "Fähigkeiten ausblenden"
msgid "Options for hiding in export"
-msgstr ""
+msgstr "Optionen zum Ausblenden beim Export"
msgid "Hide assignments"
-msgstr ""
+msgstr "Aufgaben ausblenden"
msgid "Add survey to course"
-msgstr ""
+msgstr "Umfrage zum Kurs hinzufügen"
msgid "Move the current survey"
-msgstr ""
+msgstr "Verschieben Sie die aktuelle Umfrage"
msgid "Share events in course sessions"
-msgstr ""
+msgstr "Teilen Sie Ereignisse in Kurs-Sessionen"
msgid "Agenda events in the course will be visible in sessions"
-msgstr ""
+msgstr "Termine im Kurs werden in Sessions sichtbar sein"
msgid "Agenda events only visible in current course"
-msgstr ""
+msgstr "Agendaereignisse nur im aktuellen Kurs sichtbar"
msgid "Test result"
-msgstr ""
+msgstr "Testergebnis"
msgid "Filter by Learning Path"
-msgstr ""
+msgstr "Filtern nach Lernpfad"
msgid "Share forums in all sessions"
-msgstr ""
+msgstr "Foren in allen Sessions teilen"
msgid "You have achieved a new skill."
-msgstr ""
+msgstr "Sie haben eine neue Fähigkeit erlangt."
msgid "Hi, %s. You have achieved the skill \"%s\". To see the details go here: %s."
msgstr ""
+"Hallo, %s. Sie haben die Fähigkeit '%s' erworben. Um die Details zu sehen, "
+"gehen Sie hier: %s."
msgid "To assign a new skill to this user, click here"
msgstr ""
+"Um dieser Person eine neue Fähigkeit zuzuweisen, klicken Sie hier"
msgid "Add event in course calendar"
-msgstr ""
+msgstr "Ereignis im Kurskalender hinzufügen"
msgid "Hours"
-msgstr ""
+msgstr "Stunden"
msgid "Reminder for event : %s"
-msgstr ""
+msgstr "Erinnerung für Veranstaltung: %s"
msgid "Add notification"
-msgstr ""
+msgstr "Benachrichtigung hinzufügen"
msgid "Notification to remind the event"
-msgstr ""
+msgstr "Benachrichtigung zur Erinnerung an das Ereignis"
msgid "Add tags"
-msgstr ""
+msgstr "Tags hinzufügen"
msgid "Event editable by the invitees"
-msgstr ""
+msgstr "Ereignis kann von den Eingeladenen bearbeitet werden"
msgid "Invitees"
-msgstr ""
+msgstr "Eingeladene"
msgid "Reminder number %s for the course %s"
-msgstr ""
+msgstr "Erinnerung Nummer %s für den Kurs %s"
msgid "Hello %s"
-msgstr ""
+msgstr "Hallo %s"
msgid "You are registered in the training %s since the %s"
-msgstr ""
+msgstr "Sie sind seit dem %s für das Training %s angemeldet"
msgid "You are receiving this message because you have completed a learning path with a %s% progress of your training. Your progress must be 100 to consider that your training was carried out. If you have the slightest problem, you should contact with your trainer."
msgstr ""
+"Sie erhalten diese Nachricht, weil Sie einen Lernpfad mit einem Fortschritt "
+"von %s% Ihrer Schulung abgeschlossen haben. Ihr Fortschritt muss 100 "
+"betragen, um zu bestätigen, dass Ihre Schulung durchgeführt wurde. Bei "
+"dem geringsten Problem sollten Sie sich an Ihren Trainer wenden."
msgid "As a reminder, to access the training platform: 1. Connect to the platform at the address: %s 2. Then enter: Your username: %s Your password: This was emailed to you. if you forgot it and can't find it, you can retrieve it by going to %s
Thank you for doing what is necessary."
msgstr ""
+"Als Erinnerung, um auf die Trainingsplattform zuzugreifen: 1. Verbinden "
+"Sie sich mit der Plattform unter der Adresse: %s 2. Geben Sie dann ein: "
+" Ihr Benutzername: %s Ihr Passwort: Dies wurde Ihnen per E-Mail "
+"zugeschickt. Wenn Sie es vergessen haben und nicht finden können, können "
+"Sie es abrufen, indem Sie zu %s gehen
Vielen Dank, dass Sie das "
+"Notwendige veranlassen."
msgid "The training center
User %s sent a follow up message about student %s.
The message can be seen here %s"
+msgstr "Hallo,
Benutzer %s hat eine Follow-up-Nachricht zum Lernenden %s gesendet.
Die Nachricht ist an %s sichtbar"
msgid "Include services"
msgstr "Einschließlich Dienstleistungen"
diff --git a/translations/messages.en.po b/translations/messages.en.po
index 6fff3807f02..88c28884615 100644
--- a/translations/messages.en.po
+++ b/translations/messages.en.po
@@ -22487,8 +22487,8 @@ msgstr "Posted deadline for sending the work (Visible to the learner)"
msgid "Follow up message about student %s"
msgstr "Follow up message about student %s"
-msgid "Hi,
"
-msgstr "Hi,
"
+msgid "Hi,
User %s sent a follow up message about student %s.
The message can be seen here %s"
+msgstr "Hi,
User %s sent a follow up message about student %s.
The message can be seen here %s"
msgid "Include services"
msgstr "Include services"
diff --git a/translations/messages.es.po b/translations/messages.es.po
index 80b2b93b3af..710fb9a7e85 100644
--- a/translations/messages.es.po
+++ b/translations/messages.es.po
@@ -22515,8 +22515,8 @@ msgstr "Fecha límite publicada para enviar el trabajo (visible para el alumno)"
msgid "Follow up message about student %s"
msgstr "Mensaje de seguimiento sobre alumno %s"
-msgid "Hi,
"
-msgstr "Hola,
"
+msgid "Hi,
User %s sent a follow up message about student %s.
The message can be seen here %s"
+msgstr "Hola,
El usuario %s ha enviado un mensaje de seguimiento sobre el alumno %s.
El mensaje se puede ver en %s"
msgid "Include services"
msgstr "Incluir los servicios"
@@ -25276,7 +25276,6 @@ msgstr "Recordarme"
msgid "My Skills"
msgstr "Mis competencias"
-#, fuzzy
msgid "Text appearing at the end of the test when the user has failed."
msgstr "Texto que aparece al final del examen cuando el usuario no ha aprobado."
@@ -25287,8 +25286,7 @@ msgid "Learn more about Chamilo and its use, official references links"
msgstr "Aprenda más sobre Chamilo y su uso, enlaces a referencias oficiales"
msgid "Manage the skills of your users, through courses and badges"
-msgstr ""
-"Gestione las habilidades de sus usuarios, a través de cursos y distintivos"
+msgstr "Gestione las habilidades de sus usuarios, a través de cursos y distintivos"
msgid "Signed in as"
msgstr "Conectado como"
@@ -25308,13 +25306,11 @@ msgstr ""
"Otros usuarios no podrán verlos."
msgid "Select 'Yes' to remove the button to delete all announcements, as this can be used by mistake by teachers."
-msgstr ""
-"Seleccione 'Sí' para eliminar el botón de borrar todos los anuncios, ya que "
+msgstr "Seleccione 'Sí' para eliminar el botón de borrar todos los anuncios, ya que "
"los formadores pueden usarlo por error."
msgid "This gives the HRM a little more power by allowing them to edit/delete agenda events in the course-session."
-msgstr ""
-"Esto otorga al responable RRHH un poco más de poder al permitirle editar/"
+msgstr "Esto otorga al responable RRHH un poco más de poder al permitirle editar/"
"eliminar eventos de la agenda en la sesión del curso."
msgid "Default calendar display mode"
diff --git a/translations/messages.fr.po b/translations/messages.fr.po
index 0ea08195979..49c1e6904b9 100644
--- a/translations/messages.fr.po
+++ b/translations/messages.fr.po
@@ -23138,8 +23138,8 @@ msgstr "Date limite affichée d'envoi du travail (visible par l'apprenant)"
msgid "Follow up message about student %s"
msgstr "Message de suivi concernant l'apprenant %s"
-msgid "Hi,
"
-msgstr "Bonjour,
"
+msgid "Hi,
User %s sent a follow up message about student %s.
The message can be seen here %s"
+msgstr "Bonjour,
L'utilisateur %s a envoyé un message de suivi concernant l'apprenant %s.
Le message est visible sur %s"
msgid "Include services"
msgstr "Inclure les services"
diff --git a/translations/messages.pot b/translations/messages.pot
index 6e500021e3c..81872ae7995 100644
--- a/translations/messages.pot
+++ b/translations/messages.pot
@@ -22480,7 +22480,7 @@ msgstr ""
msgid "Follow up message about student %s"
msgstr ""
-msgid "Hi,
"
+msgid "Hi,
User %s sent a follow up message about student %s.
The message can be seen here %s"
msgstr ""
msgid "Include services"
From 29ac1aa9916796fe9dccc97c6e8fdab87d89b99f Mon Sep 17 00:00:00 2001
From: NicoDucou
Date: Fri, 10 May 2024 10:58:35 +0200
Subject: [PATCH 184/413] Tracking: Language: Fix sutdent's boss information to
use translation - refs BT#21660
---
public/main/template/default/my_space/user_details.html.twig | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/public/main/template/default/my_space/user_details.html.twig b/public/main/template/default/my_space/user_details.html.twig
index 6621da40017..964dc2b5ed0 100644
--- a/public/main/template/default/my_space/user_details.html.twig
+++ b/public/main/template/default/my_space/user_details.html.twig
@@ -19,7 +19,7 @@
{{ display.reporting_user_details(user) }}
{% if user_extra.boss_list %}
-
Trainer: %s"
msgid "Get embedable link"
msgstr "Einbettbaren Link erhalten"
@@ -24926,39 +24926,44 @@ msgstr "Erlauben Sie die Zuweisung von Fähigkeiten nach Unterkategorie"
msgid "It allows the acquisition of skills by sub categories independently."
msgstr ""
+"Es ermöglicht den Erwerb von Fähigkeiten nach Unterkategorien unabhängig "
+"voneinander."
msgid "Minimum score"
-msgstr ""
+msgstr "Mindestpunktzahl"
msgid "In LP"
-msgstr ""
+msgstr "Im LP"
msgid "Courses reports"
-msgstr ""
+msgstr "Kursberichte"
msgid "Fill blanks or form with global score"
msgstr ""
+"Füllen Sie die Lücken aus oder erstellen Sie ein Formular mit Gesamtpunktzahl"
msgid "Matching with global score"
-msgstr ""
+msgstr "Übereinstimmung mit globaler Punktzahl"
msgid "Image zones with global score"
-msgstr ""
+msgstr "Bildbereiche mit globaler Punktzahl"
msgid "Match by dragging with global score"
-msgstr ""
+msgstr "Übereinstimmung durch Ziehen mit globaler Punktzahl"
msgid "Progress in session report"
-msgstr ""
+msgstr "Fortschritt im Sessionbericht"
msgid "This question is shared with other exercises, are you sure you want to delete it?"
msgstr ""
+"Diese Frage wird auch in anderen Übungen verwendet, sind Sie sicher, dass "
+"Sie sie löschen möchten?"
msgid "View for tablet"
-msgstr ""
+msgstr "Ansicht für Tablet"
msgid "Disable signature"
-msgstr ""
+msgstr "Signatur deaktivieren"
msgid "Enable signature"
msgstr "Aktivieren Sie die Signatur"
@@ -25005,391 +25010,437 @@ msgid "Or select a CSV file with a list of answers"
msgstr "Oder wählen Sie eine CSV-Datei mit einer Liste von Antworten"
msgid "Convert to multiple answer dropdown"
-msgstr ""
+msgstr "Mehrfachauswahl-Dropdown"
msgid "Multiple answer dropdown"
-msgstr ""
+msgstr "Mehrfachantwort-Dropdown"
msgid "Highlighted"
-msgstr ""
+msgstr "Hervorgehoben"
msgid "See highlights"
-msgstr ""
+msgstr "Siehe Highlights"
msgid "%d added / %d required"
-msgstr ""
+msgstr "%d hinzugefügt / %d erforderlich"
msgid "Required number of items"
-msgstr ""
+msgstr "Erforderliche Anzahl von Elementen"
msgid "Required number of comments"
-msgstr ""
+msgstr "Erforderliche Anzahl an Kommentaren"
msgid "Unmark as highlighted"
-msgstr ""
+msgstr "Nicht mehr als hervorgehoben markieren"
msgid "Mark as highlighted"
-msgstr ""
+msgstr "Als markiert hervorheben"
msgid "Updated %s"
-msgstr ""
+msgstr "Aktualisiert %s"
msgid "Updated on %s by %s"
-msgstr ""
+msgstr "Aktualisiert am %s von %s"
msgid "Updated %s by %s"
-msgstr ""
+msgstr "Aktualisiert am %s von %s"
msgid "Marked as highlighted"
-msgstr ""
+msgstr "Markiert als hervorgehoben"
msgid "Unmarked as highlighted"
-msgstr ""
+msgstr "Nicht als hervorgehoben markiert"
msgid "Portfolio item set as a new template"
-msgstr ""
+msgstr "Portfolioelement als neue Vorlage festgelegt"
msgid "Portfolio item unset as template"
-msgstr ""
+msgstr "Portfolioelement als Vorlage aufgehoben"
msgid "Global multiple answer dropdown"
-msgstr ""
+msgstr "Globale Mehrfachantwort-Dropdownliste"
msgid "[Portfolio] New comment in post %s"
-msgstr ""
+msgstr "[Portfolio] Neuer Kommentar im Beitrag %s"
msgid "There is a new comment in the post %s from the %s course portfolio. To view it go here."
msgstr ""
+"Es gibt einen neuen Kommentar im Beitrag %s aus dem Kursportfolio "
+"%s. Um ihn anzusehen, klicken Sie hier."
msgid "Portfolio comment set as a new template"
-msgstr ""
+msgstr "Portfolio-Kommentar als neue Vorlage festgelegt"
msgid "Portfolio comment unset as template"
-msgstr ""
+msgstr "Portfolio-Kommentar als Vorlage entfernt"
msgid "Make visible for teachers"
-msgstr ""
+msgstr "Für Trainer sichtbar machen"
msgid "Email alert to Teachers and Student on new comment in Portfolio"
msgstr ""
+"E-Mail-Benachrichtigung an Trainer und Lernende über neuen Kommentar im "
+"Portfolio"
msgid "Tag"
-msgstr ""
+msgstr "Markierung"
msgid "Tag saved"
-msgstr ""
+msgstr "Markierung gespeichert"
msgid "Tag deleted"
-msgstr ""
+msgstr "Markierung gelöscht"
msgid "Comment by %s in %s"
-msgstr ""
+msgstr "Kommentar von %s in %s"
msgid "Portfolio tool introduction"
-msgstr ""
+msgstr "Einführung in das Portfolio-Tool"
msgid "Access through LTI to Learning Path"
-msgstr ""
+msgstr "Zugriff über LTI auf Lernpfad"
msgid "User %s has not been registered to course %s"
-msgstr ""
+msgstr "Benutzer %s wurde nicht für Kurs %s registriert"
msgid "Open content in a new tab"
-msgstr ""
+msgstr "Inhalt in einem neuen Tab öffnen"
msgid "There are users or courses using this language. Do you want to disable this language and set all these users and courses with the default portal language?"
msgstr "Es sind Benutzer oder Kurse mit dieser Sprache vorhanden. Dennoch diese Sprache deaktivieren und die Standard-Sprache der Installation setzen?"
msgid "Number of users registered and connected"
-msgstr ""
+msgstr "Anzahl registrierter und verbundener Benutzer"
msgid "Number of users registered (total)"
-msgstr ""
+msgstr "Anzahl der registrierten Benutzer (gesamt)"
msgid "Number of users registered (new vs previous quarter)"
-msgstr ""
+msgstr "Anzahl der registrierten Benutzer (neu vs. vorheriges Quartal)"
msgid "Number of users who connected"
-msgstr ""
+msgstr "Anzahl der verbundenen Benutzer"
msgid "*: Current quarter, incomplete data"
-msgstr ""
+msgstr "*: Aktuelles Quartal, unvollständige Daten"
msgid "Q%s %s"
msgstr ""
msgid "YoY"
-msgstr ""
+msgstr "Jahr über Jahr"
msgid "Number of existing and available courses"
-msgstr ""
+msgstr "Anzahl vorhandener und verfügbarer Kurse"
msgid "Number of existing courses (total)"
-msgstr ""
+msgstr "Anzahl der vorhandenen Kurse (gesamt)"
msgid "Number of available courses (not closed or hidden, total)"
msgstr ""
+"Anzahl der verfügbaren Kurse (nicht geschlossen oder versteckt, insgesamt)"
msgid "Hours of training"
-msgstr ""
+msgstr "Trainingsstunden"
msgid "Number of hours of training followed (total)"
-msgstr ""
+msgstr "Anzahl der insgesamt absolvierten Schulungsstunden"
msgid "Number of certificates generated"
-msgstr ""
+msgstr "Anzahl der erstellten Zertifikate"
msgid "Number of certificates generated (total)"
-msgstr ""
+msgstr "Anzahl der insgesamt erstellten Zertifikate"
msgid "Number of sessions per duration"
-msgstr ""
+msgstr "Anzahl der Sessions pro Dauer"
msgid "Sessions per duration (by quarter)"
-msgstr ""
+msgstr "Sessionen pro Dauer (nach Quartal)"
msgid "Number of courses, sessions and subscribed users"
-msgstr ""
+msgstr "Anzahl der Kurse, Sessions und eingeschriebenen Benutzer"
msgid "List of course codes"
-msgstr ""
+msgstr "Liste der Kurscodes"
msgid "Number of subscribed users"
-msgstr ""
+msgstr "Anzahl der abonnierten Benutzer"
msgid "Number of users who finished the course (as defined in gradebook)"
msgstr ""
+"Anzahl der Benutzer, die den Kurs abgeschlossen haben (wie im Notenbuch "
+"definiert)"
msgid "List of course codes and sessions"
-msgstr ""
+msgstr "Liste der Kurscodes und Sessions"
msgid "*: All users, including inactive, are included"
-msgstr ""
+msgstr "*: Alle Benutzer, einschließlich inaktiver, sind eingeschlossen"
msgid "Total disk usage"
-msgstr ""
+msgstr "Gesamter Speicherplatzverbrauch"
msgid "Edit portfolio comment"
-msgstr ""
+msgstr "Portfolio-Kommentar bearbeiten"
msgid "Test '%s' not deleted"
-msgstr ""
+msgstr "Test '%s' nicht gelöscht"
msgid "Don't include users"
-msgstr ""
+msgstr "Benutzer nicht einbeziehen"
msgid "The report doesn't include the list of users neither for session nor for each course"
msgstr ""
+"Der Bericht enthält weder eine Benutzerliste für die Session noch für jeden "
+"Kurs"
msgid "Include extra fields"
-msgstr ""
+msgstr "Fügen Sie zusätzliche Felder hinzu"
msgid "Skill levels"
-msgstr ""
+msgstr "Kompetenzstufen"
msgid "Import course events"
-msgstr ""
+msgstr "Kursereignisse importieren"
msgid "Tags can be used"
-msgstr ""
+msgstr "Tags können verwendet werden"
msgid "Invitation to the ((course_title)) course"
-msgstr ""
+msgstr "Einladung zum Kurs ((course_title))"
msgid "
Hello ((user_complete_name)).
"
-msgstr ""
+msgstr "
Hallo ((user_complete_name)).
"
msgid "%s's portfolio items"
-msgstr ""
+msgstr "%s's Portfolio-Elemente"
msgid "Scored"
-msgstr ""
+msgstr "Bewertet"
msgid "Edited"
-msgstr ""
+msgstr "Bearbeitet"
msgid "Downloaded"
-msgstr ""
+msgstr "Heruntergeladen"
msgid "You can only copy this course to a course for which you are a teacher"
msgstr ""
+"Sie können diesen Kurs nur in einen Kurs kopieren, bei dem Sie Trainer sind."
msgid "Remove users"
-msgstr ""
+msgstr "Benutzer entfernen"
msgid "Send file to other users"
-msgstr ""
+msgstr "Datei an andere Nutzer senden"
msgid "Remove file from selected users"
-msgstr ""
+msgstr "Ausgewählten Benutzern die Datei entfernen"
msgid "Send to other users"
-msgstr ""
+msgstr "An andere Benutzer senden"
msgid "Send to users"
-msgstr ""
+msgstr "An Nutzer senden"
msgid "Force users to change their password when they first log in"
-msgstr ""
+msgstr "Benutzer müssen bei der ersten Anmeldung ihr Passwort ändern"
msgid "Please note that your username to access is %s"
-msgstr ""
+msgstr "Bitte beachten Sie, dass Ihr Benutzername für den Zugang %s ist"
msgid "Note: If you do not remember your password, click on \"Forgot your password?\", enter your username and follow the instructions."
msgstr ""
+"Hinweis: Wenn Sie Ihr Passwort nicht mehr wissen, klicken Sie auf \"Passwort vergessen?\", geben Sie Ihren Benutzernamen ein und "
+"folgen Sie den Anweisungen."
msgid "Bi-weekly"
-msgstr ""
+msgstr "Zweiwöchentlich"
msgid "Every x days"
-msgstr ""
+msgstr "Alle x Tage"
msgid "Number of days"
-msgstr ""
+msgstr "Anzahl der Tage"
msgid "Leave a comment"
-msgstr ""
+msgstr "Einen Kommentar hinterlassen"
msgid "Please leave a comment first"
-msgstr ""
+msgstr "Bitte hinterlassen Sie zuerst einen Kommentar"
msgid "Last quiz finalization date"
-msgstr ""
+msgstr "Letzte Quiz-Abschlussdatum"
msgid "Last lp's finalization date"
-msgstr ""
+msgstr "Letztes LP-Abschlussdatum"
msgid "Must be in ALL the selected categories"
-msgstr ""
+msgstr "Muss in ALLEN ausgewählten Kategorien sein"
msgid "Report by attempts"
-msgstr ""
+msgstr "Bericht nach Versuchen"
msgid "Questions topic"
-msgstr ""
+msgstr "Fragenthema"
msgid "The questions topic will be used as the name of the test and will be sent to the AI generator to generate questions in the language configured for this course, asking for them to be generated in the Aiken format so they can easily be imported into this course."
msgstr ""
+"Das Themengebiet der Fragen wird als Name des Tests verwendet und an den KI-"
+"Generator gesendet, um Fragen in der für diesen Kurs konfigurierten Sprache "
+"zu generieren. Dabei wird darum gebeten, sie im Aiken-Format zu erstellen, "
+"damit sie problemlos in diesen Kurs importiert werden können."
msgid "AI Questions Generator"
-msgstr ""
+msgstr "Fragen-Generator für KI"
msgid "Most AI generators are limited in the number of characters they can return, and often your organization will be charged based on the number of characters returned, so please use with moderation, asking for smaller numbers first, then extending as you gain confidence."
msgstr ""
+"Die meisten KI-Generatoren sind in der Anzahl der Zeichen, die sie "
+"zurückgeben können, begrenzt, und oft wird Ihre Organisation basierend auf "
+"der Anzahl der zurückgegebenen Zeichen berechnet, also bitte verwenden Sie "
+"sie maßvoll, indem Sie zuerst kleinere Mengen anfordern und dann erweitern, "
+"sobald Sie Vertrauen gewinnen."
msgid "Use one (or more) of the following proposed tags to automatically generate a certificate or a skill and show them here when the student gets to this step, which requires all other steps to be finished first."
msgstr ""
+"Verwenden Sie einen (oder mehrere) der vorgeschlagenen Tags, um automatisch "
+"ein Zertifikat oder eine Fähigkeit zu generieren und sie hier anzuzeigen, "
+"wenn der Lernende diesen Schritt erreicht, der voraussetzt, dass alle "
+"anderen Schritte zuerst abgeschlossen sind."
msgid "Hi ((user_complete_name))."
-msgstr ""
+msgstr "Hallo [X0X]."
msgid "Invitation to session ((session_name))"
-msgstr ""
+msgstr "Einladung zur Session ((session_name))"
msgid "Fill blanks or form with exact selection"
-msgstr ""
+msgstr "Füllen Sie die Lücken aus oder wählen Sie genau aus"
msgid "Matching with exact selection"
-msgstr ""
+msgstr "Passend zur exakten Auswahl"
msgid "Image zones with exact selection"
-msgstr ""
+msgstr "Bildzonen mit exakter Auswahl"
msgid "Match by dragging with exact selection"
-msgstr ""
+msgstr "Zuordnung durch Ziehen mit exakter Auswahl"
msgid "Multiple answer dropdown with exact selection"
-msgstr ""
+msgstr "Dropdown mit Mehrfachauswahl und exakter Auswahl"
msgid "AI learning path generator"
-msgstr ""
+msgstr "KI-Lernpfadgenerator"
msgid "Topic"
-msgstr ""
+msgstr "Thema"
msgid "Type the topic on which you want the AI Helper to develop a learning path. The more detailed the topic, the more precise the result will be."
msgstr ""
+"Geben Sie das Thema ein, zu dem der KI-Helfer einen Lernpfad erstellen soll. "
+"Je detaillierter das Thema, desto präziser wird das Ergebnis sein."
msgid "Number of learning path items"
-msgstr ""
+msgstr "Anzahl der Lernpfad-Elemente"
msgid "This is the number of pages you want the AI Helper to generate in your learning path. Splitting the learning path in several pages, chapters, sections (however you want to call them) will help structure the course and also let you redistribute the content for better presentation."
msgstr ""
+"Dies ist die Anzahl der Seiten, die Sie möchten, dass der KI Helper in Ihrem "
+"Lernpfad generiert. Den Lernpfad in mehrere Seiten, Kapitel, Abschnitte (wie "
+"auch immer Sie sie nennen möchten) aufzuteilen, wird helfen, den Kurs zu "
+"strukturieren und Ihnen auch ermöglichen, den Inhalt für eine bessere "
+"Präsentation neu zu verteilen."
msgid "Rough maximum number of words (actually number of tokens) you want to get per page. More tokens will probably generate better content, but will also take more time to generate and cost more to your organisation, so use this carefully."
msgstr ""
+"Ungefähre maximale Anzahl an Wörtern (tatsächlich Anzahl der Token), die Sie "
+"pro Seite erhalten möchten. Mehr Token werden wahrscheinlich besseren Inhalt "
+"generieren, aber auch mehr Zeit zur Erstellung benötigen und Ihre "
+"Organisation mehr kosten, also gehen Sie hiermit sorgfältig um."
msgid "Only selected users will see the content"
-msgstr ""
+msgstr "Nur ausgewählte Benutzer werden den Inhalt sehen"
msgid "Leave empty to enable the content for everyone"
-msgstr ""
+msgstr "Leer lassen, um den Inhalt für alle freizugeben"
msgid "Export courses reports complete"
-msgstr ""
+msgstr "Export der Kursberichte abgeschlossen"
msgid "The number of questions is limited to between %d and %d."
-msgstr ""
+msgstr "Die Anzahl der Fragen ist auf zwischen %d und %d begrenzt."
msgid "Add a test after each page"
-msgstr ""
+msgstr "Fügen Sie nach jeder Seite einen Test hinzu"
msgid "Hidden but visible for me"
-msgstr ""
+msgstr "Versteckt, aber für mich sichtbar"
msgid "Conclusion"
-msgstr ""
+msgstr "Schlussfolgerung"
msgid "Unable to access temp file"
-msgstr ""
+msgstr "Zugriff auf temporäre Datei nicht möglich"
msgid "Duplicated users"
-msgstr ""
+msgstr "Duplizierte Benutzer"
msgid "This report only lists users that have the same firstname and lastname."
msgstr ""
+"Dieser Bericht listet nur Benutzer auf, die denselben Vornamen und Nachnamen "
+"haben."
msgid "By checking this box, you will remove all relationships of the HR manager with other sessions and courses. If what you want is to maintain those relationships, do NOT check this box."
msgstr ""
+"Durch das Ankreuzen dieses Feldes werden alle Beziehungen des "
+"Personalverantwortlichen zu anderen Sessions und Kursen entfernt. Wenn Sie "
+"diese Beziehungen beibehalten möchten, kreuzen Sie dieses Feld NICHT an."
msgid "There is no class with the name \"%s\""
-msgstr ""
+msgstr "Es gibt keine Klasse mit dem Namen '%s'"
msgid "Maximum number of subscriptions allowed. Leave at 0 to not limit it."
msgstr ""
+"Maximale Anzahl erlaubter Abonnements. Bei 0 eingeben, um es nicht zu "
+"begrenzen."
msgid "Subscriptions"
msgstr ""
msgid "Allow subscriptions"
-msgstr ""
+msgstr "Erlaube Abonnements"
msgid "Maximum number of subscriptions"
-msgstr ""
+msgstr "Maximale Anzahl an Abonnements"
msgid "No longer available"
-msgstr ""
+msgstr "Nicht mehr verfügbar"
msgid "Export all results from an exercise"
-msgstr ""
+msgstr "Exportieren Sie alle Ergebnisse einer Übung"
msgid "No result found for export in this test."
-msgstr ""
+msgstr "Kein Ergebnis für den Export in diesem Test gefunden."
msgid "User %s has been changed to %s. To cancel, click here."
msgstr ""
+"Benutzer %s wurde zu %s geändert. Zum Abbrechen klicken Sie hier."
msgid "Ex-learner"
-msgstr ""
+msgstr "Ehemaliger Lernender"
msgid "File size is too big"
-msgstr ""
+msgstr "Die Dateigröße ist zu groß"
msgid "An error occured"
-msgstr ""
+msgstr "Ein Fehler ist aufgetreten"
msgid "Image for headers"
-msgstr ""
+msgstr "Bild für Kopfzeilen"
msgid "Add picture for headers"
msgstr ""
From a0ac5ef8ffc6c4274723da189c12818428d9d398 Mon Sep 17 00:00:00 2001
From: Angel Fernando Quiroz Campos
Date: Mon, 13 May 2024 00:04:29 -0500
Subject: [PATCH 193/413] Restore jquery.frameready.js code from 1.11.x - refs
BT#21508
---
public/main/inc/lib/javascript/jquery.frameready.js | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/public/main/inc/lib/javascript/jquery.frameready.js b/public/main/inc/lib/javascript/jquery.frameready.js
index 319be324e78..eeac3d348a0 100644
--- a/public/main/inc/lib/javascript/jquery.frameready.js
+++ b/public/main/inc/lib/javascript/jquery.frameready.js
@@ -17,7 +17,7 @@
factory(jQuery);
}
}(function ($) {
- $.frameReady = function (callback, targetSelector, resources) {
+ $.frameReady = function (callback, targetSelector, resources, conditional) {
/**
* @type {window}
*/
@@ -59,8 +59,17 @@
targetWindow.onload = function () {
scripsLoadedCount = 0;
+ if (typeof conditional === 'function' && conditional()) {
+ return;
+ }
+
targetDocument = targetWindow.contentDocument;
+ if (!targetDocument) {
+ console.log('frameReady: Can\'t access to contentDocument.');
+ return;
+ }
+
scripts.forEach(function (script) {
createScript(script);
});
From b09d91d45a17e589f3f56c0f2beb771ecde58cd2 Mon Sep 17 00:00:00 2001
From: christianbeeznst
Date: Mon, 13 May 2024 00:30:03 -0500
Subject: [PATCH 194/413] Social: Enhancements and Fixes for Social Network
Features - refs BT#21101
---
assets/css/app.scss | 10 ++++
.../vue/components/message/MessageLayout.vue | 2 -
assets/vue/components/personalfile/Layout.vue | 2 -
assets/vue/components/social/MyGroupsCard.vue | 12 +++--
assets/vue/components/user/Layout.vue | 9 ++--
assets/vue/components/usergroup/Layout.vue | 2 -
assets/vue/components/userreluser/Layout.vue | 2 -
assets/vue/composables/sidebarMenu.js | 38 +++++++++++++--
assets/vue/views/account/Home.vue | 24 +---------
assets/vue/views/message/MessageList.vue | 1 -
assets/vue/views/social/SocialLayout.vue | 47 +++++++------------
assets/vue/views/social/SocialWall.vue | 9 +++-
assets/vue/views/userreluser/Invitations.vue | 8 +---
.../Controller/SocialController.php | 20 ++++----
14 files changed, 95 insertions(+), 91 deletions(-)
diff --git a/assets/css/app.scss b/assets/css/app.scss
index b8821d12039..64e7ee30ca2 100644
--- a/assets/css/app.scss
+++ b/assets/css/app.scss
@@ -619,6 +619,16 @@ form .field {
display: none;
}
+.sub-item-indent {
+ padding-left: 20px;
+}
+
+.sub-item-indent.active {
+ background-color: #e0e0e0;
+ color: #333;
+ font-weight: bold;
+}
+
//@import 'primevue-md-light-indigo/theme.css';
//@import '~primevue/resources/primevue.min.css';
//@import '~primeflex/primeflex.css';
diff --git a/assets/vue/components/message/MessageLayout.vue b/assets/vue/components/message/MessageLayout.vue
index 7e0de20ae65..6a30b9d4b33 100644
--- a/assets/vue/components/message/MessageLayout.vue
+++ b/assets/vue/components/message/MessageLayout.vue
@@ -2,7 +2,6 @@
-
@@ -11,7 +10,6 @@
diff --git a/assets/vue/components/session/SessionCategoryView.vue b/assets/vue/components/session/SessionCategoryView.vue
index d1fba0b989b..27f5b83d2ff 100644
--- a/assets/vue/components/session/SessionCategoryView.vue
+++ b/assets/vue/components/session/SessionCategoryView.vue
@@ -9,65 +9,24 @@
diff --git a/assets/vue/views/user/sessions/SessionsUpcoming.vue b/assets/vue/views/user/sessions/SessionsUpcoming.vue
index 0b33822d11a..a25c8031dbc 100644
--- a/assets/vue/views/user/sessions/SessionsUpcoming.vue
+++ b/assets/vue/views/user/sessions/SessionsUpcoming.vue
@@ -5,7 +5,6 @@
@@ -15,5 +14,5 @@ import SessionTabs from "../../../components/session/SessionTabs.vue"
import { useSession } from "./session"
import SessionsLoading from "./SessionsLoading.vue"
-const { sessions, isLoading } = useSession("upcomming")
+const { sessions, isLoading } = useSession("upcoming")
diff --git a/assets/vue/views/user/sessions/session.js b/assets/vue/views/user/sessions/session.js
index 5309fb6cc6c..156fd8060a0 100644
--- a/assets/vue/views/user/sessions/session.js
+++ b/assets/vue/views/user/sessions/session.js
@@ -1,37 +1,20 @@
-import { ref, watch } from "vue"
-import { useQuery } from "@vue/apollo-composable"
-import {
- GET_SESSION_REL_USER_UPCOMMING,
- GET_SESSION_REL_USER_PAST,
- GET_SESSION_REL_USER_CURRENT,
-} from "../../../graphql/queries/SessionRelUser"
+import { ref } from "vue"
import { useSecurityStore } from "../../../store/securityStore"
+import sessionService from "../../../services/sessionService"
-export function useSession(type = null) {
+export function useSession(type) {
const securityStore = useSecurityStore()
- const sessions = ref(null)
+ const sessions = ref([])
const isLoading = ref(false)
if (securityStore.isAuthenticated) {
- let variables = {
- user: securityStore.user["@id"],
- }
-
- let finalQuery = GET_SESSION_REL_USER_CURRENT
-
- if ("upcomming" === type) {
- finalQuery = GET_SESSION_REL_USER_UPCOMMING
- } else if ("past" === type) {
- finalQuery = GET_SESSION_REL_USER_PAST
- }
-
isLoading.value = true
- const { result, loading } = useQuery(finalQuery, variables, { fetchPolicy: "no-cache" })
-
- watch(result, (newResult) => (sessions.value = newResult))
- watch(loading, (newLoading) => (isLoading.value = newLoading))
+ sessionService
+ .findUserSubscriptions(securityStore.user["@id"], type)
+ .then(({ items }) => (sessions.value = items))
+ .finally(() => (isLoading.value = false))
}
return {
diff --git a/src/CoreBundle/Entity/Session.php b/src/CoreBundle/Entity/Session.php
index 6ab12fbfec6..f12a0bd0643 100644
--- a/src/CoreBundle/Entity/Session.php
+++ b/src/CoreBundle/Entity/Session.php
@@ -851,6 +851,7 @@ public function setAccessStartDate(?DateTime $accessStartDate): self
return $this;
}
+ #[Groups(['user_subscriptions:sessions'])]
public function isActiveForStudent(): bool
{
$start = $this->getAccessStartDate();
@@ -871,6 +872,7 @@ public function setAccessEndDate(?DateTime $accessEndDate): self
return $this;
}
+ #[Groups(['user_subscriptions:sessions'])]
public function isActiveForCoach(): bool
{
$start = $this->getCoachAccessStartDate();
From 92275472e6bee72dcf807971463beb387f06b6d5 Mon Sep 17 00:00:00 2001
From: Angel Fernando Quiroz Campos
Date: Wed, 15 May 2024 02:44:01 -0500
Subject: [PATCH 213/413] Internal: API: Remove references to session list with
GraphQL - refs BT#21633
---
assets/vue/graphql/queries/SessionRelUser.js | 90 -------------------
.../Extension/SessionRelUserExtension.php | 46 ----------
2 files changed, 136 deletions(-)
delete mode 100644 assets/vue/graphql/queries/SessionRelUser.js
diff --git a/assets/vue/graphql/queries/SessionRelUser.js b/assets/vue/graphql/queries/SessionRelUser.js
deleted file mode 100644
index d463629e849..00000000000
--- a/assets/vue/graphql/queries/SessionRelUser.js
+++ /dev/null
@@ -1,90 +0,0 @@
-import gql from "graphql-tag"
-
-let nodeAttrs = `node {
- session {
- _id
- title
- category {
- _id
- id
- title
- }
- displayStartDate
- displayEndDate
- users(user: $user) {
- edges {
- node {
- user {
- id
- }
- relationType
- }
- }
- }
- courses {
- edges {
- node {
- course {
- _id
- title
- illustrationUrl
- }
- }
- }
- }
- sessionRelCourseRelUsers(user: $user) {
- edges {
- node {
- course {
- _id
- title
- illustrationUrl
- }
- }
- }
- }
- }
-}`
-
-// The extension SessionRelUserExtension.php will be loaded.
-export const GET_SESSION_REL_USER_CURRENT = gql`
- # Query to fetch current sessions with pagination set to 1000 items per page to avoid implementing pagination on the session page.
- query getCurrentSessions($user: String!) {
- sessionRelUsers(
- user: $user
- first: 1000 # Pagination hard-coded to 1000 items per page.
- ) {
- edges {
- ${nodeAttrs}
- }
- }
- }
-`
-
-export const GET_SESSION_REL_USER_UPCOMMING = gql`
- # Query to fetch sessions with date filters applied, pagination set to 1000 items per page.
- query getUpcommingSessions($user: String!) {
- sessionRelUsers(
- user: $user
- first: 1000 # Pagination hard-coded to 1000 items per page.
- ) {
- edges {
- ${nodeAttrs}
- }
- }
- }
-`
-
-export const GET_SESSION_REL_USER_PAST = gql`
- # Query to fetch sessions with date filters applied, pagination set to 1000 items per page.
- query getPastSessions($user: String!) {
- sessionRelUsers(
- user: $user
- first: 1000 # Pagination hard-coded to 1000 items per page.
- ) {
- edges {
- ${nodeAttrs}
- }
- }
- }
-`
diff --git a/src/CoreBundle/DataProvider/Extension/SessionRelUserExtension.php b/src/CoreBundle/DataProvider/Extension/SessionRelUserExtension.php
index b83bae02956..46a42232ca3 100644
--- a/src/CoreBundle/DataProvider/Extension/SessionRelUserExtension.php
+++ b/src/CoreBundle/DataProvider/Extension/SessionRelUserExtension.php
@@ -11,11 +11,8 @@
use ApiPlatform\Metadata\Operation;
use Chamilo\CoreBundle\Entity\SessionRelUser;
use Chamilo\CoreBundle\Entity\User;
-use DateTime;
-use DateTimeZone;
use Doctrine\ORM\QueryBuilder;
use Symfony\Bundle\SecurityBundle\Security;
-use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
// use ApiPlatform\Core\Bridge\Doctrine\Orm\Extension\QueryItemExtensionInterface;
@@ -24,7 +21,6 @@ final class SessionRelUserExtension implements QueryCollectionExtensionInterface
{
public function __construct(
private readonly Security $security,
- private readonly RequestStack $requestStack
) {}
public function applyToCollection(
@@ -49,52 +45,10 @@ private function addWhere(QueryBuilder $qb, string $resourceClass): void
return;
}
- $request = $this->requestStack->getCurrentRequest();
$alias = $qb->getRootAliases()[0];
- $content = $request->getContent();
-
- $now = new DateTime('now', new DateTimeZone('UTC'));
- $date = $now->format('Y-m-d H:i:s');
$qb->innerJoin("$alias.session", 's');
- if (str_contains($content, 'getCurrentSessions')) {
- $qb->andWhere(
- $qb->expr()->orX(
- $qb->expr()->andX(
- $qb->expr()->isNotNull('s.accessStartDate'),
- $qb->expr()->isNull('s.accessEndDate'),
- $qb->expr()->lte('s.accessStartDate', "'$date'")
- ),
- $qb->expr()->andX(
- $qb->expr()->isNotNull('s.accessStartDate'),
- $qb->expr()->isNotNull('s.accessEndDate'),
- $qb->expr()->lte('s.accessStartDate', "'$date'"),
- $qb->expr()->gte('s.accessEndDate', "'$date'")
- ),
- $qb->expr()->andX(
- $qb->expr()->isNull('s.accessStartDate'),
- $qb->expr()->isNotNull('s.accessEndDate'),
- $qb->expr()->gte('s.accessEndDate', "'$date'")
- )
- )
- );
- } elseif (str_contains($content, 'getUpcommingSessions')) {
- $qb->andWhere(
- $qb->expr()->andX(
- $qb->expr()->isNotNull('s.accessStartDate'),
- $qb->expr()->gt('s.accessStartDate', "'$date'")
- )
- );
- } elseif (str_contains($content, 'getPastSessions')) {
- $qb->andWhere(
- $qb->expr()->andX(
- $qb->expr()->isNotNull('s.accessEndDate'),
- $qb->expr()->lt('s.accessEndDate', "'$date'")
- )
- );
- }
-
if ($this->security->isGranted('ROLE_ADMIN')) {
return;
}
From f6c86e66b6efdf9b357042bff7653e1147df2b25 Mon Sep 17 00:00:00 2001
From: Angel Fernando Quiroz Campos
Date: Wed, 15 May 2024 02:46:03 -0500
Subject: [PATCH 214/413] Minor: Format code
---
tests/CoreBundle/Repository/SessionRepositoryTest.php | 1 +
1 file changed, 1 insertion(+)
diff --git a/tests/CoreBundle/Repository/SessionRepositoryTest.php b/tests/CoreBundle/Repository/SessionRepositoryTest.php
index fde916c5c78..20309acad79 100644
--- a/tests/CoreBundle/Repository/SessionRepositoryTest.php
+++ b/tests/CoreBundle/Repository/SessionRepositoryTest.php
@@ -543,6 +543,7 @@ public function testCreateWithSessionCategory(): void
public function testSessionRelUser(): void
{
$em = $this->getEntityManager();
+
/** @var SessionRepository $sessionRepo */
$sessionRepo = self::getContainer()->get(SessionRepository::class);
From f8f8cdf5499ed0041b8a0041596672b7666c6085 Mon Sep 17 00:00:00 2001
From: Angel Fernando Quiroz Campos
Date: Wed, 15 May 2024 03:03:30 -0500
Subject: [PATCH 215/413] CI: Fix psalm issues
---
src/CoreBundle/ApiResource/CalendarEvent.php | 2 +-
src/CoreBundle/Entity/Session.php | 4 ++--
src/CoreBundle/Settings/SettingsManager.php | 10 +++++++---
3 files changed, 10 insertions(+), 6 deletions(-)
diff --git a/src/CoreBundle/ApiResource/CalendarEvent.php b/src/CoreBundle/ApiResource/CalendarEvent.php
index 89a844ecf54..fa54877f0f0 100644
--- a/src/CoreBundle/ApiResource/CalendarEvent.php
+++ b/src/CoreBundle/ApiResource/CalendarEvent.php
@@ -43,7 +43,7 @@ public function __construct(
#[Groups(['calendar_event:read'])]
public int $maxAttendees = 0,
/**
- * @var Collection
+ * @var Collection|null
*/
#[Groups(['calendar_event:read'])]
public ?Collection $reminders = null,
diff --git a/src/CoreBundle/Entity/Session.php b/src/CoreBundle/Entity/Session.php
index f12a0bd0643..f4888eb0425 100644
--- a/src/CoreBundle/Entity/Session.php
+++ b/src/CoreBundle/Entity/Session.php
@@ -587,7 +587,7 @@ public function setNbrUsers(int $nbrUsers): self
}
/**
- * @return Collection
+ * @return Collection
*/
public function getAllUsersFromCourse(int $status): Collection
{
@@ -1257,7 +1257,7 @@ protected function compareDates(?DateTime $start, ?DateTime $end = null): bool
}
/**
- * @return Collection
+ * @return Collection
*/
#[Groups(['user_subscriptions:sessions'])]
public function getCourseCoachesSubscriptions(): Collection
diff --git a/src/CoreBundle/Settings/SettingsManager.php b/src/CoreBundle/Settings/SettingsManager.php
index 29b48f5f94c..f598ef9175f 100644
--- a/src/CoreBundle/Settings/SettingsManager.php
+++ b/src/CoreBundle/Settings/SettingsManager.php
@@ -196,11 +196,15 @@ public function loadAll(): void
$schemaRegister->buildSettings($settingsBuilder);
$name = $this->convertServiceToNameSpace($schema);
$settings = new Settings();
+
+ /** @var array $parameters */
$parameters = $all[$name] ?? [];
- $knownParameters = array_filter($parameters, function ($key) use ($settingsBuilder) {
- return $settingsBuilder->isDefined($key);
- }, ARRAY_FILTER_USE_KEY);
+ $knownParameters = array_filter(
+ $parameters,
+ fn ($key): bool => $settingsBuilder->isDefined($key),
+ ARRAY_FILTER_USE_KEY
+ );
$transformers = $settingsBuilder->getTransformers();
foreach ($transformers as $parameter => $transformer) {
From 0972e6d29f3ca56a99a53c5a52f792b69a5dc53b Mon Sep 17 00:00:00 2001
From: NicoDucou
Date: Wed, 15 May 2024 15:04:10 +0200
Subject: [PATCH 216/413] Legal: enable HTML in warning message if legal is not
activated -refs BT#21593
---
public/main/auth/inscription.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/public/main/auth/inscription.php b/public/main/auth/inscription.php
index 3c754b36ba1..38b42d3a913 100644
--- a/public/main/auth/inscription.php
+++ b/public/main/auth/inscription.php
@@ -662,7 +662,7 @@
$infoMessage = Display::return_message(
get_lang('The terms and conditions have not yet been validated by your tutor'),
'warning',
- true
+ false
);
}
From 4f9526bdbb2a80daed45cce38516bd3d89495674 Mon Sep 17 00:00:00 2001
From: Angel Fernando Quiroz Campos
Date: Wed, 15 May 2024 11:33:44 -0500
Subject: [PATCH 217/413] Fix conditional to validate if user is general coach
in session list - refs BT#21633
---
assets/vue/components/session/SessionCardSimple.vue | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/assets/vue/components/session/SessionCardSimple.vue b/assets/vue/components/session/SessionCardSimple.vue
index d6d20c5f362..f750897cd5f 100644
--- a/assets/vue/components/session/SessionCardSimple.vue
+++ b/assets/vue/components/session/SessionCardSimple.vue
@@ -30,7 +30,7 @@ const courses = props.session.courses
? props.session.courses.map((sesionRelCourse) => ({ ...sesionRelCourse.course, _id: sesionRelCourse.course.id }))
: []
-const isGeneralCoach = props.session.courseCoachesSubscriptions
+const isGeneralCoach = props.session.generalCoachesSubscriptions
? props.session.generalCoachesSubscriptions.findIndex((sRcRU) => sRcRU.user["@id"] === securityStore.user["@id"]) >= 0
: false
From 8ad3ba5e87a4cb2cfbe83a490d1a75722ef0d06f Mon Sep 17 00:00:00 2001
From: Angel Fernando Quiroz Campos
Date: Wed, 15 May 2024 11:59:35 -0500
Subject: [PATCH 218/413] Move code to function - refs BT#21633
---
.../session/SessionCategoryView.vue | 50 +++++-------------
.../views/user/sessions/SessionsCurrent.vue | 6 ++-
.../vue/views/user/sessions/SessionsPast.vue | 6 ++-
.../views/user/sessions/SessionsUpcoming.vue | 6 ++-
assets/vue/views/user/sessions/session.js | 52 +++++++++++++++++--
5 files changed, 73 insertions(+), 47 deletions(-)
diff --git a/assets/vue/components/session/SessionCategoryView.vue b/assets/vue/components/session/SessionCategoryView.vue
index 27f5b83d2ff..5ae01a7aef3 100644
--- a/assets/vue/components/session/SessionCategoryView.vue
+++ b/assets/vue/components/session/SessionCategoryView.vue
@@ -1,53 +1,27 @@
-
+
diff --git a/assets/vue/views/user/sessions/SessionsCurrent.vue b/assets/vue/views/user/sessions/SessionsCurrent.vue
index d6edf8b00f9..2deda816a6d 100644
--- a/assets/vue/views/user/sessions/SessionsCurrent.vue
+++ b/assets/vue/views/user/sessions/SessionsCurrent.vue
@@ -8,7 +8,9 @@
@@ -19,5 +21,5 @@ import SessionCategoryView from "../../../components/session/SessionCategoryView
import { useSession } from "./session"
import SessionsLoading from "./SessionsLoading.vue"
-const { sessions, isLoading } = useSession("current")
+const { isLoading, uncategorizedSessions, categories, categoriesWithSessions } = useSession("current")
diff --git a/assets/vue/views/user/sessions/SessionsPast.vue b/assets/vue/views/user/sessions/SessionsPast.vue
index 3233e95dd29..163ca32b54a 100644
--- a/assets/vue/views/user/sessions/SessionsPast.vue
+++ b/assets/vue/views/user/sessions/SessionsPast.vue
@@ -4,7 +4,9 @@
@@ -14,5 +16,5 @@ import SessionTabs from "../../../components/session/SessionTabs.vue"
import { useSession } from "./session"
import SessionsLoading from "./SessionsLoading.vue"
-const { sessions, isLoading } = useSession("past")
+const { isLoading, uncategorizedSessions, categories, categoriesWithSessions } = useSession("past")
diff --git a/assets/vue/views/user/sessions/SessionsUpcoming.vue b/assets/vue/views/user/sessions/SessionsUpcoming.vue
index a25c8031dbc..11af4dab876 100644
--- a/assets/vue/views/user/sessions/SessionsUpcoming.vue
+++ b/assets/vue/views/user/sessions/SessionsUpcoming.vue
@@ -4,7 +4,9 @@
@@ -14,5 +16,5 @@ import SessionTabs from "../../../components/session/SessionTabs.vue"
import { useSession } from "./session"
import SessionsLoading from "./SessionsLoading.vue"
-const { sessions, isLoading } = useSession("upcoming")
+const { isLoading, uncategorizedSessions, categories, categoriesWithSessions } = useSession("upcoming")
diff --git a/assets/vue/views/user/sessions/session.js b/assets/vue/views/user/sessions/session.js
index 156fd8060a0..5d81038192e 100644
--- a/assets/vue/views/user/sessions/session.js
+++ b/assets/vue/views/user/sessions/session.js
@@ -1,24 +1,70 @@
import { ref } from "vue"
import { useSecurityStore } from "../../../store/securityStore"
import sessionService from "../../../services/sessionService"
+import isEmpty from "lodash/isEmpty"
export function useSession(type) {
const securityStore = useSecurityStore()
- const sessions = ref([])
const isLoading = ref(false)
+ const uncategorizedSessions = ref([])
+ const categories = ref([])
+ const categoriesWithSessions = ref([])
+
+ function getUncategorizedSessions(sessions) {
+ return sessions.filter((session) => isEmpty(session.category))
+ }
+
+ function getCategories(sessions) {
+ let categoryList = []
+
+ sessions.forEach((session) => {
+ if (session.category) {
+ const alreadyAdded = categoryList.findIndex((cat) => cat["@id"] === session.category["@id"]) >= 0
+
+ if (!alreadyAdded) {
+ categoryList.push(session.category)
+ }
+ }
+ })
+
+ return categoryList
+ }
+
+ function getCategoriesWithSessions(sessions) {
+ let categoriesIn = []
+
+ sessions.forEach(function (session) {
+ if (!isEmpty(session.category)) {
+ if (categoriesIn[session.category["@id"]] === undefined) {
+ categoriesIn[session.category["@id"]] = []
+ categoriesIn[session.category["@id"]]["sessions"] = []
+ }
+ categoriesIn[session.category["@id"]]["sessions"].push(session)
+ }
+ })
+
+ return categoriesIn
+ }
+
if (securityStore.isAuthenticated) {
isLoading.value = true
sessionService
.findUserSubscriptions(securityStore.user["@id"], type)
- .then(({ items }) => (sessions.value = items))
+ .then(({ items }) => {
+ uncategorizedSessions.value = getUncategorizedSessions(items)
+ categories.value = getCategories(items)
+ categoriesWithSessions.value = getCategoriesWithSessions(items)
+ })
.finally(() => (isLoading.value = false))
}
return {
- sessions,
isLoading,
+ uncategorizedSessions,
+ categories,
+ categoriesWithSessions,
}
}
From 619aa338e58e609a863fbf6f1c86927e4453ded1 Mon Sep 17 00:00:00 2001
From: Angel Fernando Quiroz Campos
Date: Wed, 15 May 2024 13:38:20 -0500
Subject: [PATCH 219/413] Internal: API: Get coaches illustration in user
session subscription list - refs BT#21633
---
src/CoreBundle/Entity/User.php | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/CoreBundle/Entity/User.php b/src/CoreBundle/Entity/User.php
index b754894c7c2..220ddf65dbb 100644
--- a/src/CoreBundle/Entity/User.php
+++ b/src/CoreBundle/Entity/User.php
@@ -133,6 +133,7 @@ class User implements UserInterface, EquatableInterface, ResourceInterface, Reso
'message:read',
'user_rel_user:read',
'social_post:read',
+ 'user_subscriptions:sessions',
])]
public ?string $illustrationUrl = null;
From 12af769b031e21054db31aab691d9fb348811c10 Mon Sep 17 00:00:00 2001
From: Angel Fernando Quiroz Campos
Date: Wed, 15 May 2024 13:40:34 -0500
Subject: [PATCH 220/413] Display: Show session display dates in user session
list - refs BT#21633
---
assets/css/scss/organisms/_cards.scss | 2 +-
assets/css/scss/organisms/_course_card.scss | 14 +++++
assets/vue/components/course/CourseCard.vue | 64 +++++++++++++++++----
3 files changed, 68 insertions(+), 12 deletions(-)
diff --git a/assets/css/scss/organisms/_cards.scss b/assets/css/scss/organisms/_cards.scss
index 8f74ece8ef2..b390a706e54 100644
--- a/assets/css/scss/organisms/_cards.scss
+++ b/assets/css/scss/organisms/_cards.scss
@@ -12,7 +12,7 @@
}
.p-card-title {
- @apply text-body-2 font-semibold line-clamp-2;
+ @apply text-body-2 font-semibold;
}
.p-card-subtitle {
diff --git a/assets/css/scss/organisms/_course_card.scss b/assets/css/scss/organisms/_course_card.scss
index e088b53f873..4af8fcab7bf 100644
--- a/assets/css/scss/organisms/_course_card.scss
+++ b/assets/css/scss/organisms/_course_card.scss
@@ -1,5 +1,19 @@
@layer components {
.course-card {
@apply bg-gray-15;
+
+ &__title {
+ @apply text-gray-90 text-body-1 font-semibold space-y-2;
+
+ .session {
+ &__title {
+ @apply text-body-2 font-semibold;
+ }
+
+ &__display-date {
+ @apply text-gray-50 font-normal text-caption;
+ }
+ }
+ }
}
}
\ No newline at end of file
diff --git a/assets/vue/components/course/CourseCard.vue b/assets/vue/components/course/CourseCard.vue
index 31c0a7388aa..5508f6e116b 100644
--- a/assets/vue/components/course/CourseCard.vue
+++ b/assets/vue/components/course/CourseCard.vue
@@ -18,18 +18,34 @@
-
- {{ session.title }} -
- {{ course.title }}
+
+
+
+ {{ course.title }}
+
+
+
+ {{ course.title }}
+
+
+
-
- {{ session.title }} -
- {{ course.title }}
-
@@ -41,6 +57,10 @@
import Card from "primevue/card"
import TeacherBar from "../TeacherBar"
import { computed } from "vue"
+import { isEmpty } from "lodash"
+import { useFormatDate } from "../../composables/formatDate"
+
+const { abbreviatedDatetime } = useFormatDate()
// eslint-disable-next-line no-undef
const props = defineProps({
@@ -66,6 +86,12 @@ const props = defineProps({
})
const teachers = computed(() => {
+ if (props.session?.courseCoachesSubscriptions) {
+ return props.session.courseCoachesSubscriptions
+ .filter((srcru) => srcru.course["@id"] === props.course["@id"])
+ .map((srcru) => srcru.user)
+ }
+
if (props.course.users && props.course.users.edges) {
return props.course.users.edges.map((edge) => ({
id: edge.node.id,
@@ -75,4 +101,20 @@ const teachers = computed(() => {
return []
})
+
+const sessionDisplayDate = computed(() => {
+ const dateString = []
+
+ if (props.session) {
+ if (!isEmpty(props.session.displayStartDate)) {
+ dateString.push(abbreviatedDatetime(props.session.displayStartDate))
+ }
+
+ if (!isEmpty(props.session.displayEndDate)) {
+ dateString.push(abbreviatedDatetime(props.session.displayEndDate))
+ }
+ }
+
+ return dateString.join(" — ")
+})
From 14e07c519e2a0cf9725bf39f73cf2d60d7c638d3 Mon Sep 17 00:00:00 2001
From: Daniel <50702276+daniboygg@users.noreply.github.com>
Date: Wed, 15 May 2024 23:34:01 +0200
Subject: [PATCH 221/413] Display: Show profile image in reply message
correctly #5389
* Messages: Use new component to show to and cc when replying a message
(cherry picked from commit 150aaff783adbfa3309760456e2e83cfd061839b)
* Minor: format file
(cherry picked from commit 2289afbf338c269292f21a9ec638e124bab228bb)
* Minor: remove not used import
---------
Co-authored-by: Angel Fernando Quiroz Campos
---
assets/vue/views/message/MessageReply.vue | 41 ++++++++++++++---------
1 file changed, 25 insertions(+), 16 deletions(-)
diff --git a/assets/vue/views/message/MessageReply.vue b/assets/vue/views/message/MessageReply.vue
index 72b3871eb65..1f940db7d79 100644
--- a/assets/vue/views/message/MessageReply.vue
+++ b/assets/vue/views/message/MessageReply.vue
@@ -9,10 +9,10 @@
class="field"
>
-
From b9cb1910952f5b611d72907d99ad520791e7c558 Mon Sep 17 00:00:00 2001
From: Yannick Warnier
Date: Thu, 16 May 2024 18:25:32 +0200
Subject: [PATCH 228/413] Language: Update language terms - Temporarily
finished German translations
---
translations/messages.de.po | 553 +++++++++++++++++++++++++++++++++++-
1 file changed, 551 insertions(+), 2 deletions(-)
diff --git a/translations/messages.de.po b/translations/messages.de.po
index aaa5f7c639d..0ece309c05c 100644
--- a/translations/messages.de.po
+++ b/translations/messages.de.po
@@ -1,7 +1,7 @@
msgid ""
msgstr ""
"Project-Id-Version: chamilo\n"
-"PO-Revision-Date: 2024-05-16 12:57+0000\n"
+"PO-Revision-Date: 2024-05-16 16:21+0000\n"
"Last-Translator: Yannick Warnier \n"
"Language-Team: German \n"
@@ -9038,7 +9038,7 @@ msgid "Portal Admin"
msgstr "Administrator"
msgid "none"
-msgstr "nichts"
+msgstr "Keine"
msgid "First select a course"
msgstr "Zuerst einen Kurs auswählen"
@@ -28421,3 +28421,552 @@ msgstr ""
msgid "Enable extra test answers recording"
msgstr "Aktivieren Sie die Aufzeichnung zusätzlicher Testantworten"
+
+msgid "Session admins can view careers"
+msgstr "Session-Administratoren können Karrieren einsehen"
+
+msgid "Prevent emptying the subscribed users in session subscription"
+msgstr ""
+"Verhindern Sie das Leeren der eingeschriebenen Benutzer in der Session-"
+"Anmeldung"
+
+msgid "Show language flag next to avatar in social network"
+msgstr "Sprachflagge neben dem Avatar im sozialen Netzwerk anzeigen"
+
+msgid "Hide survey reporting button"
+msgstr "Umfragebericht-Button ausblenden"
+
+msgid "Enable 'previous question' button in surveys"
+msgstr "Aktivieren Sie den Button \"Vorherige Frage\" in Umfragen"
+
+msgid "Hide skills from learners"
+msgstr "Fähigkeiten vor Lernenden verbergen"
+
+msgid "Force download of document before assignment upload"
+msgstr "Dokument-Download erzwingen, bevor eine Aufgabe hochgeladen wird"
+
+msgid "Access by role to ticket projects"
+msgstr "Zugriff nach Rolle auf Ticketprojekte"
+
+msgid "Display surveys from base course in all session courses"
+msgstr "Anzeigen von Umfragen aus dem Basiskurs in allen Sessionkursen"
+
+msgid "Session link"
+msgstr "Session-Link"
+
+msgid "Auto-create single-user session on course auto-subscription"
+msgstr ""
+"Automatische Erstellung einer Einzelbenutzer-Session bei automatischer "
+"Kurseinschreibung"
+
+msgid "Students can only upload one assignment"
+msgstr "Lernende können nur eine Aufgabe hochladen"
+
+msgid "Allow ticket projects to be accesses by specific user roles. Example: ['permissions' => [1 => [17]] where project_id = 1, STUDENT_BOSS = 17."
+msgstr ""
+"Erlauben Sie den Zugriff auf Ticketprojekte für bestimmte Benutzerrollen. "
+"Beispiel: ['permissions' => [1 => [17]] where project_id = 1, STUDENT_BOSS = "
+"17."
+
+msgid "No link"
+msgstr "Kein Link"
+
+msgid "Base course teacher can see assignments from all sessions"
+msgstr "Der Basis-Kursleiter kann alle Aufgaben aus den Sessions einsehen"
+
+msgid "Show number of users in sessions list"
+msgstr "Anzahl der Benutzer in der Sessionsliste anzeigen"
+
+msgid "Show only courses"
+msgstr "Nur Kurse anzeigen"
+
+msgid "Prevent survey edition"
+msgstr "Verhinderung der Bearbeitung von Umfragen"
+
+msgid "Allow teachers to see which learners have already answered an anonymous survey. This only appears once more than one user has answered, so it remains difficult to identify who answered what."
+msgstr ""
+"Erlauben Sie Trainern zu sehen, welche Lernenden bereits an einer anonymen "
+"Umfrage teilgenommen haben. Dies wird erst angezeigt, wenn mehr als ein "
+"Nutzer geantwortet hat, sodass es weiterhin schwierig bleibt zu "
+"identifizieren, wer was geantwortet hat."
+
+msgid "Restrict the list of students to subscribe in the course session. And disable registration for users in all courses from Resume Session page."
+msgstr ""
+"Beschränken Sie die Liste der Lernenden, die sich für die Kurs-Session "
+"anmelden dürfen. Und deaktivieren Sie die Registrierung für Benutzer in "
+"allen Kursen auf der Seite 'Session fortsetzen'."
+
+msgid "Enable samesite:None parameter for session cookie. More info: https://www.chromium.org/updates/same-site and https://developers.google.com/search/blog/2020/01/get-ready-for-new-samesitenone-secure"
+msgstr ""
+"Aktivieren Sie den Parameter samesite:None für das Session-Cookie. Weitere "
+"Informationen: https://www.chromium.org/updates/same-site und "
+"https://developers.google.com/search/blog/2020/01/get-ready-for-new-"
+"samesitenone-secure"
+
+msgid "Allow teachers to edit survey questions after students answered"
+msgstr ""
+"Erlauben Sie Trainern, Umfragefragen zu bearbeiten, nachdem Lernende "
+"geantwortet haben"
+
+msgid "Order by student name when using survey duplication feature"
+msgstr ""
+"Sortieren nach Namen des Lernenden bei Verwendung der Funktion zur "
+"Duplizierung von Umfragen"
+
+msgid "Sender profile picture"
+msgstr "Absenderprofilbild"
+
+msgid "Set course read-only in session"
+msgstr "Kurs in der Session schreibgeschützt setzen"
+
+msgid "Prevent editing surveys for all surveys listed here (by code). Use * to prevent edition of all surveys."
+msgstr ""
+"Bearbeitung von Umfragen für alle hier aufgelisteten Umfragen (nach Code) "
+"verhindern. Verwenden Sie *, um die Bearbeitung aller Umfragen zu verhindern."
+
+msgid "By default, only admins can decide which skills can be acquired through which course."
+msgstr ""
+"Standardmäßig können nur Administratoren entscheiden, welche Fähigkeiten "
+"durch welchen Kurs erworben werden können."
+
+msgid "Show to all users"
+msgstr "Allen Benutzern anzeigen"
+
+msgid "Mail confirmation"
+msgstr "E-Mail-Bestätigung"
+
+msgid "This enables a major feature that enables any item to be linked to (and as such to allow acquisition of) a skill. The feature still requires the teacher to confirm the acquisition of the skill, so the acquisition is not automatic."
+msgstr ""
+"Dies aktiviert eine wichtige Funktion, die es jedem Element ermöglicht, mit "
+"einer Fähigkeit verknüpft zu werden (und somit den Erwerb einer Fähigkeit zu "
+"ermöglichen). Die Funktion erfordert jedoch, dass der Trainer den Erwerb der "
+"Fähigkeit bestätigt, sodass der Erwerb nicht automatisch erfolgt."
+
+msgid "Add username to e-mail notification of subscription to session"
+msgstr ""
+"Benutzername in E-Mail-Benachrichtigung über die Anmeldung zur Session "
+"hinzufügen"
+
+msgid "When using the multiple learners subscription to a session, prevent the normal behaviour which is to unsubscribe users who are not in the right panel when clicking submit. Keep all users there."
+msgstr ""
+"Beim Verwenden des Abonnements für mehrere Lernende zu einer Session, "
+"verhindern Sie das normale Verhalten, welches darin besteht, Benutzer "
+"abzumelden, die sich nicht im richtigen Panel befinden, wenn Sie auf Senden "
+"klicken. Behalten Sie alle Benutzer bei."
+
+msgid "Only display users from active sessions in tracking"
+msgstr "Nur Nutzer aus aktiven Sessions im Tracking anzeigen"
+
+msgid "Limit subscriptions to course to only users of the session"
+msgstr "Beschränken Sie die Kursanmeldungen nur auf Benutzer der Session"
+
+msgid "Define names for levels of skills as an array of id => name."
+msgstr "Festlegen von Namen für Kompetenzniveaus als Array von id => Name."
+
+msgid "Redirect to session after registration in session's 'About' page"
+msgstr ""
+"Weiterleitung zur Session nach der Registrierung auf der Seite 'Über die "
+"Session'"
+
+msgid "Session cookie samesite"
+msgstr "Session-Cookie SameSite"
+
+msgid "Redirect to assignments list after uploading an assignment or a adding a comment"
+msgstr ""
+"Nach dem Hochladen einer Aufgabe oder dem Hinzufügen eines Kommentars zur "
+"Liste der Aufgaben weiterleiten"
+
+msgid "Public"
+msgstr "Öffentlich"
+
+msgid "Search shows unlinked results"
+msgstr "Die Suche zeigt nicht verknüpfte Ergebnisse"
+
+msgid "Set the user to use as creator of the automatically-created sessions (to avoid assigning every session to user '1' which is often the portal administrator)."
+msgstr ""
+"Legen Sie den Benutzer fest, der als Ersteller der automatisch erstellten "
+"Sessions verwendet werden soll (um zu vermeiden, dass jede Session dem "
+"Benutzer '1' zugewiesen wird, der oft der Portaladministrator ist)."
+
+msgid "Icons text"
+msgstr "Symboltext"
+
+msgid "Score div percent"
+msgstr "Punkteverteilung in Prozent"
+
+msgid "Hide link to session page"
+msgstr "Link zur Session-Seite ausblenden"
+
+msgid "Course registration code incorrect"
+msgstr "Kursanmeldecode falsch"
+
+msgid "Auto-created sessions duration"
+msgstr "Automatisch erstellte Session-Dauer"
+
+msgid "Teachers and admins see students as friends on social network"
+msgstr ""
+"Lehrkräfte und Administratoren sehen Lernende als Freunde im sozialen "
+"Netzwerk"
+
+msgid "The admin can see the number of users in each session. This adds additional weight to the sessions list, so if you use it often, consider carefully whether you want the extra waiting time."
+msgstr ""
+"Der Administrator kann die Anzahl der Benutzer in jeder Session sehen. Dies "
+"erhöht die Belastung der Sessionsliste, also überlegen Sie sorgfältig, ob "
+"Sie die zusätzliche Wartezeit in Kauf nehmen möchten."
+
+msgid "Sessions that include the course are listed in the reporting tool inside the course itself, which can add considerable weight if the same course is used in hundreds of sessions. This option removes that list."
+msgstr ""
+"Sitzungen, die den Kurs beinhalten, werden im Berichtswerkzeug innerhalb des "
+"Kurses aufgelistet, was erheblich ins Gewicht fallen kann, wenn derselbe "
+"Kurs in hunderten von Sitzungen verwendet wird. Diese Option entfernt diese "
+"Liste."
+
+msgid "Session admins can access all course content"
+msgstr "Session-Administratoren können auf alle Kursinhalte zugreifen"
+
+msgid "Ppt_to_lp"
+msgstr "Dokumentenkonverter"
+
+msgid "Show only sessions"
+msgstr "Nur Sessions anzeigen"
+
+msgid "No reply email sender"
+msgstr "No-reply E-Mail-Absender"
+
+msgid "Sessions by duration always available to coaches"
+msgstr "Sessionen nach Dauer sind immer für Trainer verfügbar"
+
+msgid "Private"
+msgstr "Privat"
+
+msgid "Sort session templates by id in session creation form"
+msgstr "Sessionvorlagen nach ID im Erstellungsformular für Sessions sortieren"
+
+msgid "Display link to 'pending' assignments from My courses page"
+msgstr "Anzeige des Links zu 'anstehenden' Aufgaben auf der Seite 'Meine Kurse'"
+
+msgid "Show diagnosis"
+msgstr "Diagnose anzeigen"
+
+msgid "When a user subscribes to an open course through the courses catalogue, create a single-user session instead of subscribing him/her to the base course."
+msgstr ""
+"Wenn ein Benutzer sich über den Kurskatalog für einen offenen Kurs anmeldet, "
+"erstellen Sie eine Einzelbenutzer-Session, anstatt ihn/sie für den Basis-"
+"Kurs einzuschreiben."
+
+msgid "Customize course-session tracking columns"
+msgstr "Anpassen der Spalten für die Kurs-Session-Verfolgung"
+
+msgid "Campus homepage"
+msgstr "Campus-Startseite"
+
+msgid "By default, sessions are ordered by start date. Change this by providing an array of type ['field' => 'end_date', 'order' => 'desc']."
+msgstr ""
+"Standardmäßig werden Sessions nach Startdatum sortiert. Ändern Sie dies, "
+"indem Sie ein Array vom Typ ['field' => 'end_date', 'order' => 'desc'] "
+"bereitstellen."
+
+msgid "Score percent"
+msgstr "Prozentpunkte"
+
+msgid "Show glossary in documents is automatic"
+msgstr "Das Anzeigen des Glossars in Dokumenten erfolgt automatisch"
+
+msgid "Prevent teacher from modifying assignment scores"
+msgstr "Verhindern Sie, dass Trainer die Punktzahlen für Aufgaben ändern"
+
+msgid "Let teachers set some courses in read-only mode when opened through sessions. In the course properties, check the 'Lock course in session' option."
+msgstr ""
+"Lehrkräfte können einige Kurse im Nur-Lese-Modus einstellen, wenn sie über "
+"Sessions geöffnet werden. In den Kurseigenschaften wählen Sie die Option "
+"'Kurs in der Session sperren'."
+
+msgid "Course catalogue"
+msgstr "Kurskatalog"
+
+msgid "Session name and course title"
+msgstr "Sessionname und Kurstitel"
+
+msgid "Array of options to apply as default parameters in the CSV/XML session import."
+msgstr ""
+"Array von Optionen, die als Standardparameter beim CSV/XML-Sessionimport "
+"angewendet werden sollen."
+
+msgid "Show skills as a hierarchical table"
+msgstr "Fähigkeiten in einer hierarchischen Tabelle anzeigen"
+
+msgid "Select the default tab you want to see when opening the sessions list as admin."
+msgstr ""
+"Wählen Sie den Standard-Tab, den Sie beim Öffnen der Sessionsliste als "
+"Administrator sehen möchten."
+
+msgid "Session admins can disable users"
+msgstr "Session-Administratoren können Benutzer deaktivieren"
+
+msgid "Black list"
+msgstr "Schwarze Liste"
+
+msgid "Allow user to collapse sessions in My sessions"
+msgstr "Erlauben Sie dem Benutzer, Sessions in Meine Sessions zu minimieren"
+
+msgid "Auto-created session's creator ID"
+msgstr "Automatisch erstellte Session-Ersteller-ID"
+
+msgid "Add actions (usually connected to plugins) in the list of surveys. Use array syntax ['myplugin' => ['MyPlugin', 'urlGeneratorCallback']]."
+msgstr ""
+"Fügen Sie Aktionen (normalerweise mit Plugins verbunden) in die Liste der "
+"Umfragen ein. Verwenden Sie die Array-Syntax ['myplugin' => ['MyPlugin', "
+"'urlGeneratorCallback']]."
+
+msgid "World"
+msgstr "Welt"
+
+msgid "Hide tabs on the session page"
+msgstr "Tabs auf der Session-Seite ausblenden"
+
+msgid "Default sessions list view"
+msgstr "Standardansicht der Sessionsliste"
+
+msgid "Define an array of columns for the following reports: 'course_session', 'my_students_lp', 'my_progress_lp', 'my_progress_courses'."
+msgstr ""
+"Definieren Sie ein Array von Spalten für die folgenden Berichte: "
+"'course_session', 'my_students_lp', 'my_progress_lp', 'my_progress_courses'."
+
+msgid "Duration (in days) of the single-user, auto-created sessions. After expiry, the user cannot register to the same course (no other session is created)."
+msgstr ""
+"Dauer (in Tagen) der automatisch erstellten Einzelbenutzer-Sessions. Nach "
+"Ablauf kann sich der Benutzer nicht für denselben Kurs anmelden (es wird "
+"keine weitere Session erstellt)."
+
+msgid "Course coach email sender"
+msgstr "Kurstutor E-Mail-Versender"
+
+msgid "Show all learner publications (from base course and from all sessions) in the work/pending.php page of the base course."
+msgstr ""
+"Alle Lernendenpublikationen (aus dem Basiskurs und aus allen Sessions) auf "
+"der Seite work/pending.php des Basiskurses anzeigen."
+
+msgid "Enable sessions search diagnosis"
+msgstr "Aktivieren Sie die Diagnose der Sessionsuche"
+
+msgid "Allow teachers to set which skills are acquired through their courses"
+msgstr ""
+"Erlauben Sie Trainern festzulegen, welche Fähigkeiten durch ihre Kurse "
+"erworben werden"
+
+msgid "Enable My assignments page"
+msgstr "Aktivieren Sie die Seite 'Meine Aufgaben'"
+
+msgid "Sessions support manual sorting"
+msgstr "Sessionen unterstützen manuelle Sortierung"
+
+msgid "Fields to search by in catalogue"
+msgstr "Suchfelder im Katalog"
+
+msgid "Add additional actions (as links) to survey lists for teachers"
+msgstr ""
+"Fügen Sie zusätzliche Aktionen (als Links) zu den Umfragelisten für Trainer "
+"hinzu"
+
+msgid "Change the default sorting of session in My sessions"
+msgstr "Ändern Sie die Standardsortierung der Session in Meine Sessions"
+
+msgid "Prevent assignments edition"
+msgstr "Verhinderung der Bearbeitung von Aufgaben"
+
+msgid "Prevent adding documents to assignments"
+msgstr "Verhindern Sie das Hinzufügen von Dokumenten zu Aufgaben"
+
+msgid "Left"
+msgstr "Links"
+
+msgid "Show glossary in documents is none"
+msgstr "Im Dokument angezeigtes Glossar ist keines"
+
+msgid "Allow tutors to get a diagnosis that will allow them to search for the best sessions for learners."
+msgstr ""
+"Ermöglichen Sie Tutoren, eine Diagnose zu erhalten, die es ihnen erlaubt, "
+"die besten Sessions für Lernende zu suchen."
+
+msgid "Save diagnosis changes"
+msgstr "Diagnoseänderungen speichern"
+
+msgid "Hide sessions list in reporting tool"
+msgstr "Sitzungsliste im Berichtstool ausblenden"
+
+msgid "Set mandatory extra fields in session creation form"
+msgstr "Pflichtfelder im Formular zur Erstellung einer Session festlegen"
+
+msgid "Score average"
+msgstr "Durchschnittliche Punktzahl"
+
+msgid "Session admins can delete users"
+msgstr "Session-Administratoren können Benutzer löschen"
+
+msgid "Hide catalogue"
+msgstr "Katalog ausblenden"
+
+msgid "Right"
+msgstr "Rechts"
+
+msgid "Search hides unlinked results"
+msgstr "Die Suche blendet nicht verknüpfte Ergebnisse aus"
+
+msgid "Force users to download the provided document in the assignment definition before they can upload their assignment."
+msgstr ""
+"Benutzer müssen das im Arbeitsauftrag bereitgestellte Dokument "
+"herunterladen, bevor sie ihren Arbeit hochladen können."
+
+msgid "Enable linking skills to items"
+msgstr "Fähigkeiten mit Elementen verknüpfen aktivieren"
+
+msgid "Allow teachers to see who answered in anonymous surveys"
+msgstr ""
+"Erlauben Sie Trainern einzusehen, wer bei anonymen Umfragen geantwortet hat"
+
+msgid "Session admins can 'login as' teachers"
+msgstr "Session-Administratoren können sich als Trainer 'anmelden als'"
+
+msgid "Hide search form in sessions list"
+msgstr "Suchformular in der Sessionsliste ausblenden"
+
+msgid "Session admin can access batch user import, update and export"
+msgstr ""
+"Der Session-Administrator kann auf den Massenbenutzerimport, -aktualisierung "
+"und -export zugreifen"
+
+msgid "Allows admins to hide survey reporting button if surveys are used to survey teachers."
+msgstr ""
+"Ermöglicht Administratoren, die Schaltfläche für die Berichterstattung von "
+"Umfragen auszublenden, wenn Umfragen dazu verwendet werden, Lehrkräfte zu "
+"befragen."
+
+msgid "Set preferences for the courses and sessions catalogues search options. If defined, this array will be used as a strict list of fields to let users search by."
+msgstr ""
+"Legen Sie die Einstellungen für die Suchoptionen im Kurs- und Session-"
+"Katalog fest. Wenn definiert, wird dieses Array als strikte Liste von "
+"Feldern verwendet, nach denen Benutzer suchen können."
+
+msgid "None"
+msgstr "Keine"
+
+msgid "Carbon copy receiver profile picture"
+msgstr "Empfängerprofilbild in Kopie"
+
+msgid "This will allow teachers to give an estimated time effort (in hh:mm:ss format) to complete the assignment. Upon submission of the assignment and approval by the teacher (the assignment is given a score), the learner will automatically be assigned the corresponding time."
+msgstr ""
+"Dies ermöglicht es den Trainern, eine geschätzte Zeitaufwand (im hh:mm:ss-"
+"Format) für die Fertigstellung des Arbeitsauftrags anzugeben. Nach "
+"Einreichung des Arbeitsauftrags und Genehmigung durch den Trainer (der "
+"Arbeitsauftrag erhält eine Bewertung), wird dem Lernenden automatisch die "
+"entsprechende Zeit zugewiesen."
+
+msgid "Disable add class in session course for non-admin"
+msgstr ""
+"Deaktivieren Sie das Hinzufügen von Klassen im Session-Kurs für Nicht-"
+"Administratoren"
+
+msgid "My progress: show course details in session"
+msgstr "Mein Fortschritt: Kursdetails in der Session anzeigen"
+
+msgid "Array of relationships between user extra fields and session extra fields, so the session can be pre-filled with data matching the user's data."
+msgstr ""
+"Array von Beziehungen zwischen zusätzlichen Benutzerfeldern und zusätzlichen "
+"Sessionfeldern, damit die Session mit Daten vorausgefüllt werden kann, die "
+"den Daten des Benutzers entsprechen."
+
+msgid "Load diagnosis"
+msgstr "Diagnose laden"
+
+msgid "Skill levels names"
+msgstr "Namen der Fähigkeitsstufen"
+
+msgid "Send notification to learner when a skill/badge has been acquired"
+msgstr ""
+"Benachrichtigung an Lernenden senden, wenn eine Fähigkeit/Abzeichen erworben "
+"wurde"
+
+msgid "Pre-fill session fields with user fields"
+msgstr "Sessionfelder mit Benutzerfeldern vorbelegen"
+
+msgid "Prevent duplicate uploads in assignments"
+msgstr "Verhindern Sie doppelte Uploads bei Aufgaben"
+
+msgid "Session admins can edit course content"
+msgstr "Session-Administratoren können Kursinhalte bearbeiten"
+
+msgid "Enable time effort for assignments"
+msgstr "Aktivieren Sie den Zeitaufwand für Aufgaben"
+
+msgid "Hide link to the session page from the sessions list."
+msgstr "Link zur Session-Seite in der Sessionsliste ausblenden."
+
+msgid "If enabled, skills can only be visible for admins, teachers (related to a user via a course), and HRM users (if related to a user)."
+msgstr ""
+"Wenn aktiviert, sind Kompetenzen nur für Administratoren, Lehrkräfte (die "
+"über einen Kurs mit einem Benutzer verbunden sind) und HR-Benutzer (wenn sie "
+"mit einem Benutzer verbunden sind) sichtbar."
+
+msgid "Session admins are forbidden access to the users list"
+msgstr "Session-Administratoren ist der Zugriff auf die Benutzerliste untersagt"
+
+msgid "Hide session chart in My progress"
+msgstr "Sessiondiagramm in Mein Fortschritt ausblenden"
+
+msgid "Require the listed fields during session creation."
+msgstr "Erforderliche Felder bei der Erstellung einer Session angeben."
+
+msgid "Add reset password link to e-mail notification of subscription to session"
+msgstr ""
+"Den Link zum Zurücksetzen des Passworts zur E-Mail-Benachrichtigung über die "
+"Anmeldung zur Session hinzufügen"
+
+msgid "Options for session import"
+msgstr "Optionen für den Session-Import"
+
+msgid "Show courses and sessions"
+msgstr "Kurse und Sessions anzeigen"
+
+msgid "Allow teachers to access learners' skills"
+msgstr "Erlauben Sie Trainern den Zugriff auf die Fähigkeiten der Lernenden"
+
+msgid "Display all details of each course in session when clicking on session details."
+msgstr ""
+"Zeigen Sie alle Details jedes Kurses in der Session an, wenn Sie auf "
+"Sessiondetails klicken."
+
+msgid "Mark all survey questions as 'required' by default"
+msgstr "Alle Umfragefragen standardmäßig als 'erforderlich' markieren"
+
+msgid "White list"
+msgstr "Weiße Liste"
+
+msgid "Redirect to assigment tool homepage after upload or comment"
+msgstr ""
+"Nach dem Hochladen oder Kommentieren zur Startseite des Arbeitstools umleiten"
+
+msgid "Otherwise, session coaches only have access to sessions by duration during the active duration."
+msgstr ""
+"Andernfalls haben Session-Trainer nur während der aktiven Dauer Zugriff auf "
+"Sessions nach Dauer."
+
+msgid "Hide skill levels feature"
+msgstr "Funktion zur Verbergung von Kompetenzstufen"
+
+msgid "Show glossary in documents is manual"
+msgstr "Das Glossar in Dokumenten anzeigen ist manuell"
+
+msgid "Receiver profile picture"
+msgstr "Empfängerprofilbild"
+
+msgid "Disable tab to add classes in session course for non-admins."
+msgstr ""
+"Deaktivieren Sie die Tab zum Hinzufügen von Klassen im Session-Kurs für "
+"Nicht-Administratoren."
+
+msgid "The survey duplication feature is oriented towards teachers and is meant to ask teachers to give their appreciation about each student in order. This option will order the questions by learner's lastname."
+msgstr ""
+"Die Duplikationsfunktion der Umfrage richtet sich an Trainer und soll "
+"Trainer dazu anregen, ihre Wertschätzung für jeden Lernenden in der "
+"Reihenfolge zu geben. Diese Option wird die Fragen nach dem Nachnamen des "
+"Lernenden sortieren."
From 671ce58e3a060d753042e5ab8fc7931808ef8cb0 Mon Sep 17 00:00:00 2001
From: Angel Fernando Quiroz Campos
Date: Thu, 16 May 2024 11:48:34 -0500
Subject: [PATCH 229/413] LP: Exclude forum when loading frame ready deps -
refs BT#21633
---
public/main/lp/lp_view.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/public/main/lp/lp_view.php b/public/main/lp/lp_view.php
index b04a1081f62..4778da4c7a8 100644
--- a/public/main/lp/lp_view.php
+++ b/public/main/lp/lp_view.php
@@ -565,7 +565,7 @@
'#content_id, #content_id_blank',
$itemType,
'function () {
- var arr = ["link", "sco", "xapi", "quiz", "h5p"];
+ var arr = ["link", "sco", "xapi", "quiz", "h5p", "forum"];
return $.inArray(olms.lms_item_type, arr) !== -1;
}'
From 544f84721971783e2b6b0bb2cd944824a3f29c95 Mon Sep 17 00:00:00 2001
From: Angel Fernando Quiroz Campos
Date: Thu, 16 May 2024 13:08:00 -0500
Subject: [PATCH 230/413] Add method to find user by id in userService.js #
---
assets/vue/services/userService.js | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/assets/vue/services/userService.js b/assets/vue/services/userService.js
index 06c0ee04c0a..634dad666ba 100644
--- a/assets/vue/services/userService.js
+++ b/assets/vue/services/userService.js
@@ -8,6 +8,14 @@ async function find(userIri) {
return await baseService.get(userIri)
}
+/**
+ * @param {number} userId
+ * @returns {Promise}
+ */
+async function findById(userId) {
+ return await baseService.get(`/api/users/${userId}`)
+}
+
/**
* @param {Object} searchParams
* @returns {Promise<{totalItems, items}>}
@@ -34,6 +42,7 @@ async function findBySearchTerm(term) {
export default {
find,
+ findById,
findAll,
findByUsername,
findBySearchTerm,
From 137bc1ce0de312e2cf78ce71a97930ce29839e0a Mon Sep 17 00:00:00 2001
From: Daniel <50702276+daniboygg@users.noreply.github.com>
Date: Thu, 16 May 2024 20:09:48 +0200
Subject: [PATCH 231/413] Disable send button on message when title and
receivers are not set #5465
* Messages: use new component to show user profile when query has user to parameter
* Messages: use async/await for consistency with other code
* Change hardcoded url from component to userService so all strings
related to endpoints are in the same place
* Messages: allow send message only when title and to is defined
* Messages: migrate a function from deprecated service to a new one
* Add documentation on how to migrate message service
---------
Co-authored-by: Angel Fernando Quiroz Campos
---
assets/vue/services/message.js | 23 +++++++++-
assets/vue/services/userService.js | 6 +--
assets/vue/views/message/MessageCreate.vue | 52 +++++++++++++++-------
3 files changed, 59 insertions(+), 22 deletions(-)
diff --git a/assets/vue/services/message.js b/assets/vue/services/message.js
index 507b6635bc4..5bc6a575a62 100644
--- a/assets/vue/services/message.js
+++ b/assets/vue/services/message.js
@@ -1,3 +1,22 @@
-import makeService from './api';
+import makeService from "./api"
+import baseService from "./baseService"
-export default makeService('messages');
+// MIGRATION IN PROGRESS. makeService is deprecated
+// if you use some method in this service you should try to refactor it with new baseService defining async functions
+// like create below. A fully migrated service looks like: assets/vue/services/userService.js.
+// BE AWARE that makeService use vuex, so we need to ensure behaviour to be the same as the older service
+// When makeService is fully migrated, export by default the const messageService and change imports in all components
+// that use this service
+export default makeService("messages")
+
+/**
+ * @param {Object} message
+ * @returns {Promise}
+ */
+async function create(message) {
+ return await baseService.post("/api/messages", message)
+}
+
+export const messageService = {
+ create,
+}
diff --git a/assets/vue/services/userService.js b/assets/vue/services/userService.js
index 634dad666ba..fe8a9947d02 100644
--- a/assets/vue/services/userService.js
+++ b/assets/vue/services/userService.js
@@ -1,11 +1,11 @@
import baseService from "./baseService"
/**
- * @param {string} userIri
+ * @param {string} userId
* @returns {Promise}
*/
-async function find(userIri) {
- return await baseService.get(userIri)
+async function find(userId) {
+ return await baseService.get(`/api/users/${userId}`)
}
/**
diff --git a/assets/vue/views/message/MessageCreate.vue b/assets/vue/views/message/MessageCreate.vue
index 32aefac4899..4d922d44f0a 100644
--- a/assets/vue/views/message/MessageCreate.vue
+++ b/assets/vue/views/message/MessageCreate.vue
@@ -5,14 +5,14 @@
>
-
-
+
+ {{ t('Send is disabled because title of message or "to" recipent are not filled in') }}
+
@@ -52,20 +60,20 @@
From 8651bb22324de8d2f1ed62460fd374a480fa30c6 Mon Sep 17 00:00:00 2001
From: Angel Fernando Quiroz Campos
Date: Thu, 16 May 2024 13:37:42 -0500
Subject: [PATCH 232/413] Use method to find user by id from userSService.js
#5434
---
assets/vue/services/userService.js | 6 +++---
assets/vue/views/message/MessageCreate.vue | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/assets/vue/services/userService.js b/assets/vue/services/userService.js
index fe8a9947d02..634dad666ba 100644
--- a/assets/vue/services/userService.js
+++ b/assets/vue/services/userService.js
@@ -1,11 +1,11 @@
import baseService from "./baseService"
/**
- * @param {string} userId
+ * @param {string} userIri
* @returns {Promise}
*/
-async function find(userId) {
- return await baseService.get(`/api/users/${userId}`)
+async function find(userIri) {
+ return await baseService.get(userIri)
}
/**
diff --git a/assets/vue/views/message/MessageCreate.vue b/assets/vue/views/message/MessageCreate.vue
index 4d922d44f0a..c06edb97816 100644
--- a/assets/vue/views/message/MessageCreate.vue
+++ b/assets/vue/views/message/MessageCreate.vue
@@ -165,7 +165,7 @@ onMounted(async () => {
isLoadingUser.value = true
try {
- let user = await userService.find(route.query.send_to_user)
+ let user = await userService.findById(route.query.send_to_user)
sendToUser.value = user
usersTo.value.push({
From 99371e075235275cb4b721b438b2868020d4e52d Mon Sep 17 00:00:00 2001
From: Angel Fernando Quiroz Campos
Date: Thu, 16 May 2024 13:38:04 -0500
Subject: [PATCH 233/413] Minor: Remove unnecessary message when button is
disabled #5434
---
assets/vue/views/message/MessageCreate.vue | 6 ------
1 file changed, 6 deletions(-)
diff --git a/assets/vue/views/message/MessageCreate.vue b/assets/vue/views/message/MessageCreate.vue
index c06edb97816..8d1b61e131f 100644
--- a/assets/vue/views/message/MessageCreate.vue
+++ b/assets/vue/views/message/MessageCreate.vue
@@ -47,12 +47,6 @@
class="mb-2"
@click="onSubmit"
/>
-
- {{ t('Send is disabled because title of message or "to" recipent are not filled in') }}
-
From 0db97271379e1846ae4572d98c622bfdfa4a50a9 Mon Sep 17 00:00:00 2001
From: christianbeeznst
Date: Thu, 16 May 2024 14:32:21 -0500
Subject: [PATCH 234/413] Learnpath: Fix lesson title block update issue -
BT#21691
---
assets/css/scorm.scss | 1 +
public/main/lp/ScormApi.php | 11 +++++++++++
public/main/lp/scorm_api.php | 19 +++++++++++++++++++
3 files changed, 31 insertions(+)
diff --git a/assets/css/scorm.scss b/assets/css/scorm.scss
index a6c06d8bf41..2bcb5bd70f7 100644
--- a/assets/css/scorm.scss
+++ b/assets/css/scorm.scss
@@ -398,6 +398,7 @@ body {
#learning_path_right_zone .tab-pane {
height: 100%;
position: relative;
+ margin-top: 30px;
}
#learning_path_right_zone .tab-pane iframe {
diff --git a/public/main/lp/ScormApi.php b/public/main/lp/ScormApi.php
index a265e13a629..15f10701288 100644
--- a/public/main/lp/ScormApi.php
+++ b/public/main/lp/ScormApi.php
@@ -818,6 +818,17 @@ public static function switchItem($lpId, $user_id, $view_id, $current_item, $nex
$updateMinTime"
;
+ $lpItemParents = $mylp->getCurrentItemParentNames($mylp->get_current_item_id());
+ $titleItemParents = '';
+ if (!empty($lpItemParents)) {
+ $escapedParents = array_map(function($parentTitle) {
+ return htmlspecialchars($parentTitle, ENT_QUOTES, 'UTF-8');
+ }, $lpItemParents);
+
+ $titleItemParents = json_encode($escapedParents);
+ }
+ $return .= "olms.lms_lp_item_parents={$titleItemParents};";
+
//$return .= 'updateGamificationValues(); ';
$mylp->set_error_msg('');
$mylp->prerequisites_match(); // Check the prerequisites are all complete.
diff --git a/public/main/lp/scorm_api.php b/public/main/lp/scorm_api.php
index 9f10d509b1c..f2aa7510076 100644
--- a/public/main/lp/scorm_api.php
+++ b/public/main/lp/scorm_api.php
@@ -203,6 +203,7 @@ function APIobject() {
olms.userfname = '';
olms.userlname = '';
olms.execute_stats = false;
+olms.lms_lp_item_parents = '';
var courseUrl = '?cid='+olms.lms_course_id+'&sid='+olms.lms_session_id;
var statsUrl = 'lp_controller.php' + courseUrl + '&action=stats';
@@ -1661,6 +1662,8 @@ function switch_item(current_item, next_item)
});
}
}
+
+ updateItemParentNames();
var mysrc = 'lp/lp_controller.php?action=content&lp_id=' + olms.lms_lp_id +
'&item_id=' + next_item + '&cid=' + olms.lms_course_id + '&sid=' + olms.lms_session_id;
var cont_f = $("#content_id");
@@ -1718,6 +1721,22 @@ function switch_item(current_item, next_item)
return true;
}
+/**
+* Updates the 'item-parent-names' div with the titles of the current item's parents.
+*/
+function updateItemParentNames() {
+ var parentNamesContainer = document.getElementById('item-parent-names');
+ if (parentNamesContainer) {
+ parentNamesContainer.innerHTML = '';
+ olms.lms_lp_item_parents.forEach(function(parentTitle) {
+ var h3 = document.createElement('h3');
+ h3.className = 'text-h5';
+ h3.textContent = parentTitle;
+ parentNamesContainer.appendChild(h3);
+ });
+ }
+}
+
/**
* Hide or show the navigation buttons if the current item is the First or Last
*/
From 0e320265de35af34239b96022cb478237c1a445b Mon Sep 17 00:00:00 2001
From: Angel Fernando Quiroz Campos
Date: Thu, 16 May 2024 15:18:51 -0500
Subject: [PATCH 235/413] Message: Complement condition to enable send button
#5434
---
assets/vue/views/message/MessageCreate.vue | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/assets/vue/views/message/MessageCreate.vue b/assets/vue/views/message/MessageCreate.vue
index 8d1b61e131f..9c417e250c6 100644
--- a/assets/vue/views/message/MessageCreate.vue
+++ b/assets/vue/views/message/MessageCreate.vue
@@ -114,7 +114,11 @@ const receiversCc = computed(() =>
)
const canSubmitMessage = computed(() => {
- return usersTo.value.length > 0 && item.value.title !== ""
+ return (
+ (usersTo.value.length > 0 || usersCc.value.length > 0) &&
+ item.value.title.trim() !== "" &&
+ item.value.content.trim() !== ""
+ )
})
const isLoading = ref(false)
From 4fb6699ebd30ec6bd91076633e3940e8e7cc5b10 Mon Sep 17 00:00:00 2001
From: Angel Fernando Quiroz Campos
Date: Thu, 16 May 2024 15:19:48 -0500
Subject: [PATCH 236/413] Message: Use MessageRelUser constants in JS #5434
---
assets/vue/components/message/constants.js | 6 ------
assets/vue/constants/entity/messagereluser.js | 2 ++
assets/vue/views/message/MessageCreate.vue | 5 +++--
3 files changed, 5 insertions(+), 8 deletions(-)
create mode 100644 assets/vue/constants/entity/messagereluser.js
diff --git a/assets/vue/components/message/constants.js b/assets/vue/components/message/constants.js
index a85af2bfa52..31419cf4398 100644
--- a/assets/vue/components/message/constants.js
+++ b/assets/vue/components/message/constants.js
@@ -11,9 +11,3 @@ export const MESSAGE_TYPE_INVITATION = 6;
export const MESSAGE_TYPE_CONVERSATION = 7;
export const MESSAGE_STATUS_DELETED = 3;
-
-/**
- * See: src/CoreBundle/Entity/MessageRelUser.php
- */
-export const MESSAGE_REL_USER_TYPE_TO = 1;
-export const MESSAGE_REL_USER_TYPE_CC = 2;
diff --git a/assets/vue/constants/entity/messagereluser.js b/assets/vue/constants/entity/messagereluser.js
new file mode 100644
index 00000000000..5b1987df19e
--- /dev/null
+++ b/assets/vue/constants/entity/messagereluser.js
@@ -0,0 +1,2 @@
+export const MESSAGE_REL_USER_TYPE_TO = 1
+export const MESSAGE_REL_USER_TYPE_CC = 2
diff --git a/assets/vue/views/message/MessageCreate.vue b/assets/vue/views/message/MessageCreate.vue
index 9c417e250c6..1f92588b3b1 100644
--- a/assets/vue/views/message/MessageCreate.vue
+++ b/assets/vue/views/message/MessageCreate.vue
@@ -68,6 +68,7 @@ import { useSecurityStore } from "../../store/securityStore"
import { messageService } from "../../services/message"
import messageAttachmentService from "../../services/messageattachment"
import MessageCommunicationParty from "./MessageCommunicationParty.vue"
+import { MESSAGE_REL_USER_TYPE_CC, MESSAGE_REL_USER_TYPE_TO } from "../../constants/entity/messagereluser"
const securityStore = useSecurityStore()
const router = useRouter()
@@ -102,14 +103,14 @@ const usersCc = ref([])
const receiversTo = computed(() =>
usersTo.value.map((userTo) => ({
receiver: userTo.value,
- receiverType: 1,
+ receiverType: MESSAGE_REL_USER_TYPE_TO,
})),
)
const receiversCc = computed(() =>
usersCc.value.map((userCc) => ({
receiver: userCc.value,
- receiverType: 2,
+ receiverType: MESSAGE_REL_USER_TYPE_CC,
})),
)
From 73e8c038a64770c7921b7cb6ad50d23511de99a9 Mon Sep 17 00:00:00 2001
From: Angel Fernando Quiroz Campos
Date: Thu, 16 May 2024 15:21:58 -0500
Subject: [PATCH 237/413] Message: Fix object returned in creation request
#5434
---
assets/vue/views/message/MessageCreate.vue | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/assets/vue/views/message/MessageCreate.vue b/assets/vue/views/message/MessageCreate.vue
index 1f92588b3b1..feee96f5c42 100644
--- a/assets/vue/views/message/MessageCreate.vue
+++ b/assets/vue/views/message/MessageCreate.vue
@@ -133,13 +133,11 @@ const onSubmit = async () => {
try {
const message = await messageService.create(item.value)
- console.log(message)
- const json_message = await message.json()
- console.log(json_message)
+
if (attachments.value.length > 0) {
for (const attachment of attachments.value) {
await messageAttachmentService.createWithFormData({
- messageId: json_message.id,
+ messageId: message.id,
file: attachment,
})
}
From 398a1aef801da045e0313240908f863a35acda6a Mon Sep 17 00:00:00 2001
From: Angel Fernando Quiroz Campos
Date: Thu, 16 May 2024 17:09:03 -0500
Subject: [PATCH 238/413] Internal: API: Fix condition to check access for
student - refs BT#21633
---
src/CoreBundle/Entity/Session.php | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/CoreBundle/Entity/Session.php b/src/CoreBundle/Entity/Session.php
index f4888eb0425..010dc1bd688 100644
--- a/src/CoreBundle/Entity/Session.php
+++ b/src/CoreBundle/Entity/Session.php
@@ -1245,12 +1245,12 @@ protected function compareDates(?DateTime $start, ?DateTime $end = null): bool
{
$now = new DateTime('now');
- if (!empty($start) && !empty($end) && ($now >= $start && $now <= $end)) {
- return true;
+ if (!empty($start) && !empty($end)) {
+ return $now >= $start && $now <= $end;
}
- if (!empty($start) && $now >= $start) {
- return true;
+ if (!empty($start)) {
+ return $now >= $start;
}
return !empty($end) && $now <= $end;
From 829cc22a4ade7cc0f655cd5da035e952880450a3 Mon Sep 17 00:00:00 2001
From: Angel Fernando Quiroz Campos
Date: Thu, 16 May 2024 18:20:44 -0500
Subject: [PATCH 239/413] Display: Use SectionHeader component in message list
- refs BT#21657
---
assets/vue/views/message/MessageList.vue | 17 +++++++----------
1 file changed, 7 insertions(+), 10 deletions(-)
diff --git a/assets/vue/views/message/MessageList.vue b/assets/vue/views/message/MessageList.vue
index 16c29a6656e..0a2f4cd550c 100644
--- a/assets/vue/views/message/MessageList.vue
+++ b/assets/vue/views/message/MessageList.vue
@@ -1,10 +1,5 @@
-
@@ -180,6 +176,7 @@ import { GET_USER_MESSAGE_TAGS } from "../../graphql/queries/MessageTag"
import { useNotification } from "../../composables/notification"
import { useMessageRelUserStore } from "../../store/messageRelUserStore"
import { useSecurityStore } from "../../store/securityStore"
+import SectionHeader from "../../components/layout/SectionHeader.vue"
const route = useRoute()
const router = useRouter()
From dee13162999a2dfa9ed8076c8ac81633d3d230aa Mon Sep 17 00:00:00 2001
From: Angel Fernando Quiroz Campos
Date: Thu, 16 May 2024 18:35:53 -0500
Subject: [PATCH 240/413] Display: Show sender full name in message list - refs
BT#21657
---
assets/vue/views/message/MessageList.vue | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/assets/vue/views/message/MessageList.vue b/assets/vue/views/message/MessageList.vue
index 0a2f4cd550c..77a2653c80b 100644
--- a/assets/vue/views/message/MessageList.vue
+++ b/assets/vue/views/message/MessageList.vue
@@ -104,8 +104,7 @@
:image-url="slotProps.data.sender.illustrationUrl"
:alt="t('Picture')"
/>
-
- {{ slotProps.data.sender.username }}
+ {{ slotProps.data.sender.fullName }}
Date: Thu, 16 May 2024 19:16:09 -0500
Subject: [PATCH 241/413] Display: Message: Show receiver list in the outbox
message list - refs BT#21657
---
assets/vue/views/message/MessageList.vue | 44 +++++++++++++++++++-----
1 file changed, 36 insertions(+), 8 deletions(-)
diff --git a/assets/vue/views/message/MessageList.vue b/assets/vue/views/message/MessageList.vue
index 77a2653c80b..1970acb17db 100644
--- a/assets/vue/views/message/MessageList.vue
+++ b/assets/vue/views/message/MessageList.vue
@@ -94,22 +94,44 @@
@sort="sortingChanged($event)"
>
-
+
-
- {{ slotProps.data.sender.fullName }}
+
+
+
+
+
+
+
+
Date: Thu, 16 May 2024 22:12:55 -0500
Subject: [PATCH 242/413] Internal: Fix ROLE_STUDENT_BOSS not having student
access in documents - refs BT#21717
---
.../Security/Authorization/Voter/ResourceNodeVoter.php | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/CoreBundle/Security/Authorization/Voter/ResourceNodeVoter.php b/src/CoreBundle/Security/Authorization/Voter/ResourceNodeVoter.php
index 0a081de4e36..c5c8867a6d4 100644
--- a/src/CoreBundle/Security/Authorization/Voter/ResourceNodeVoter.php
+++ b/src/CoreBundle/Security/Authorization/Voter/ResourceNodeVoter.php
@@ -370,6 +370,7 @@ protected function voteOnAttribute(string $attribute, $subject, TokenInterface $
$userRole = new GenericRole('ROLE_USER');
$student = new GenericRole('ROLE_STUDENT');
$teacher = new GenericRole('ROLE_TEACHER');
+ $studentBoss = new GenericRole('ROLE_STUDENT_BOSS');
$currentStudent = new GenericRole(self::ROLE_CURRENT_COURSE_STUDENT);
$currentTeacher = new GenericRole(self::ROLE_CURRENT_COURSE_TEACHER);
@@ -386,6 +387,7 @@ protected function voteOnAttribute(string $attribute, $subject, TokenInterface $
->addRole($userRole)
->addRole($student)
->addRole($teacher)
+ ->addRole($studentBoss)
->addRole($currentStudent)
->addRole($currentTeacher, self::ROLE_CURRENT_COURSE_STUDENT)
From d5a718b16198b3180e4d84e900b5b7927cb9c380 Mon Sep 17 00:00:00 2001
From: christianbeeznst
Date: Fri, 17 May 2024 00:11:16 -0500
Subject: [PATCH 243/413] Exercise: Fix missing notification to general tutor
for oral question - refs BT#21575
---
public/main/exercise/exercise.class.php | 2 +-
public/main/inc/lib/exercise.lib.php | 35 +++++++++++++++++++++++++
2 files changed, 36 insertions(+), 1 deletion(-)
diff --git a/public/main/exercise/exercise.class.php b/public/main/exercise/exercise.class.php
index 315356898c7..37f44f25a09 100644
--- a/public/main/exercise/exercise.class.php
+++ b/public/main/exercise/exercise.class.php
@@ -3631,7 +3631,7 @@ public function manage_answer(
$generatedFile = '';
if ($answerType == ORAL_EXPRESSION) {
- $generatedFile = ExerciseLib::getOralFeedbackAudio($exeId, $questionId);
+ $generatedFile = ExerciseLib::getOralFileAudio($exeId, $questionId);
}
$user_answer = '';
diff --git a/public/main/inc/lib/exercise.lib.php b/public/main/inc/lib/exercise.lib.php
index 8596951ee7c..10536a2fb74 100644
--- a/public/main/inc/lib/exercise.lib.php
+++ b/public/main/inc/lib/exercise.lib.php
@@ -5110,6 +5110,41 @@ public static function getOralFeedbackForm($attemptId, $questionId)
return $view->fetch($template);
}
+ /**
+ * Get the HTML audio element for the oral file of a specific track exercise question attempt.
+ */
+ public static function getOralFileAudio(int $trackExerciseId, int $questionId): string
+ {
+ /** @var TrackEExercise $trackExercise */
+ $trackExercise = Container::getTrackEExerciseRepository()->find($trackExerciseId);
+
+ if (null === $trackExercise) {
+ return '';
+ }
+
+ $questionAttempt = $trackExercise->getAttemptByQuestionId($questionId);
+
+ if (null === $questionAttempt) {
+ return '';
+ }
+
+ $assetRepo = Container::getAssetRepository();
+
+ $html = '';
+ foreach ($questionAttempt->getAttemptFiles() as $attemptFile) {
+ $html .= Display::tag(
+ 'audio',
+ '',
+ [
+ 'src' => $assetRepo->getAssetUrl($attemptFile->getAsset()),
+ 'controls' => '',
+ ]
+ );
+ }
+
+ return $html;
+ }
+
/**
* Get the audio component for a teacher audio feedback.
*/
From c9b08bb8005b175a36b7a78a13fa25dcc60693c8 Mon Sep 17 00:00:00 2001
From: Yannick Warnier
Date: Fri, 17 May 2024 10:07:39 +0200
Subject: [PATCH 244/413] Language: Update language terms
---
translations/messages.de.po | 10 +--
translations/messages.es.po | 169 +++++++++++++++++++++++++++++++++++-
2 files changed, 173 insertions(+), 6 deletions(-)
diff --git a/translations/messages.de.po b/translations/messages.de.po
index 0ece309c05c..3394173e885 100644
--- a/translations/messages.de.po
+++ b/translations/messages.de.po
@@ -1,7 +1,7 @@
msgid ""
msgstr ""
"Project-Id-Version: chamilo\n"
-"PO-Revision-Date: 2024-05-16 16:21+0000\n"
+"PO-Revision-Date: 2024-05-17 08:00+0000\n"
"Last-Translator: Yannick Warnier \n"
"Language-Team: German \n"
@@ -26673,8 +26673,8 @@ msgstr "Titel als HTML speichern"
msgid "In the course progress tool, you can print a PDF of the different elements. Set ‘portrait’ or ‘landscape’ (technical terms) to change it."
msgstr ""
"Im Werkzeug für den Kursfortschritt können Sie ein PDF der verschiedenen "
-"Elemente drucken. Stellen Sie 'Hochformat' oder 'Querformat' (technische "
-"Begriffe) ein, um es zu ändern."
+"Elemente drucken. Stellen Sie 'portrait' (Hochformat) oder 'landscape' "
+"(Querformat) ein, um es zu ändern."
msgid "When enabled, this option disables as well as possible the copy-pasting mechanisms. Useful in restrictive exams setups."
msgstr ""
@@ -27533,8 +27533,8 @@ msgstr "Standardanzahl der Tabellenzeilen"
msgid "Set ‘portrait’ or ‘landscape’ (technical terms) for PDF certificates."
msgstr ""
-"Stellen Sie das Format für PDF-Zertifikate auf 'Hochformat' oder "
-"'Querformat' ein."
+"Stellen Sie das Format für PDF-Zertifikate auf 'portrait' (Hochformat) oder "
+"'landscape' (Querformat) ein."
msgid "Enable sharing options for group document"
msgstr "Aktivieren Sie die Freigabeoptionen für das Gruppendokument"
diff --git a/translations/messages.es.po b/translations/messages.es.po
index fa3ed92346b..adcdd82da30 100644
--- a/translations/messages.es.po
+++ b/translations/messages.es.po
@@ -1,7 +1,7 @@
msgid ""
msgstr ""
"Project-Id-Version: chamilo\n"
-"PO-Revision-Date: 2024-05-16 12:58+0000\n"
+"PO-Revision-Date: 2024-05-17 08:00+0000\n"
"Last-Translator: Yannick Warnier \n"
"Language-Team: Spanish \n"
@@ -25809,3 +25809,170 @@ msgstr "Muestra solo las categorías coincidentes en el catálogo de cursos"
msgid "Extra fields to show on course creation form"
msgstr "Campos de perfil para mostrar en el formulario de creación de cursos"
+
+msgid "When using sessions, the default behaviour is to use the tool visibility defined in the base course. This setting changes that to allow coaches in session courses to adapt tool visibilities to their needs."
+msgstr ""
+"Al utilizar las sesiones, el comportamiento predeterminado es usar la "
+"visibilidad de la herramienta definida en el curso base. Esta configuración "
+"cambia eso para permitir que los tutores en los cursos de sesión adapten la "
+"visibilidad de las herramientas a sus necesidades."
+
+msgid "Sort users by specific info by default"
+msgstr "Ordenar usuarios por información específica de forma predeterminada"
+
+msgid "Hide documents download icon"
+msgstr "Ocultar icono de descarga de documentos"
+
+msgid "Compilatio is an anti-cheating service that compares text between two submissions and reports if there is a high probability the content (usually assignments) is not genuine."
+msgstr ""
+"Compilatio es un servicio antiplagio que compara el texto entre dos entregas "
+"e informa si hay una alta probabilidad de que el contenido (generalmente "
+"trabajos) no sea auténtico."
+
+msgid "Provide link to a bug reporting platform if not using the internal ticket manager."
+msgstr ""
+"Proporcionar un enlace a una plataforma de reporte de errores si no se "
+"utiliza el gestor de tickets interno."
+
+msgid "Set strict hosts list for cloud links"
+msgstr "Establecer lista estricta de hosts para enlaces en la nube"
+
+msgid "In the documents tool, hide the download icon from users."
+msgstr ""
+"En la herramienta de documentos, oculta el icono de descarga a los usuarios."
+
+msgid "In the course progress tool, you can print a PDF of the different elements. Set ‘portrait’ or ‘landscape’ (technical terms) to change it."
+msgstr ""
+"En la herramienta de progreso del curso, puedes imprimir un PDF de los "
+"diferentes elementos. Establece 'portrait' o 'landscape' (términos técnicos) "
+"para cambiarlo."
+
+msgid "When enabled, this option disables as well as possible the copy-pasting mechanisms. Useful in restrictive exams setups."
+msgstr ""
+"Cuando está activada, esta opción deshabilita lo mejor posible los "
+"mecanismos de copiar y pegar. Útil en configuraciones de exámenes "
+"restrictivos."
+
+msgid "PDF orientation for course progress"
+msgstr "Orientación del PDF para el avance temático"
+
+msgid "Some pages allow you to promote the portal or a course on social networks. Enable this setting to remove the links."
+msgstr ""
+"Algunas páginas le permiten promocionar el portal o un curso en redes "
+"sociales. Active esta configuración para eliminar los enlaces."
+
+msgid "The fields defined in this array will be mandatory in the course creation form."
+msgstr ""
+"Los campos definidos en este arreglo serán obligatorios en el formulario de "
+"creación de cursos."
+
+msgid "Hide social media links"
+msgstr "Ocultar enlaces de redes sociales"
+
+msgid "Make a virtual keyboard appear. This is useful when setting up restrictive exams in a physical room where students have no keyboard to limit their ability to cheat."
+msgstr ""
+"Haga aparecer un teclado virtual. Esto es útil al configurar exámenes "
+"restrictivos en una sala física donde los alumnos no tienen teclado para "
+"limitar su capacidad de hacer trampa."
+
+msgid "Disable copy-pasting"
+msgstr "Desactivar copiar y pegar"
+
+msgid "Compilatio settings"
+msgstr "Configuración de Compilatio"
+
+msgid "Whenever someone creates a new item in the documents tool, send a notification to users."
+msgstr ""
+"Cada vez que alguien crea un nuevo elemento en la herramienta de documentos, "
+"envía una notificación a los usuarios."
+
+msgid "Provide the name of the template folder from main/template/ to change the appearance and structure of this portal."
+msgstr ""
+"Proporcione el nombre de la carpeta de plantillas de main/template/ para "
+"cambiar la apariencia y estructura de este portal."
+
+msgid "If not empty, the course creation process will look for some fields in the user profile and auto-fill them for the course. For example, a teacher specialized in digital marketing could automatically set a « digital marketing » flag on each course (s)he creates."
+msgstr ""
+"Si no está vacío, el proceso de creación del curso buscará algunos campos en "
+"el perfil del usuario y los completará automáticamente para el curso. Por "
+"ejemplo, un tutor especializado en marketing digital podría establecer "
+"automáticamente una etiqueta de «marketing digital» en cada curso que crea."
+
+msgid "A general certificate is a certificate grouping all the accomplishments by the user in the courses (s)he followed."
+msgstr ""
+"Un certificado general es un certificado que agrupa todos los logros del "
+"usuario en los cursos que ha seguido."
+
+msgid "Extra fields to require on course creation form"
+msgstr ""
+"Campos de perfil adicionales para requerir en el formulario de creación de "
+"cursos"
+
+msgid "Send notification to students when document added"
+msgstr "Enviar notificación a los alumnos cuando se añada un documento"
+
+msgid "Set ‘portrait’ or ‘landscape’ (technical terms) for PDF certificates."
+msgstr ""
+"Establezca 'portrait' o 'landscape' (términos técnicos) para los "
+"certificados en PDF."
+
+msgid "Enable sharing options for group document"
+msgstr "Habilitar opciones de compartición para el documento de grupo"
+
+msgid "PDF orientation for certificates"
+msgstr "Orientación de PDF para certificados"
+
+msgid "The fields defined in this array will appear on the course settings page."
+msgstr ""
+"Los campos definidos en este arreglo aparecerán en la página de "
+"configuración del curso."
+
+msgid "Configure the Compilatio connection details here."
+msgstr "Configure los detalles de conexión de Compilatio aquí."
+
+msgid "The documents tool can integrate links to files in the cloud. The list of cloud services is limited to a hardcoded list, but you can define the ‘links’ array that will contain a list of your own list of services/URLs. The list defined here will replace the default list."
+msgstr ""
+"La herramienta de documentos puede integrar enlaces a archivos en la nube. "
+"La lista de servicios en la nube está limitada a una lista predefinida, pero "
+"puedes definir el arreglo 'enlaces' que contendrá una lista de tus propios "
+"servicios/URLs. La lista definida aquí reemplazará la lista predeterminada."
+
+msgid "Extra fields to show in course settings"
+msgstr "Campos de perfil para mostrar en la configuración del curso"
+
+msgid "Enable this if you have X-sendfile enabled at the web server level and you want to add the required headers for browsers to pick it up."
+msgstr ""
+"Actívelo si tiene X-sendfile habilitado a nivel del servidor web y desea "
+"agregar las cabeceras necesarias para que los navegadores puedan detectarlo."
+
+msgid "Use virtual keyboard"
+msgstr "Utilizar el teclado virtual"
+
+msgid "Enable Compilatio"
+msgstr "Activar Compilatio"
+
+msgid "Prefill course fields with fields from user"
+msgstr "Rellene previamente los campos del curso con campos del usuario"
+
+msgid "Enable general certificate"
+msgstr "Activar certificado general"
+
+msgid "Bug report link"
+msgstr "Enlace de informe de errores"
+
+msgid "Layout template"
+msgstr "Plantilla de diseño"
+
+msgid "Enable X-sendfile headers"
+msgstr "Activar encabezados X-sendfile"
+
+msgid "Order of user lastname and firstname"
+msgstr "Orden de apellido y nombre del usuario"
+
+msgid "Allow tool visibility edition in sessions"
+msgstr "Permitir la edición de la visibilidad de herramientas en sesiones"
+
+msgid "Enable sharing options for document inside group category"
+msgstr ""
+"Habilitar opciones de compartición para el documento dentro de la categoría "
+"de grupo"
From 11547fc08254ec0c72de18a738c94c53516f9d73 Mon Sep 17 00:00:00 2001
From: NicoDucou
Date: Fri, 17 May 2024 12:44:07 +0200
Subject: [PATCH 245/413] Exercise: Fix content and translation for oral
expression exercise notification to teacher - refs BT#21575
---
public/main/exercise/exercise.class.php | 10 +++++-----
translations/messages.ar.po | 2 ++
translations/messages.ca_ES.po | 2 ++
translations/messages.de.po | 3 +++
translations/messages.en.po | 3 +++
translations/messages.es.po | 3 +++
translations/messages.eu_ES.po | 2 ++
translations/messages.fr.po | 3 +++
translations/messages.gl_ES.po | 2 ++
translations/messages.he.po | 2 ++
translations/messages.it.po | 2 ++
translations/messages.nl.po | 3 +++
translations/messages.pl.po | 2 ++
translations/messages.pot | 3 +++
translations/messages.pt.po | 2 ++
translations/messages.pt_BR.po | 2 ++
translations/messages.ro.po | 2 ++
translations/messages.sk.po | 2 ++
translations/messages.sl.po | 2 ++
19 files changed, 47 insertions(+), 5 deletions(-)
diff --git a/public/main/exercise/exercise.class.php b/public/main/exercise/exercise.class.php
index 37f44f25a09..09fe0eaf54f 100644
--- a/public/main/exercise/exercise.class.php
+++ b/public/main/exercise/exercise.class.php
@@ -10735,22 +10735,22 @@ private function sendNotificationForOralQuestions(
';
$msg .= ' '.sprintf(
- get_lang('A learner has attempted one or more oral questionAreX'),
+ get_lang('The attempted oral questions are %s'),
$oral_question_list
).' ';
$msg1 = str_replace('#exercise#', $this->exercise, $msg);
$msg = str_replace('#firstName#', $user_info['firstname'], $msg1);
$msg1 = str_replace('#lastName#', $user_info['lastname'], $msg);
$msg = str_replace('#mail#', $user_info['email'], $msg1);
- $msg = str_replace('#course#', $courseInfo['name'], $msg1);
+ $msg1 = str_replace('#course#', $courseInfo['name'], $msg);
if (!in_array($origin, ['learnpath', 'embeddable'])) {
- $msg .= ' '.get_lang(
+ $msg1 .= ' '.get_lang(
'Click this link to check the answer and/or give feedback'
).'';
}
- $msg1 = str_replace('#url#', $url_email, $msg);
- $mail_content = $msg1;
+ $msg = str_replace('#url#', $url_email, $msg1);
+ $mail_content = $msg;
$subject = get_lang('A learner has attempted one or more oral question');
if (!empty($teachers)) {
diff --git a/translations/messages.ar.po b/translations/messages.ar.po
index 75dd880f05f..932e56e09c3 100644
--- a/translations/messages.ar.po
+++ b/translations/messages.ar.po
@@ -25052,3 +25052,5 @@ msgstr ""
msgid "%02d h %02d m %02d s"
msgstr ""
+msgid "The attempted oral questions are %s"
+msgstr "محاولة الاسئلة الشفوية هي %s"
diff --git a/translations/messages.ca_ES.po b/translations/messages.ca_ES.po
index 0ef9bd6bfe1..de61abfde39 100644
--- a/translations/messages.ca_ES.po
+++ b/translations/messages.ca_ES.po
@@ -25052,3 +25052,5 @@ msgstr ""
msgid "%02d h %02d m %02d s"
msgstr ""
+msgid "The attempted oral questions are %s"
+msgstr "Les preguntes orals respostes són: %s"
diff --git a/translations/messages.de.po b/translations/messages.de.po
index 3394173e885..41c685d762d 100644
--- a/translations/messages.de.po
+++ b/translations/messages.de.po
@@ -28970,3 +28970,6 @@ msgstr ""
"Trainer dazu anregen, ihre Wertschätzung für jeden Lernenden in der "
"Reihenfolge zu geben. Diese Option wird die Fragen nach dem Nachnamen des "
"Lernenden sortieren."
+
+msgid "The attempted oral questions are %s"
+msgstr "Die beantworteten mündlichen Fragen sind %s"
diff --git a/translations/messages.en.po b/translations/messages.en.po
index 88c28884615..66fbd9a5af0 100644
--- a/translations/messages.en.po
+++ b/translations/messages.en.po
@@ -27519,3 +27519,6 @@ msgstr "Obtained the following skills"
msgid "Certificate Footer"
msgstr ""
+
+msgid "The attempted oral questions are %s"
+msgstr "The attempted oral questions are %s"
diff --git a/translations/messages.es.po b/translations/messages.es.po
index adcdd82da30..02a5398c8e6 100644
--- a/translations/messages.es.po
+++ b/translations/messages.es.po
@@ -25976,3 +25976,6 @@ msgid "Enable sharing options for document inside group category"
msgstr ""
"Habilitar opciones de compartición para el documento dentro de la categoría "
"de grupo"
+
+msgid "The attempted oral questions are %s"
+msgstr "Las preguntas orales respondidas son: %s"
diff --git a/translations/messages.eu_ES.po b/translations/messages.eu_ES.po
index 4db7ddffa85..bbbc9d4cc54 100644
--- a/translations/messages.eu_ES.po
+++ b/translations/messages.eu_ES.po
@@ -25052,3 +25052,5 @@ msgstr ""
msgid "%02d h %02d m %02d s"
msgstr ""
+msgid "The attempted oral questions are %s"
+msgstr "Erantzun diren ahozko galderak honakoak dira: %s"
diff --git a/translations/messages.fr.po b/translations/messages.fr.po
index 49c1e6904b9..5d33ebb66aa 100644
--- a/translations/messages.fr.po
+++ b/translations/messages.fr.po
@@ -29216,3 +29216,6 @@ msgstr ""
msgid "No course session for this user"
msgstr "Pas de cours de session pour cet utilisateur"
+
+msgid "The attempted oral questions are %s"
+msgstr "Les questions orales auxquelles il a répondu sont: %s"
diff --git a/translations/messages.gl_ES.po b/translations/messages.gl_ES.po
index 51debb7182e..30ef7bfce98 100644
--- a/translations/messages.gl_ES.po
+++ b/translations/messages.gl_ES.po
@@ -25052,3 +25052,5 @@ msgstr ""
msgid "%02d h %02d m %02d s"
msgstr ""
+msgid "The attempted oral questions are %s"
+msgstr "As preguntas intentadas orais son %s"
diff --git a/translations/messages.he.po b/translations/messages.he.po
index fa4065c95f9..718466391a2 100644
--- a/translations/messages.he.po
+++ b/translations/messages.he.po
@@ -25052,3 +25052,5 @@ msgstr ""
msgid "%02d h %02d m %02d s"
msgstr ""
+msgid "The attempted oral questions are %s"
+msgstr "ניסיונות השאלות בעל פה הם %s"
diff --git a/translations/messages.it.po b/translations/messages.it.po
index 140603c78e8..0d3933f8da7 100644
--- a/translations/messages.it.po
+++ b/translations/messages.it.po
@@ -25052,3 +25052,5 @@ msgstr ""
msgid "%02d h %02d m %02d s"
msgstr ""
+msgid "The attempted oral questions are %s"
+msgstr "Le risposte orali date sono %s"
diff --git a/translations/messages.nl.po b/translations/messages.nl.po
index d347dc38bb2..9bb766cb271 100644
--- a/translations/messages.nl.po
+++ b/translations/messages.nl.po
@@ -25205,3 +25205,6 @@ msgstr ""
msgid "%02d h %02d m %02d s"
msgstr ""
+
+msgid "The attempted oral questions are %s"
+msgstr "De mondelinge vragen die werden geprobeerd zijn %s"
diff --git a/translations/messages.pl.po b/translations/messages.pl.po
index 2a1c7e7881c..310ce97bcd1 100644
--- a/translations/messages.pl.po
+++ b/translations/messages.pl.po
@@ -25052,3 +25052,5 @@ msgstr ""
msgid "%02d h %02d m %02d s"
msgstr ""
+msgid "The attempted oral questions are %s"
+msgstr "Wypróbowane pytania ustne to %s"
diff --git a/translations/messages.pot b/translations/messages.pot
index 81872ae7995..454230a0dca 100644
--- a/translations/messages.pot
+++ b/translations/messages.pot
@@ -27518,3 +27518,6 @@ msgstr ""
msgid "No course sessions for this user"
msgstr ""
+
+msgid "The attempted oral questions are %s"
+msgstr ""
diff --git a/translations/messages.pt.po b/translations/messages.pt.po
index 1b80395a419..9b26c5260d8 100644
--- a/translations/messages.pt.po
+++ b/translations/messages.pt.po
@@ -25052,3 +25052,5 @@ msgstr ""
msgid "%02d h %02d m %02d s"
msgstr ""
+msgid "The attempted oral questions are %s"
+msgstr "Foram feitas %s tentativas em questões orais"
diff --git a/translations/messages.pt_BR.po b/translations/messages.pt_BR.po
index ba154baf13d..0e79a8eed2f 100644
--- a/translations/messages.pt_BR.po
+++ b/translations/messages.pt_BR.po
@@ -25052,3 +25052,5 @@ msgstr ""
msgid "%02d h %02d m %02d s"
msgstr ""
+msgid "The attempted oral questions are %s"
+msgstr "A tentativas para as perguntas orais são %s"
diff --git a/translations/messages.ro.po b/translations/messages.ro.po
index c2f2b6fa76e..be2240e8667 100644
--- a/translations/messages.ro.po
+++ b/translations/messages.ro.po
@@ -25052,3 +25052,5 @@ msgstr ""
msgid "%02d h %02d m %02d s"
msgstr ""
+msgid "The attempted oral questions are %s"
+msgstr "Intrebarile orale raspunse sunt: %s"
diff --git a/translations/messages.sk.po b/translations/messages.sk.po
index 68b315551e4..1f4978ee597 100644
--- a/translations/messages.sk.po
+++ b/translations/messages.sk.po
@@ -25052,3 +25052,5 @@ msgstr ""
msgid "%02d h %02d m %02d s"
msgstr ""
+msgid "The attempted oral questions are %s"
+msgstr "Pokus o ústne otázky sú %s"
diff --git a/translations/messages.sl.po b/translations/messages.sl.po
index b2d335df15d..990d609b796 100644
--- a/translations/messages.sl.po
+++ b/translations/messages.sl.po
@@ -25052,3 +25052,5 @@ msgstr ""
msgid "%02d h %02d m %02d s"
msgstr ""
+msgid "The attempted oral questions are %s"
+msgstr "Ustna vprašanja s poskusi odgovorov so: %s"
From 3d21289aa331a086840939d32b0c53faffa31dfe Mon Sep 17 00:00:00 2001
From: Angel Fernando Quiroz Campos
Date: Fri, 17 May 2024 11:22:09 -0500
Subject: [PATCH 246/413] Minor: Format code
---
.../EventListener/CidReqListener.php | 6 ++---
.../EventListener/CourseAccessListener.php | 5 +---
.../Schema/V200/Version20240515124400.php | 25 ++++++++++---------
.../TrackECourseAccessRepository.php | 8 +++---
.../UserSessionSubscriptionsStateProvider.php | 4 +++
5 files changed, 26 insertions(+), 22 deletions(-)
diff --git a/src/CoreBundle/EventListener/CidReqListener.php b/src/CoreBundle/EventListener/CidReqListener.php
index fbe96b549ff..d4cbd118091 100644
--- a/src/CoreBundle/EventListener/CidReqListener.php
+++ b/src/CoreBundle/EventListener/CidReqListener.php
@@ -18,7 +18,6 @@
use Chamilo\CourseBundle\Controller\CourseControllerInterface;
use Chamilo\CourseBundle\Entity\CGroup;
use ChamiloSession;
-use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
@@ -273,14 +272,15 @@ public function cleanSessionHandler(Request $request): void
$courseId = $sessionHandler->get('cid', 0);
$sessionId = $sessionHandler->get('sid', 0);
$ip = $request->getClientIp();
- if ($courseId !== 0) {
+ if (0 !== $courseId) {
$token = $this->tokenStorage->getToken();
if (null !== $token) {
/** @var User $user */
$user = $token->getUser();
if ($user instanceof UserInterface) {
$this->entityManager->getRepository(TrackECourseAccess::class)
- ->logoutAccess($user, $courseId, $sessionId, $ip);
+ ->logoutAccess($user, $courseId, $sessionId, $ip)
+ ;
}
}
}
diff --git a/src/CoreBundle/EventListener/CourseAccessListener.php b/src/CoreBundle/EventListener/CourseAccessListener.php
index 364b155344c..67e32076218 100644
--- a/src/CoreBundle/EventListener/CourseAccessListener.php
+++ b/src/CoreBundle/EventListener/CourseAccessListener.php
@@ -10,11 +10,8 @@
use Chamilo\CoreBundle\Entity\User;
use Chamilo\CoreBundle\ServiceHelper\CidReqHelper;
use Chamilo\CoreBundle\ServiceHelper\UserHelper;
-use DateTime;
-use Symfony\Component\HttpKernel\Event\RequestEvent;
use Doctrine\ORM\EntityManagerInterface;
-use Symfony\Component\HttpFoundation\RequestStack;
-use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
+use Symfony\Component\HttpKernel\Event\RequestEvent;
/**
* In and outs of a course
diff --git a/src/CoreBundle/Migrations/Schema/V200/Version20240515124400.php b/src/CoreBundle/Migrations/Schema/V200/Version20240515124400.php
index 1290b641c36..afbb18283a7 100644
--- a/src/CoreBundle/Migrations/Schema/V200/Version20240515124400.php
+++ b/src/CoreBundle/Migrations/Schema/V200/Version20240515124400.php
@@ -4,12 +4,13 @@
namespace Chamilo\CoreBundle\Migrations\Schema\V200;
+use Chamilo\CoreBundle\Entity\ResourceFile;
+use Chamilo\CoreBundle\Entity\ResourceNode;
+use Chamilo\CoreBundle\Entity\TrackEDownloads;
use Chamilo\CoreBundle\Entity\User;
use Chamilo\CoreBundle\Migrations\AbstractMigrationChamilo;
use Doctrine\DBAL\Schema\Schema;
-use Chamilo\CoreBundle\Entity\TrackEDownloads;
-use Chamilo\CoreBundle\Entity\ResourceFile;
-use Chamilo\CoreBundle\Entity\ResourceNode;
+use Exception;
final class Version20240515124400 extends AbstractMigrationChamilo
{
@@ -35,7 +36,8 @@ public function up(Schema $schema): void
->setFirstResult($offset)
->setMaxResults($batchSize)
->getQuery()
- ->getResult();
+ ->getResult()
+ ;
if (empty($downloads)) {
break;
@@ -65,19 +67,20 @@ public function up(Schema $schema): void
if ($firstResourceLink && $user) {
$resourceLinkId = $firstResourceLink->getId();
$url = $resourceNode->getResourceFile()->getOriginalName();
- echo "Resource link $resourceLinkId Down id {$download->getDownId()} for $url: user " . $user->getFullname() . "\n";
+ echo "Resource link $resourceLinkId Down id {$download->getDownId()} for $url: user ".$user->getFullname()."\n";
- $this->connection->executeUpdate("UPDATE track_e_downloads SET resource_link_id = ? WHERE down_id = ?", [$resourceLinkId, $download->getDownId()]);
+ $this->connection->executeUpdate('UPDATE track_e_downloads SET resource_link_id = ? WHERE down_id = ?', [$resourceLinkId, $download->getDownId()]);
}
}
}
}
$this->entityManager->commit();
- } catch (\Exception $e) {
+ } catch (Exception $e) {
$this->entityManager->rollback();
$success = false;
- echo "Failed for download ID {$download->getDownId()}: " . $e->getMessage() . "\n";
+ echo "Failed for download ID {$download->getDownId()}: ".$e->getMessage()."\n";
+
break;
} finally {
$this->entityManager->clear();
@@ -88,13 +91,11 @@ public function up(Schema $schema): void
// Only delete if all updates were successful
if ($success) {
- $this->connection->executeUpdate("DELETE FROM track_e_downloads WHERE resource_link_id IS NULL");
+ $this->connection->executeUpdate('DELETE FROM track_e_downloads WHERE resource_link_id IS NULL');
} else {
echo "Process failed. No records were deleted.\n";
}
}
- public function down(Schema $schema): void
- {
- }
+ public function down(Schema $schema): void {}
}
diff --git a/src/CoreBundle/Repository/TrackECourseAccessRepository.php b/src/CoreBundle/Repository/TrackECourseAccessRepository.php
index 746ffca5b66..f1b2db7c0ec 100644
--- a/src/CoreBundle/Repository/TrackECourseAccessRepository.php
+++ b/src/CoreBundle/Repository/TrackECourseAccessRepository.php
@@ -9,6 +9,7 @@
use Chamilo\CoreBundle\Entity\TrackECourseAccess;
use Chamilo\CoreBundle\Entity\User;
use DateTime;
+use DateTimeZone;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
@@ -79,7 +80,7 @@ public function recordAccess(User $user, int $courseId, int $sessionId, string $
$access->setCId($courseId);
$access->setSessionId($sessionId);
$access->setUserIp($ip);
- $access->setLoginCourseDate(new \DateTime());
+ $access->setLoginCourseDate(new DateTime());
$access->setCounter(1);
$this->_em->persist($access);
$this->_em->flush();
@@ -90,7 +91,7 @@ public function recordAccess(User $user, int $courseId, int $sessionId, string $
*/
public function logoutAccess(User $user, int $courseId, int $sessionId, string $ip): void
{
- $now = new DateTime("now", new \DateTimeZone("UTC"));
+ $now = new DateTime('now', new DateTimeZone('UTC'));
$sessionLifetime = 3600;
$limitTime = (new DateTime())->setTimestamp(time() - $sessionLifetime);
@@ -106,7 +107,8 @@ public function logoutAccess(User $user, int $courseId, int $sessionId, string $
->orderBy('a.loginCourseDate', 'DESC')
->setMaxResults(1)
->getQuery()
- ->getOneOrNullResult();
+ ->getOneOrNullResult()
+ ;
if ($access) {
$access->setLogoutCourseDate($now);
diff --git a/src/CoreBundle/State/UserSessionSubscriptionsStateProvider.php b/src/CoreBundle/State/UserSessionSubscriptionsStateProvider.php
index 32bc7de1a45..171526eca39 100644
--- a/src/CoreBundle/State/UserSessionSubscriptionsStateProvider.php
+++ b/src/CoreBundle/State/UserSessionSubscriptionsStateProvider.php
@@ -8,6 +8,7 @@
use ApiPlatform\Metadata\Operation;
use ApiPlatform\State\ProviderInterface;
+use Chamilo\CoreBundle\Entity\Session;
use Chamilo\CoreBundle\Repository\Node\UserRepository;
use Chamilo\CoreBundle\Repository\SessionRepository;
use Chamilo\CoreBundle\ServiceHelper\AccessUrlHelper;
@@ -16,6 +17,9 @@
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
+/**
+ * @template-implements ProviderInterface
+ */
class UserSessionSubscriptionsStateProvider implements ProviderInterface
{
public function __construct(
From cea6d381a4b00108baed0a29c0e4161b033e17b4 Mon Sep 17 00:00:00 2001
From: christianbeeznst
Date: Fri, 17 May 2024 12:01:39 -0500
Subject: [PATCH 247/413] Internal: Fix special character issue in file
attachments for downloads - BT#21707
---
src/CoreBundle/Controller/ResourceController.php | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/src/CoreBundle/Controller/ResourceController.php b/src/CoreBundle/Controller/ResourceController.php
index 2256f816b00..1b00956a4ec 100644
--- a/src/CoreBundle/Controller/ResourceController.php
+++ b/src/CoreBundle/Controller/ResourceController.php
@@ -456,7 +456,7 @@ public function changeVisibilityAll(
/**
* @return mixed|StreamedResponse
*/
- private function processFile(Request $request, ResourceNode $resourceNode, string $mode = 'show', string $filter = '', ?array $allUserInfo = null)
+ private function processFile(Request $request, ResourceNode $resourceNode, string $mode = 'show', string $filter = '', ?array $allUserInfo = null): mixed
{
$this->denyAccessUnlessGranted(
ResourceNodeVoter::VIEW,
@@ -554,9 +554,6 @@ private function processFile(Request $request, ResourceNode $resourceNode, strin
$content = str_replace('', $links.'', $content);
}
$response->setContent($content);
- /*$contents = $this->renderView('@ChamiloCore/Resource/view_html.twig', [
- 'category' => '...',
- ]);*/
return $response;
}
@@ -572,7 +569,9 @@ function () use ($stream): void {
}
);
- // Transliterator::transliterate($fileName)
+ // Convert the file name to ASCII using iconv
+ $fileName = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $fileName);
+
$disposition = $response->headers->makeDisposition(
$forceDownload ? ResponseHeaderBag::DISPOSITION_ATTACHMENT : ResponseHeaderBag::DISPOSITION_INLINE,
$fileName
From 8b6cce8013cee5aaffbf78899ab697d179b41644 Mon Sep 17 00:00:00 2001
From: Angel Fernando Quiroz Campos
Date: Fri, 17 May 2024 13:10:53 -0500
Subject: [PATCH 248/413] CI: Fix test o check access by session dates
---
src/CoreBundle/Entity/Session.php | 3 +--
tests/CoreBundle/Repository/SessionRepositoryTest.php | 8 +++++---
2 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/src/CoreBundle/Entity/Session.php b/src/CoreBundle/Entity/Session.php
index 010dc1bd688..b2b1d0acaef 100644
--- a/src/CoreBundle/Entity/Session.php
+++ b/src/CoreBundle/Entity/Session.php
@@ -915,8 +915,7 @@ public function isCurrentlyAccessible(): bool
{
$now = new DateTime();
- return (null === $this->accessStartDate || $this->accessStartDate < $now)
- && (null === $this->accessEndDate || $now < $this->accessEndDate);
+ return (!$this->accessStartDate || $now >= $this->accessStartDate) && (!$this->accessEndDate || $now <= $this->accessEndDate);
}
public function addCourse(Course $course): self
diff --git a/tests/CoreBundle/Repository/SessionRepositoryTest.php b/tests/CoreBundle/Repository/SessionRepositoryTest.php
index 20309acad79..f99b91c2267 100644
--- a/tests/CoreBundle/Repository/SessionRepositoryTest.php
+++ b/tests/CoreBundle/Repository/SessionRepositoryTest.php
@@ -508,9 +508,11 @@ public function testCreateWithSessionCategory(): void
->setDuration(100)
->setStatus(1)
->setAccessStartDate(new DateTime())
- ->setAccessEndDate(new DateTime())
+ ->setAccessEndDate(new DateTime('+1 month'))
->setDisplayStartDate(new DateTime())
- ->setDisplayEndDate(new DateTime())
+ ->setDisplayEndDate(new DateTime('+1 month'))
+ ->setCoachAccessStartDate(new DateTime())
+ ->setCoachAccessEndDate(new DateTime('+1 month'))
->setPosition(1)
->setShowDescription(true)
->setDescription('desc')
@@ -532,7 +534,7 @@ public function testCreateWithSessionCategory(): void
$this->assertTrue($session->isActiveForStudent());
$this->assertTrue($session->isActiveForCoach());
- $this->assertFalse($session->isCurrentlyAccessible());
+ $this->assertTrue($session->isCurrentlyAccessible());
$user = $this->createUser('test');
$this->assertFalse($session->hasUserAsGeneralCoach($user));
From 57fdb5f6650752245683097eca000e395e0cb1ae Mon Sep 17 00:00:00 2001
From: christianbeeznst
Date: Fri, 17 May 2024 13:19:34 -0500
Subject: [PATCH 249/413] Internal: Fix special character issue in file
attachments from documents - BT#21707
---
src/CoreBundle/Controller/ResourceController.php | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/src/CoreBundle/Controller/ResourceController.php b/src/CoreBundle/Controller/ResourceController.php
index 1b00956a4ec..a4bfae3ab31 100644
--- a/src/CoreBundle/Controller/ResourceController.php
+++ b/src/CoreBundle/Controller/ResourceController.php
@@ -291,6 +291,9 @@ function () use ($zipName, $children, $repo): void {
}
);
+ // Convert the file name to ASCII using iconv
+ $zipName = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $zipName);
+
$disposition = $response->headers->makeDisposition(
ResponseHeaderBag::DISPOSITION_ATTACHMENT,
$zipName // Transliterator::transliterate($zipName)
@@ -505,6 +508,9 @@ private function processFile(Request $request, ResourceNode $resourceNode, strin
$response = $server->getImageResponse($fileName, $params);
+ // Convert the file name to ASCII using iconv
+ $fileName = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $fileName);
+
$disposition = $response->headers->makeDisposition(
ResponseHeaderBag::DISPOSITION_INLINE,
basename($fileName)
@@ -524,6 +530,9 @@ private function processFile(Request $request, ResourceNode $resourceNode, strin
$content = str_replace($tagsToReplace, $replacementValues, $content);
}
+ // Convert the file name to ASCII using iconv
+ $fileName = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $fileName);
+
$response = new Response();
$disposition = $response->headers->makeDisposition(
ResponseHeaderBag::DISPOSITION_INLINE,
From dadd1fddac8daea1e742272adf434ce591d00567 Mon Sep 17 00:00:00 2001
From: christianbeeznst
Date: Fri, 17 May 2024 22:12:39 -0500
Subject: [PATCH 250/413] Exercise: Display audio saved on return to exercise -
BT#21587
---
public/main/inc/lib/exercise.lib.php | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/public/main/inc/lib/exercise.lib.php b/public/main/inc/lib/exercise.lib.php
index 10536a2fb74..69949173417 100644
--- a/public/main/inc/lib/exercise.lib.php
+++ b/public/main/inc/lib/exercise.lib.php
@@ -202,6 +202,10 @@ public static function showQuestion(
global $exercise_stat_info;
if (!empty($exercise_stat_info)) {
echo $objQuestionTmp->returnRecorder((int) $exercise_stat_info['exe_id']);
+ $generatedFile = self::getOralFileAudio($exercise_stat_info['exe_id'], $questionId);
+ if (!empty($generatedFile)) {
+ echo $generatedFile;
+ }
}
}
From 05ca7d7d41f2df89311adaf267d0ccc34440424d Mon Sep 17 00:00:00 2001
From: NicoDucou
Date: Sat, 18 May 2024 08:46:05 +0200
Subject: [PATCH 251/413] Session: fix name to title conversion to avoid blank
option in select - refs BT#21724
---
public/main/session/add_students_to_session.php | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/public/main/session/add_students_to_session.php b/public/main/session/add_students_to_session.php
index 1649f9e5710..d28e915e2fe 100644
--- a/public/main/session/add_students_to_session.php
+++ b/public/main/session/add_students_to_session.php
@@ -45,10 +45,10 @@
}
}
-$session_list = SessionManager::get_sessions_list([], ['name']);
+$session_list = SessionManager::get_sessions_list([], ['title']);
$sessionList = [];
foreach ($session_list as $session) {
- $sessionList[$session['id']] = $session['name'];
+ $sessionList[$session['id']] = $session['title'];
}
Display::display_header($tool_name);
?>
From aa7e6b432b019869ee226a641c60fb3877a36b9e Mon Sep 17 00:00:00 2001
From: christianbeeznst
Date: Sun, 19 May 2024 21:40:23 -0500
Subject: [PATCH 252/413] Internal: Fix audio migration for oral question
responses - refs BT#21643
---
.../Schema/V200/Version20240519210000.php | 115 ++++++++++++++++++
1 file changed, 115 insertions(+)
create mode 100644 src/CoreBundle/Migrations/Schema/V200/Version20240519210000.php
diff --git a/src/CoreBundle/Migrations/Schema/V200/Version20240519210000.php b/src/CoreBundle/Migrations/Schema/V200/Version20240519210000.php
new file mode 100644
index 00000000000..a0e8470ba0f
--- /dev/null
+++ b/src/CoreBundle/Migrations/Schema/V200/Version20240519210000.php
@@ -0,0 +1,115 @@
+entityManager->getRepository(TrackEAttempt::class);
+
+ // Migrate exercise audio files
+ $sql = "SELECT ta.exe_id, ta.question_id, ta.user_id, ta.session_id, te.exe_exo_id, ta.filename
+ FROM track_e_attempt ta
+ INNER JOIN track_e_exercises te ON te.exe_id = ta.exe_id
+ WHERE (ta.filename IS NOT NULL AND ta.filename != '')";
+ $result = $this->connection->executeQuery($sql);
+ $attempts = $result->fetchAllAssociative();
+
+ foreach ($attempts as $attemptData) {
+ $sessionId = (int) $attemptData['session_id'];
+ $exerciseId = (int) $attemptData['exe_exo_id'];
+ $questionId = (int) $attemptData['question_id'];
+ $userId = (int) $attemptData['user_id'];
+ $filename = $attemptData['filename'];
+
+ $pathPattern = "{$sessionId}/{$exerciseId}/{$questionId}/{$userId}/{$filename}";
+ $courseDir = $this->findCourseDirectory($pathPattern);
+
+ if ($courseDir) {
+ $filePath = "app/courses/{$courseDir}/exercises/{$pathPattern}";
+ $this->processFile($filePath, $attemptRepo, $attemptData);
+ } else {
+ error_log('MIGRATIONS :: File not found for pattern: ' . $pathPattern);
+ }
+ }
+
+ $this->entityManager->flush();
+ }
+
+ private function findCourseDirectory(string $pathPattern): ?string
+ {
+ $kernel = $this->container->get('kernel');
+ $rootPath = $kernel->getProjectDir() . '/app/courses/';
+ $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($rootPath));
+
+ foreach ($iterator as $file) {
+ if (str_contains($file->getPathname(), $pathPattern)) {
+ $relativePath = str_replace($rootPath, '', $file->getPath());
+
+ return explode('/', $relativePath)[0];
+ }
+ }
+
+ return null;
+ }
+
+ private function processFile(string $filePath, $attemptRepo, array $attemptData): void
+ {
+ if (file_exists($filePath)) {
+ $fileName = basename($filePath);
+
+ /** @var TrackEAttempt $attempt */
+ $attempt = $attemptRepo->findOneBy([
+ 'user' => $attemptData['user_id'],
+ 'questionId' => $attemptData['question_id'],
+ 'filename' => $fileName,
+ ]);
+
+ if (null !== $attempt) {
+ if ($attempt->getAttemptFiles()->count() > 0) {
+ return;
+ }
+
+ $mimeType = mime_content_type($filePath);
+ $file = new UploadedFile($filePath, $fileName, $mimeType, null, true);
+
+ $asset = (new Asset())
+ ->setCategory(Asset::EXERCISE_ATTEMPT)
+ ->setTitle($fileName)
+ ->setFile($file);
+ $this->entityManager->persist($asset);
+ $this->entityManager->flush();
+
+ $attemptFile = (new AttemptFile())
+ ->setAsset($asset);
+ $attempt->addAttemptFile($attemptFile);
+ $this->entityManager->persist($attemptFile);
+ $this->entityManager->flush();
+
+ error_log('MIGRATIONS :: File processed and inserted as asset and attempt file: ' . $filePath);
+ }
+ }
+ }
+
+ public function down(Schema $schema): void
+ {
+ // This migration is not reversible
+ }
+}
From fd3e8f2eaaf5f12ca42844783c5c92550b9accc7 Mon Sep 17 00:00:00 2001
From: christianbeeznst
Date: Mon, 20 May 2024 23:57:29 -0500
Subject: [PATCH 253/413] Skills: Add Absolute URL to Badge Notification
Message - refs BT#21716
---
src/CoreBundle/Entity/Listener/SkillRelUserListener.php | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/CoreBundle/Entity/Listener/SkillRelUserListener.php b/src/CoreBundle/Entity/Listener/SkillRelUserListener.php
index c213157bde8..051a433fcfc 100644
--- a/src/CoreBundle/Entity/Listener/SkillRelUserListener.php
+++ b/src/CoreBundle/Entity/Listener/SkillRelUserListener.php
@@ -13,6 +13,7 @@
use Display;
use Doctrine\ORM\Event\PostPersistEventArgs;
use Symfony\Bundle\SecurityBundle\Security;
+use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
@@ -33,7 +34,8 @@ public function postPersist(SkillRelUser $skillRelUser, PostPersistEventArgs $ev
// Notification of badge assignation
$url = $this->router->generate(
'badge_issued_all',
- ['skillId' => $skill->getId(), 'userId' => $user->getId()]
+ ['skillId' => $skill->getId(), 'userId' => $user->getId()],
+ UrlGeneratorInterface::ABSOLUTE_URL
);
$message = sprintf(
From 04a874e995fa7c7f72231b124cc7a2612eddabf1 Mon Sep 17 00:00:00 2001
From: Yannick Warnier
Date: Tue, 21 May 2024 11:48:33 +0200
Subject: [PATCH 254/413] Language: Update language terms
---
translations/messages.es.po | 404 +++++++++++++++++++++++++++++++++++-
1 file changed, 401 insertions(+), 3 deletions(-)
diff --git a/translations/messages.es.po b/translations/messages.es.po
index 02a5398c8e6..1f81ffcae64 100644
--- a/translations/messages.es.po
+++ b/translations/messages.es.po
@@ -1,7 +1,7 @@
msgid ""
msgstr ""
"Project-Id-Version: chamilo\n"
-"PO-Revision-Date: 2024-05-17 08:00+0000\n"
+"PO-Revision-Date: 2024-05-21 09:47+0000\n"
"Last-Translator: Yannick Warnier \n"
"Language-Team: Spanish \n"
@@ -25977,5 +25977,403 @@ msgstr ""
"Habilitar opciones de compartición para el documento dentro de la categoría "
"de grupo"
-msgid "The attempted oral questions are %s"
-msgstr "Las preguntas orales respondidas son: %s"
+msgid "Allow users to include HTML in title fields in several places. This allows for some styling of titles, notably in test questions."
+msgstr ""
+"Permitir a los usuarios incluir HTML en los campos de título en varios "
+"lugares. Esto permite aplicar estilos a los títulos, especialmente en las "
+"preguntas de exámenes."
+
+msgid "Show link to download test results"
+msgstr "Mostrar enlace para descargar resultados del ejercicio"
+
+msgid "Block sending test notifications to general coach"
+msgstr "Bloquear el envío de notificaciones de prueba al tutor general"
+
+msgid "Allow the teacher to rate the open, oral expression and annotation question types with a decimal score."
+msgstr ""
+"Permita al tutor calificar los tipos de preguntas de expresión oral abierta "
+"y anotación con una puntuación decimal."
+
+msgid "Select between the following forms for the display of users' score in various reports: 1 = SCORE_AVERAGE (5 / 10); 2 = SCORE_PERCENT (50%); 3 = SCORE_DIV_PERCENT (5 / 10 (50%)). Use the numerical ID of the form you want to use."
+msgstr ""
+"Seleccione entre las siguientes formas para mostrar la puntuación de los "
+"usuarios en varios informes: 1 = PROMEDIO_PUNTUACIÓN (5 / 10); 2 = "
+"PORCENTAJE_PUNTUACIÓN (50%); 3 = PUNTUACIÓN_DIV_PORCENTAJE (5 / 10 (50%)). "
+"Utilice el ID numérico de la forma que desea usar."
+
+msgid "Hide the fact that open questions (including audio and annotations) have a score by hiding the score display in all learner-facing reports."
+msgstr ""
+"Oculte el hecho de que las preguntas abiertas (incluyendo audio y "
+"anotaciones) tienen una puntuación ocultando la visualización de la "
+"puntuación en todos los informes orientados a los alumnos."
+
+msgid "Prevent the use of images copy-paste as base64 in the editor to avoid filling the database with images."
+msgstr ""
+"Evita el uso de copiar y pegar imágenes como base64 en el editor para no "
+"llenar la base de datos con imágenes."
+
+msgid "Enable test images zooming"
+msgstr "Activar el zoom en imágenes de ejercicios"
+
+msgid "Set this to false to disable the 'previous' button when answering questions in a test, thus forcing users to always move ahead."
+msgstr ""
+"Establezca esto en falso para desactivar el botón 'anterior' al responder "
+"preguntas en un examen, obligando así a los usuarios a avanzar siempre."
+
+msgid "Disable new test attempts"
+msgstr "Desactivar nuevos intentos de ejercicio"
+
+msgid "Generate certificate when ending a quiz. The quiz needs to be linked in the gradebook tool and have a pass percentage configured."
+msgstr ""
+"Generar certificado al finalizar un cuestionario. El cuestionario debe estar "
+"vinculado en la herramienta de evaluaciones y tener configurado un "
+"porcentaje de aprobación."
+
+msgid "When using this option, an additional option will appear in the test's configuration. When using a test with multiple question categories and asking for a distribution by category, this will allow the user to navigate questions per category. Once a category is finished, (s)he moves to the next category and cannot return to the previous category."
+msgstr ""
+"Al utilizar esta opción, aparecerá una opción adicional en la configuración "
+"del ejercicio. Al usar un ejercicio con múltiples categorías de preguntas y "
+"solicitar una distribución por categoría, esto permitirá al usuario navegar "
+"las preguntas por categoría. Una vez que se termina una categoría, el alumno "
+"pasa a la siguiente categoría y no puede regresar a la categoría anterior."
+
+msgid "The auto-launch feature allows the teacher to set an exercise to open immediately upon accessing the course homepage. Enable this option and click on the rocket icon in the list of tests to enable."
+msgstr ""
+"La función de auto-lanzamiento permite al tutor configurar un ejercicio para "
+"que se abra inmediatamente al acceder a la página principal del curso. "
+"Active esta opción y haga clic en el icono del cohete en la lista de "
+"ejercicios para habilitar."
+
+msgid "Learners completing a test usually sends notifications to coaches, including the general session coach. Enable this option to omit the general coach from these notifications."
+msgstr ""
+"Los alumnos que completan una prueba suelen enviar notificaciones a los "
+"tutores, incluyendo al tutor general de la lección. Active esta opción para "
+"omitir al tutor general de estas notificaciones."
+
+msgid "Enable this feature to allow users to zoom on images used in the tests."
+msgstr ""
+"Active esta función para permitir a los usuarios ampliar las imágenes "
+"utilizadas en los ejercicios."
+
+msgid "The default test results page shows a user datasheet (photo, name, etc) which might, in some contexts, be considered as pushing the limits of personal data treatment. Enable this option to remove user details from the test results."
+msgstr ""
+"La página de resultados del ejercicio por defecto muestra una hoja de datos "
+"del usuario (foto, nombre, etc.) que, en algunos contextos, podría "
+"considerarse como un exceso en el tratamiento de datos personales. Active "
+"esta opción para eliminar los detalles del usuario de los resultados del "
+"ejercicio."
+
+msgid "Hide question ribbon (right/wrong) in test results"
+msgstr ""
+"Ocultar la cinta de pregunta (correcto/incorrecto) en los resultados del "
+"ejercicio"
+
+msgid "Add checkbox for answers count confirmation"
+msgstr ""
+"Añadir casilla de verificación para confirmación del número de respuestas"
+
+msgid "Prevent copy-pasting images in WYSIWYG editor"
+msgstr "Evitar copiar y pegar imágenes en el editor WYSIWYG"
+
+msgid "Disable 'clean results' for teachers"
+msgstr "Desactivar 'limpiar resultados' para profesores"
+
+msgid "List of WYSIWYG files drivers"
+msgstr "Lista de controladores de archivos WYSIWYG"
+
+msgid "Full WYSIWYG editor toolbar"
+msgstr "Barra de herramientas completa del editor WYSIWYG"
+
+msgid "Allow teachers to provide feedback to users through audio (alternatively to text) on each question in a test."
+msgstr ""
+"Permita que los tutores proporcionen retroalimentación a los usuarios "
+"mediante audio (alternativamente a texto) en cada pregunta de una prueba."
+
+msgid "Enable selecting mandatory questions"
+msgstr "Habilitar la selección de preguntas obligatorias"
+
+msgid "Save titles as HTML"
+msgstr "Guardar títulos como HTML"
+
+msgid "Test notification settings at test-level"
+msgstr "Configurar notificaciones de ejercicios a nivel de ejercicio"
+
+msgid "Show question pagination for teachers"
+msgstr "Mostrar paginación de preguntas para tutores"
+
+msgid "Always show test description on results page"
+msgstr "Muestra siempre la descripción del ejercicio en la página de resultados"
+
+msgid "Audio feedback to submitted answers"
+msgstr "Retroalimentación de audio para las respuestas enviadas"
+
+msgid "Decimal score in open question types"
+msgstr "Puntuación decimal en tipos de preguntas abiertas"
+
+msgid "Generic configuration array to reconfigure the WYSIWYG editor globally."
+msgstr ""
+"Configuración genérica en formato array para reconfigurar el editor WYSIWYG "
+"globalmente."
+
+msgid "Add question feedback if incorrect answer"
+msgstr "Añadir retroalimentación a la pregunta si la respuesta es incorrecta"
+
+msgid "Disable the option to delete test results from the tests list. This is often used when less-careful teachers manage courses, to avoid critical mistakes."
+msgstr ""
+"Desactive la opción de eliminar resultados de ejercicios de la lista de "
+"ejercicios. Esto se utiliza a menudo cuando tutores menos cuidadosos "
+"gestionan cursos, para evitar errores críticos."
+
+msgid "Show the expected choice and a status (right/wrong) for each answer on the test results page (if the test has been configured to show results)."
+msgstr ""
+"Mostrar la opción esperada y un estado (correcto/incorrecto) para cada "
+"respuesta en la página de resultados del ejercicio (si el ejercicio ha sido "
+"configurado para mostrar resultados)."
+
+msgid "Show the username (instead or, or as well as, the user info) on the test results page."
+msgstr ""
+"Muestre el nombre de usuario (en lugar de, o además de, la información del "
+"usuario) en la página de resultados del ejercicio."
+
+msgid "Show question IDs in tests"
+msgstr "Mostrar los ID de las preguntas en los ejercicios"
+
+msgid "Show 'previous' button in test to navigate questions"
+msgstr "Mostrar botón 'anterior' en el test para navegar entre las preguntas"
+
+msgid "This option adds a checkbox at the end of each test asking the user to confirm the number of answers saved. This provides better auditing data for critical tests."
+msgstr ""
+"Esta opción añade una casilla de verificación al final de cada ejercicio "
+"solicitando al usuario que confirme el número de respuestas guardadas. Esto "
+"proporciona mejores datos de auditoría para ejercicios críticos."
+
+msgid "Show score for certainty degree questions"
+msgstr "Muestra la puntuación para las preguntas de grado de certeza"
+
+msgid "Question pagination length for teachers"
+msgstr "Longitud de paginación de preguntas para tutores"
+
+msgid "Enable player renderers for YouTube, Vimeo, Facebook, DailyMotion, Twitch medias"
+msgstr ""
+"Habilitar reproductores para medios de YouTube, Vimeo, Facebook, "
+"DailyMotion, Twitch"
+
+msgid "Make sure users are all set to start the test by providing a simulation of the question-saving process before entering the test. This allows for early detection of some connection issues and reduces user experience frictions."
+msgstr ""
+"Asegúrese de que todos los alumnos estén listos para comenzar el ejercicio "
+"proporcionando una simulación del proceso de guardado de preguntas antes de "
+"entrar al ejercicio. Esto permite la detección temprana de algunos problemas "
+"de conexión y reduce las fricciones en la experiencia del usuario."
+
+msgid "In test results, a ribbon appears by default to indicate if the answer was right or wrong. Enable this option to remove the ribbon globally."
+msgstr ""
+"En los resultados de los exámenes, una cinta aparece por defecto para "
+"indicar si la respuesta fue correcta o incorrecta. Active esta opción para "
+"eliminar la cinta globalmente."
+
+msgid "Show username in test results page"
+msgstr "Muestre el nombre de usuario en la página de resultados del ejercicio"
+
+msgid "Enable test categories"
+msgstr "Habilitar categorías de ejercicios"
+
+msgid "If enabled, this option allows users to use a ‘lang’ attribute in HTML elements to define the langage the content of that element is written in. Enable multiple elements with different ‘lang’ attributes and Chamilo will display the content in the langage of the user only."
+msgstr ""
+"Si está habilitada, esta opción permite a los usuarios utilizar un atributo "
+"'lang' en elementos HTML para definir el idioma en el que está escrito el "
+"contenido de ese elemento. Habilite múltiples elementos con diferentes "
+"atributos 'lang' y Chamilo mostrará el contenido solo en el idioma del "
+"usuario."
+
+msgid "When enabled, teachers cannot delete tests nor questions, change tests visibility, download to QTI, clean results, etc."
+msgstr ""
+"Cuando está activado, los tutores no pueden eliminar ejercicios ni "
+"preguntas, cambiar la visibilidad de los ejercicios, descargar a QTI, "
+"limpiar resultados, etc."
+
+msgid "Number of questions to show on every page when using the question pagination for teachers option."
+msgstr ""
+"Número de preguntas a mostrar en cada página al utilizar la opción de "
+"paginación de preguntas para tutores."
+
+msgid "Hide user info on test results page"
+msgstr ""
+"Ocultar información del usuario en la página de resultados del ejercicio"
+
+msgid "Video player renderers"
+msgstr "Reproductores de video"
+
+msgid "Block copy-pasting in tests"
+msgstr "Bloquear el copiar y pegar en exámenes"
+
+msgid "Add score in mail notification of test submission"
+msgstr ""
+"Añada la puntuación en la notificación por correo de la entrega del ejercicio"
+
+msgid "Enable display of best score attempt"
+msgstr "Activar visualización del mejor intento de puntuación"
+
+msgid "Enable test results page configuration"
+msgstr "Habilitar la configuración de la página de resultados del ejercicio"
+
+msgid "For tests with many questions, use pagination if the number of questions is higher than this setting. Set to 0 to prevent using pagination."
+msgstr ""
+"Para ejercicios con muchas preguntas, utilice la paginación si el número de "
+"preguntas es superior a esta configuración. Establezca en 0 para evitar el "
+"uso de la paginación."
+
+msgid "Provide a list of courses and tests' IDs that will show the best score attempt for any learner in the reports. "
+msgstr ""
+"Proporcione una lista de identificadores de cursos y ejercicios que "
+"mostrarán el mejor intento de puntuación para cualquier alumno en los "
+"informes. "
+
+msgid "Enable the selection of mandatory questions in a test when using random categories."
+msgstr ""
+"Active la selección de preguntas obligatorias en un ejercicio cuando utilice "
+"categorías aleatorias."
+
+msgid "On the test results page, display a link to download the results as a file."
+msgstr ""
+"En la página de resultados del ejercicio, muestre un enlace para descargar "
+"los resultados como archivo."
+
+msgid "Allow teachers to edit tests in learning paths"
+msgstr "Permitir a los tutores editar pruebas en lecciones"
+
+msgid "Test categories are not enabled by default because they add a level of complexity. Enable this feature to show all test categories related management icons appear."
+msgstr ""
+"Las categorías de ejercicios no están habilitadas por defecto porque añaden "
+"un nivel de complejidad. Active esta función para que aparezcan todos los "
+"iconos de gestión relacionados con las categorías de ejercicios."
+
+msgid "Enable the configuration of test submission notifications at the test level rather than the course level. Falls back to course-level settings if not defined at test-level."
+msgstr ""
+"Habilite la configuración de notificaciones de entrega de ejercicios a nivel "
+"de ejercicio en lugar de a nivel de curso. Revierte a la configuración a "
+"nivel de curso si no está definida a nivel de ejercicio."
+
+msgid "Allow images drag&drop in WYSIWYG editor"
+msgstr "Permitir arrastrar y soltar imágenes en el editor WYSIWYG"
+
+msgid "Disable new test attempts globally. Usually used when there is a problem with tests in general and you want some time to analyse without blocking the whole platform."
+msgstr ""
+"Desactivar globalmente nuevos intentos de ejercicio. Se utiliza "
+"habitualmente cuando hay un problema con los ejercicios en general y se "
+"desea tener tiempo para analizar sin bloquear toda la plataforma."
+
+msgid "Add the learner's score to the e-mail notification sent to the teacher after a test was submitted."
+msgstr ""
+"Agregue la puntuación del alumno al correo electrónico de notificación "
+"enviado al tutor después de que se entregue un ejercicio."
+
+msgid "Limit teachers' permissions over tests"
+msgstr "Limitar los permisos de los tutores en los ejercicios"
+
+msgid "Define an array of settings you want to apply to all tests results pages. Settings can be 'hide_question_score', 'hide_expected_answer', 'hide_category_table', 'hide_correct_answered_questions', 'hide_total_score' and possibly more in the future. Look for ‘getPageConfigurationAttribute’ in the code to see what’s in use."
+msgstr ""
+"Defina un arreglo de configuraciones que desee aplicar a todas las páginas "
+"de resultados de ejercicios. Las configuraciones pueden ser "
+"'hide_question_score', 'hide_expected_answer', 'hide_category_table', "
+"'hide_correct_answered_questions', 'hide_total_score' y posiblemente más en "
+"el futuro. Busque ‘getPageConfigurationAttribute’ en el código para ver qué "
+"está en uso."
+
+msgid "Allow tests auto-launch"
+msgstr "Permitir el auto-lanzamiento de ejercicios"
+
+msgid "Additional links for teachers in tests list"
+msgstr "Enlaces adicionales para tutores en la lista de ejercicios"
+
+msgid "Enable recording of all answers (even temporary) in the track_e_attempt_recording table. This feautre is experimentaland can create issues in the reporting pages when attempting to grade a test."
+msgstr ""
+"Active la grabación de todas las respuestas (incluso temporales) en la tabla "
+"track_e_attempt_recording. Esta característica es experimental y puede "
+"causar problemas en las páginas de informes al intentar calificar un "
+"ejercicio."
+
+msgid "Configure callback elements to generate new action icons for teachers to the right side of the tests list, in the form of an array, e.g. ['myplugin' => ['MyPlugin', 'urlGeneratorCallback']]"
+msgstr ""
+"Configure los elementos de callback para generar nuevos iconos de acción "
+"para los tutores en el lado derecho de la lista de ejercicios, en forma de "
+"un arreglo, por ejemplo, ['myplugin' => ['MyPlugin', 'urlGeneratorCallback']]"
+
+msgid "Array containing the names of the drivers for files access from the WYSIWYG editor."
+msgstr ""
+"Array que contiene los nombres de los controladores para el acceso a "
+"archivos desde el editor WYSIWYG."
+
+msgid "Tests score format"
+msgstr "Formato de puntuación de ejercicios"
+
+msgid "Enable image upload as file when doing a copy in the content or a drag and drop."
+msgstr ""
+"Habilite la carga de imágenes como archivo al realizar una copia en el "
+"contenido o un arrastrar y soltar."
+
+msgid "Lock questions of previous categories in a test"
+msgstr "Bloquear las preguntas de las categorías anteriores en un ejercicio"
+
+msgid "Add answer-saving process check before test"
+msgstr ""
+"Añada un proceso de verificación para guardar respuestas antes del ejercicio"
+
+msgid "Show expected choice in test results"
+msgstr "Muestre la opción esperada en los resultados del ejercicio"
+
+msgid "Round score in test exports"
+msgstr "Puntuación redondeada en las exportaciones de ejercicios"
+
+msgid "Hide open questions' score"
+msgstr "Ocultar la puntuación de las preguntas abiertas"
+
+msgid "Hide the context menu on video player"
+msgstr "Ocultar el menú contextual en el reproductor de video"
+
+msgid "Support multi-language HTML content"
+msgstr "Soporte para contenido HTML multilenguaje"
+
+msgid "Block copy/paste/save/print keys and right-clicks in exercises."
+msgstr ""
+"Bloquear las teclas de copiar/pegar/guardar/imprimir y clics derechos en "
+"ejercicios."
+
+msgid "By default, Chamilo prevents you from editing tests that are included inside a learning path. This is to avoid changes that would affect learners (past and future) differently regarding the results and/or progress in the learning path. This option allows teachers to bypass this restriction."
+msgstr ""
+"De forma predeterminada, Chamilo impide editar pruebas que están incluidas "
+"dentro de una lección. Esto es para evitar cambios que afectarían a los "
+"alumnos (pasados y futuros) de manera diferente en cuanto a los resultados y/"
+"o el progreso en la lección. Esta opción permite a los tutores eludir esta "
+"restricción."
+
+msgid "Generate certificate on test end"
+msgstr "Generar certificado al finalizar el ejercicio"
+
+msgid "WYSIWYG editor settings"
+msgstr "Configuración del editor WYSIWYG"
+
+msgid "Show questions' internal IDs to let users take note of issues on specific questions and report them more efficiently."
+msgstr ""
+"Mostrar los IDs internos de las preguntas para que los usuarios puedan tomar "
+"nota de los problemas en preguntas específicas e informarlos de manera más "
+"eficiente."
+
+msgid "Show the full toolbar in all WYSIWYG editor boxes around the platform."
+msgstr ""
+"Muestra la barra de herramientas completa en todos los cuadros de editor "
+"WYSIWYG de la plataforma."
+
+msgid "By default, Chamilo does not show a score for the certainty degree question types."
+msgstr ""
+"Por defecto, Chamilo no muestra una puntuación para los tipos de preguntas "
+"de grado de certeza."
+
+msgid "By default, Chamilo allows you to show feedback on each answer in a question. With this option, an additional field is created to provide pre-defined feedback to the whole question. This feedback will only appear if the user answered incorrectly."
+msgstr ""
+"De forma predeterminada, Chamilo le permite mostrar retroalimentación en "
+"cada respuesta de una pregunta. Con esta opción, se crea un campo adicional "
+"para proporcionar retroalimentación predefinida a toda la pregunta. Esta "
+"retroalimentación solo aparecerá si el usuario respondió incorrectamente."
+
+msgid "Enable extra test answers recording"
+msgstr "Activar el registro de respuestas adicionales del ejercicio"
From 6dcfb7bb662061773b21c89572c9c9be76fc4912 Mon Sep 17 00:00:00 2001
From: NicoDucou
Date: Tue, 21 May 2024 15:59:35 +0200
Subject: [PATCH 255/413] Exercise: Show nto corrected message only if no text
comment and no audio comment - refs BT#21609
---
public/main/inc/lib/exercise_show_functions.lib.php | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/public/main/inc/lib/exercise_show_functions.lib.php b/public/main/inc/lib/exercise_show_functions.lib.php
index 8a26871d88c..07f1a0e8e8e 100644
--- a/public/main/inc/lib/exercise_show_functions.lib.php
+++ b/public/main/inc/lib/exercise_show_functions.lib.php
@@ -185,7 +185,13 @@ public static function display_oral_expression_answer(
echo Display::tag('p', Security::remove_XSS($answer));
}
- if ($showAlertIfNotCorrected && !$questionScore && EXERCISE_FEEDBACK_TYPE_EXAM != $feedback_type) {
+ $comment = Event::get_comments($trackExerciseId, $questionId);
+ $teacherAudio = ExerciseLib::getOralFeedbackAudio(
+ $trackExerciseId,
+ $questionId
+ );
+
+ if ($showAlertIfNotCorrected && !$questionScore && EXERCISE_FEEDBACK_TYPE_EXAM != $feedback_type && empty($comment) && empty($teacherAudio)) {
echo Display::tag('p', ExerciseLib::getNotCorrectedYetText());
}
}
From eb1beade4db212b9881daf74e0225923fee393c8 Mon Sep 17 00:00:00 2001
From: Angel Fernando Quiroz Campos
Date: Tue, 21 May 2024 13:44:02 -0500
Subject: [PATCH 256/413] Display: Fix buttons styles inside flex + add styles
for small size
---
assets/css/scss/atoms/_buttons.scss | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/assets/css/scss/atoms/_buttons.scss b/assets/css/scss/atoms/_buttons.scss
index 673b7cda855..2f9f08ba911 100644
--- a/assets/css/scss/atoms/_buttons.scss
+++ b/assets/css/scss/atoms/_buttons.scss
@@ -1,5 +1,5 @@
.btn {
- @apply cursor-default font-semibold gap-2 inline-flex justify-center px-6 py-3 rounded-md transition;
+ @apply cursor-default font-semibold gap-2 inline-flex justify-center px-6 py-3 rounded-md transition flex-none;
font-size: 1rem;
line-height: 1rem;
@@ -153,6 +153,11 @@
@apply bg-gray-10 border-gray-25 cursor-default select-none text-gray-50;
}
}
+
+ &-sm {
+ @apply px-4 py-2;
+ font-size: 13px;
+ }
}
$color_7: #ffffff;
From af50b7b610cb9ddea1773f2425641ed4f318ceda Mon Sep 17 00:00:00 2001
From: christianbeeznst
Date: Tue, 21 May 2024 16:36:46 -0500
Subject: [PATCH 257/413] User: Fix profile image accessibility on subsequent
changes - refs BT#21676
---
public/main/admin/user_edit.php | 6 +++++-
src/CoreBundle/Controller/AccountController.php | 1 +
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/public/main/admin/user_edit.php b/public/main/admin/user_edit.php
index a76d666a77c..0fb9d61c6d1 100644
--- a/public/main/admin/user_edit.php
+++ b/public/main/admin/user_edit.php
@@ -173,6 +173,8 @@ function confirmation(name) {
$hasPicture = $illustrationRepo->hasIllustration($userObj);
if ($hasPicture) {
+ $picture = $illustrationRepo->getIllustrationUrl($userObj);
+ $form->addElement('html', '');
$form->addElement('checkbox', 'delete_picture', '', get_lang('Remove picture'));
}
@@ -407,7 +409,9 @@ function confirmation(name) {
$picture_uri = $user_data['picture_uri'];
if (isset($user['delete_picture']) && $user['delete_picture']) {
$picture_uri = UserManager::deleteUserPicture($user_id);
- } elseif (!empty($picture['name'])) {
+ }
+ if (!empty($picture['name'])) {
+ $picture_uri = UserManager::deleteUserPicture($user_id);
$request = Container::getRequest();
$file = $request->files->get('picture');
$picture_uri = UserManager::update_user_picture(
diff --git a/src/CoreBundle/Controller/AccountController.php b/src/CoreBundle/Controller/AccountController.php
index 32a66d5f49e..3c32ed7bcb0 100644
--- a/src/CoreBundle/Controller/AccountController.php
+++ b/src/CoreBundle/Controller/AccountController.php
@@ -48,6 +48,7 @@ public function edit(Request $request, UserRepository $userRepository, Illustrat
if ($form->isSubmitted() && $form->isValid()) {
$illustration = $form['illustration']->getData();
if ($illustration) {
+ $illustrationRepo->deleteIllustration($user);
$illustrationRepo->addIllustration($user, $user, $illustration);
}
From 8f041b47fb0ede082fdefa7b15778c0a6c74317a Mon Sep 17 00:00:00 2001
From: christianbeeznst
Date: Tue, 21 May 2024 17:09:08 -0500
Subject: [PATCH 258/413] Internal: Set notification with student boss language
- refs BT#21681
---
public/main/inc/lib/usermanager.lib.php | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/public/main/inc/lib/usermanager.lib.php b/public/main/inc/lib/usermanager.lib.php
index 98689e2dd39..3440c57e25d 100644
--- a/public/main/inc/lib/usermanager.lib.php
+++ b/public/main/inc/lib/usermanager.lib.php
@@ -4855,7 +4855,7 @@ public static function subscribeUserToBossList(
continue;
}
- $bossLanguage = $bossInfo['language'];
+ $bossLanguage = $bossInfo['locale'];
$sql = "INSERT IGNORE INTO $userRelUserTable (user_id, friend_user_id, relation_type)
VALUES ($studentId, $bossId, ".UserRelUser::USER_RELATION_TYPE_BOSS.")";
$insertId = Database::query($sql);
@@ -4865,8 +4865,8 @@ public static function subscribeUserToBossList(
$name = $studentInfo['complete_name'];
$url = api_get_path(WEB_CODE_PATH).'my_space/myStudents.php?student='.$studentId;
$url = Display::url($url, $url);
- $subject = sprintf(get_lang('You have been assigned the learner %s'), $name);
- $message = sprintf(get_lang('You have been assigned the learner %sWithUrlX'), $name, $url);
+ $subject = sprintf(get_lang('You have been assigned the learner %s', $bossLanguage), $name);
+ $message = sprintf(get_lang('You have been assigned the learner %s with url %s', $bossLanguage), $name, $url);
MessageManager::send_message_simple(
$bossId,
$subject,
From c4e6fe86e988484edaa5b969babb0d3af725f277 Mon Sep 17 00:00:00 2001
From: christianbeeznst
Date: Tue, 21 May 2024 17:57:16 -0500
Subject: [PATCH 259/413] Internal: Fix BBB CopyTextToClipboard button - refs
BT#21682
---
public/plugin/bbb/view/listing.tpl | 1 +
public/plugin/zoom/view/meeting.tpl | 1 +
2 files changed, 2 insertions(+)
diff --git a/public/plugin/bbb/view/listing.tpl b/public/plugin/bbb/view/listing.tpl
index fb5c2b4befc..9dde4934edd 100644
--- a/public/plugin/bbb/view/listing.tpl
+++ b/public/plugin/bbb/view/listing.tpl
@@ -116,3 +116,4 @@
' . $message->getContent().' '.$date.' '.
From 5e2d8156e4049358dcdeb6723e68416f35db4e3f Mon Sep 17 00:00:00 2001
From: NicoDucou
Date: Wed, 22 May 2024 09:24:58 +0200
Subject: [PATCH 262/413] Internal: fix translation for message sent to tutor
on learner's assignation - refs BT#21681
---
translations/messages.de.po | 3 +++
translations/messages.en.po | 3 +++
translations/messages.es.po | 3 +++
translations/messages.fr.po | 3 +++
translations/messages.it.po | 3 +++
translations/messages.nl.po | 3 +++
translations/messages.pot | 3 +++
translations/messages.pt_BR.po | 3 +++
8 files changed, 24 insertions(+)
diff --git a/translations/messages.de.po b/translations/messages.de.po
index 41c685d762d..dac2f0991c6 100644
--- a/translations/messages.de.po
+++ b/translations/messages.de.po
@@ -21778,6 +21778,9 @@ msgstr "Sehr schwach"
msgid "You have been assigned the learner %s"
msgstr "Der Schüler %s, die Ihnen zugeordnet"
+msgid "You have been assigned the learner %s with url %s"
+msgstr "Sie wurden dem Teilnehmer %s als Tutor zugewiesen. Zum Profil: %s"
+
msgid "You have been assigned as tutor for the learner %s. "
msgstr "Sie wurden dem Teilnehmer %s als Tutor zugewiesen. Zum Profil: %s"
diff --git a/translations/messages.en.po b/translations/messages.en.po
index 66fbd9a5af0..6abc0bb2172 100644
--- a/translations/messages.en.po
+++ b/translations/messages.en.po
@@ -21722,6 +21722,9 @@ msgstr "Very weak"
msgid "You have been assigned the learner %s"
msgstr "You have been assigned the learner %s"
+msgid "You have been assigned the learner %s with url %s"
+msgstr "You have been assigned the learner %s with url %s"
+
msgid "You have been assigned as tutor for the learner %s. "
msgstr "You have been assigned as tutor for the learner %s. "
diff --git a/translations/messages.es.po b/translations/messages.es.po
index 1f81ffcae64..27890c7baa5 100644
--- a/translations/messages.es.po
+++ b/translations/messages.es.po
@@ -21750,6 +21750,9 @@ msgstr "Muy débil"
msgid "You have been assigned the learner %s"
msgstr "Se le ha asignado el estudiante %s"
+msgid "You have been assigned the learner %s with url %s"
+msgstr "Usted ha sido asignado(a) como tutor del estudiante %s. Puede acceder a su perfil aquí: %s"
+
msgid "You have been assigned as tutor for the learner %s. "
msgstr "Usted ha sido asignado(a) como tutor del estudiante %s. Puede acceder a su perfil aquí: %s"
diff --git a/translations/messages.fr.po b/translations/messages.fr.po
index 5d33ebb66aa..a223c721b3a 100644
--- a/translations/messages.fr.po
+++ b/translations/messages.fr.po
@@ -22357,6 +22357,9 @@ msgstr "Très faible"
msgid "You have been assigned the learner %s"
msgstr "L'apprenant %s vous a été assigné"
+msgid "You have been assigned the learner %s with url %s"
+msgstr "Vous avez été assigné comme tuteur pour l'apprenant %s. Vous pouvez accéder à sa fiche ici: %s"
+
msgid "You have been assigned as tutor for the learner %s. "
msgstr "Vous avez été assigné comme tuteur pour l'apprenant %s. "
diff --git a/translations/messages.it.po b/translations/messages.it.po
index 0d3933f8da7..4478ee8f8c7 100644
--- a/translations/messages.it.po
+++ b/translations/messages.it.po
@@ -21722,6 +21722,9 @@ msgstr ""
msgid "You have been assigned the learner %s"
msgstr ""
+msgid "You have been assigned the learner %s with url %s"
+msgstr "Sei stata assegnata come tutor per l'apprendente %s.\nPuoi accedere alla sua scheda qui: %s"
+
msgid "You have been assigned as tutor for the learner %s. "
msgstr ""
diff --git a/translations/messages.nl.po b/translations/messages.nl.po
index 9bb766cb271..a0bdd375e99 100644
--- a/translations/messages.nl.po
+++ b/translations/messages.nl.po
@@ -21876,6 +21876,9 @@ msgstr "Heel zwak"
msgid "You have been assigned the learner %s"
msgstr "U bent toegewezen aan de student %s"
+msgid "You have been assigned the learner %s with url %s"
+msgstr "U bent als tutor toegewezen aan student %s. U kunt zijn profiel bekijken van hier: %s"
+
msgid "You have been assigned as tutor for the learner %s. "
msgstr "U bent als tutor toegewezen aan student %s. U kunt zijn profiel bekijken van hier: %s"
diff --git a/translations/messages.pot b/translations/messages.pot
index 454230a0dca..415d3d6c5ab 100644
--- a/translations/messages.pot
+++ b/translations/messages.pot
@@ -21715,6 +21715,9 @@ msgstr ""
msgid "You have been assigned the learner %s"
msgstr ""
+msgid "You have been assigned the learner %s with url %s"
+msgstr ""
+
msgid "You have been assigned as tutor for the learner %s. "
msgstr ""
diff --git a/translations/messages.pt_BR.po b/translations/messages.pt_BR.po
index 0e79a8eed2f..3d477b420c3 100644
--- a/translations/messages.pt_BR.po
+++ b/translations/messages.pt_BR.po
@@ -21722,6 +21722,9 @@ msgstr "Muito fraco"
msgid "You have been assigned the learner %s"
msgstr "A você foi designado o(a) aluno(a) %s"
+msgid "You have been assigned the learner %s with url %s"
+msgstr "Você foi designado como tutor para o aluno(a) %s. Você pode acessar o perfil dele(a) aqui: %s"
+
msgid "You have been assigned as tutor for the learner %s. "
msgstr "Você foi designado como tutor para o aluno(a) %s. Você pode acessar o perfil dele(a) aqui: %s"
From cd1b9f954feefecdf67ad5db7e96dae9e4bab88d Mon Sep 17 00:00:00 2001
From: NicoDucou
Date: Wed, 22 May 2024 10:28:53 +0200
Subject: [PATCH 263/413] Internal: fix translation variable to gettext - refs
BT#21682
---
public/plugin/bbb/view/listing.tpl | 2 +-
public/plugin/zoom/view/meeting.tpl | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/public/plugin/bbb/view/listing.tpl b/public/plugin/bbb/view/listing.tpl
index fb5c2b4befc..4a827c5d873 100644
--- a/public/plugin/bbb/view/listing.tpl
+++ b/public/plugin/bbb/view/listing.tpl
@@ -28,7 +28,7 @@
style="width:600px"
class="form-control" readonly value="{{ conference_url }}">
+
diff --git a/assets/vue/components/session/SessionTabs.vue b/assets/vue/components/session/SessionTabs.vue
index 2aeed7334c4..5b15034d4bb 100644
--- a/assets/vue/components/session/SessionTabs.vue
+++ b/assets/vue/components/session/SessionTabs.vue
@@ -1,26 +1,19 @@
-
-
-
-
+
+
+
+
diff --git a/src/CoreBundle/Controller/ResourceController.php b/src/CoreBundle/Controller/ResourceController.php
index a4bfae3ab31..5a9b6bed1ea 100644
--- a/src/CoreBundle/Controller/ResourceController.php
+++ b/src/CoreBundle/Controller/ResourceController.php
@@ -456,9 +456,6 @@ public function changeVisibilityAll(
return new Response(null, Response::HTTP_NO_CONTENT);
}
- /**
- * @return mixed|StreamedResponse
- */
private function processFile(Request $request, ResourceNode $resourceNode, string $mode = 'show', string $filter = '', ?array $allUserInfo = null): mixed
{
$this->denyAccessUnlessGranted(
diff --git a/src/CoreBundle/Migrations/Schema/V200/Version20200821224240.php b/src/CoreBundle/Migrations/Schema/V200/Version20200821224240.php
index a84984a8e6f..61828f4bc82 100644
--- a/src/CoreBundle/Migrations/Schema/V200/Version20200821224240.php
+++ b/src/CoreBundle/Migrations/Schema/V200/Version20200821224240.php
@@ -19,7 +19,7 @@ public function getDescription(): string
public function up(Schema $schema): void
{
// Select the IDs of duplicated messages with msg_status = 4
- $sqlSelectMessages = "
+ $sqlSelectMessages = '
SELECT DISTINCT(m1.id) AS message_id
FROM message m1
JOIN message m2
@@ -30,7 +30,7 @@ public function up(Schema $schema): void
AND m1.content = m2.content
AND m1.msg_status = 4
AND m1.id != m2.id
- ";
+ ';
// Delete attachments related to the duplicated messages
$sqlDeleteAttachments = "
diff --git a/src/CoreBundle/Migrations/Schema/V200/Version20240506164100.php b/src/CoreBundle/Migrations/Schema/V200/Version20240506164100.php
index 32f7c7e3afe..7edf45214cf 100644
--- a/src/CoreBundle/Migrations/Schema/V200/Version20240506164100.php
+++ b/src/CoreBundle/Migrations/Schema/V200/Version20240506164100.php
@@ -11,9 +11,6 @@
class Version20240506164100 extends AbstractMigrationChamilo
{
- /**
- * @inheritDoc
- */
public function up(Schema $schema): void
{
$selectedMailValue = $this->getMailConfigurationValueFromFile('SMTP_UNIQUE_SENDER') ? 'true' : 'false';
@@ -28,4 +25,4 @@ public function up(Schema $schema): void
$this->addSql("INSERT INTO settings_current (variable, subkey, type, category, selected_value, title, comment, scope, subkeytext, access_url, access_url_changeable, access_url_locked) VALUES ('smtp_from_name', null, null, 'mail', '$selectedMailValue', 'smtp_from_name', null, '', null, 1, 1, 1)");
}
-}
\ No newline at end of file
+}
diff --git a/src/CoreBundle/Migrations/Schema/V200/Version20240519210000.php b/src/CoreBundle/Migrations/Schema/V200/Version20240519210000.php
index a0e8470ba0f..7f128508840 100644
--- a/src/CoreBundle/Migrations/Schema/V200/Version20240519210000.php
+++ b/src/CoreBundle/Migrations/Schema/V200/Version20240519210000.php
@@ -11,6 +11,8 @@
use Chamilo\CoreBundle\Entity\TrackEAttempt;
use Chamilo\CoreBundle\Migrations\AbstractMigrationChamilo;
use Doctrine\DBAL\Schema\Schema;
+use RecursiveDirectoryIterator;
+use RecursiveIteratorIterator;
use Symfony\Component\HttpFoundation\File\UploadedFile;
final class Version20240519210000 extends AbstractMigrationChamilo
@@ -46,7 +48,7 @@ public function up(Schema $schema): void
$filePath = "app/courses/{$courseDir}/exercises/{$pathPattern}";
$this->processFile($filePath, $attemptRepo, $attemptData);
} else {
- error_log('MIGRATIONS :: File not found for pattern: ' . $pathPattern);
+ error_log('MIGRATIONS :: File not found for pattern: '.$pathPattern);
}
}
@@ -56,8 +58,8 @@ public function up(Schema $schema): void
private function findCourseDirectory(string $pathPattern): ?string
{
$kernel = $this->container->get('kernel');
- $rootPath = $kernel->getProjectDir() . '/app/courses/';
- $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($rootPath));
+ $rootPath = $kernel->getProjectDir().'/app/courses/';
+ $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($rootPath));
foreach ($iterator as $file) {
if (str_contains($file->getPathname(), $pathPattern)) {
@@ -93,17 +95,19 @@ private function processFile(string $filePath, $attemptRepo, array $attemptData)
$asset = (new Asset())
->setCategory(Asset::EXERCISE_ATTEMPT)
->setTitle($fileName)
- ->setFile($file);
+ ->setFile($file)
+ ;
$this->entityManager->persist($asset);
$this->entityManager->flush();
$attemptFile = (new AttemptFile())
- ->setAsset($asset);
+ ->setAsset($asset)
+ ;
$attempt->addAttemptFile($attemptFile);
$this->entityManager->persist($attemptFile);
$this->entityManager->flush();
- error_log('MIGRATIONS :: File processed and inserted as asset and attempt file: ' . $filePath);
+ error_log('MIGRATIONS :: File processed and inserted as asset and attempt file: '.$filePath);
}
}
}
diff --git a/src/CoreBundle/Security/Authorization/Voter/UserVoter.php b/src/CoreBundle/Security/Authorization/Voter/UserVoter.php
index 105552f1666..df28691d6fd 100644
--- a/src/CoreBundle/Security/Authorization/Voter/UserVoter.php
+++ b/src/CoreBundle/Security/Authorization/Voter/UserVoter.php
@@ -67,7 +67,7 @@ protected function voteOnAttribute(string $attribute, $subject, TokenInterface $
if (self::VIEW === $attribute) {
// If the user is on the social page and is logged in, allow access
- if ($this->isFromSocialPage() && $currentUser->getId() !== null) {
+ if ($this->isFromSocialPage() && null !== $currentUser->getId()) {
return true;
}
@@ -104,7 +104,8 @@ private function isFromSocialPage(): bool
$request = $this->requestStack->getCurrentRequest();
if ($request) {
$pageOrigin = $request->query->get('page_origin');
- return $pageOrigin === 'social';
+
+ return 'social' === $pageOrigin;
}
return false;
diff --git a/src/CoreBundle/ServiceHelper/MailHelper.php b/src/CoreBundle/ServiceHelper/MailHelper.php
index d47f66dc451..d55d744cc58 100644
--- a/src/CoreBundle/ServiceHelper/MailHelper.php
+++ b/src/CoreBundle/ServiceHelper/MailHelper.php
@@ -119,4 +119,4 @@ public function send(
return false;
}
}
-}
\ No newline at end of file
+}
diff --git a/src/CoreBundle/State/MessageProcessor.php b/src/CoreBundle/State/MessageProcessor.php
index dd222907fdd..d82df59b08a 100644
--- a/src/CoreBundle/State/MessageProcessor.php
+++ b/src/CoreBundle/State/MessageProcessor.php
@@ -28,7 +28,7 @@ public function process($data, Operation $operation, array $uriVariables = [], a
$message = $this->persistProcessor->process($data, $operation, $uriVariables, $context);
- assert($message instanceof Message);
+ \assert($message instanceof Message);
if ($operation instanceof Post) {
if (Message::MESSAGE_TYPE_INBOX === $message->getMsgType()) {
From 50dfee4881c4432b24ceb9cc467069eee0d8adbe Mon Sep 17 00:00:00 2001
From: Angel Fernando Quiroz Campos
Date: Fri, 24 May 2024 17:15:23 -0500
Subject: [PATCH 292/413] CI: Fix message repository test
---
.../Repository/MessageRepositoryTest.php | 302 ++++++------------
1 file changed, 95 insertions(+), 207 deletions(-)
diff --git a/tests/CoreBundle/Repository/MessageRepositoryTest.php b/tests/CoreBundle/Repository/MessageRepositoryTest.php
index ab18d2b0733..b73d98ffb76 100644
--- a/tests/CoreBundle/Repository/MessageRepositoryTest.php
+++ b/tests/CoreBundle/Repository/MessageRepositoryTest.php
@@ -17,7 +17,7 @@
use Chamilo\CoreBundle\Repository\Node\UserRepository;
use Chamilo\Tests\AbstractApiTest;
use Chamilo\Tests\ChamiloTestTrait;
-use DateTime;
+use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Messenger\Transport\InMemoryTransport;
class MessageRepositoryTest extends AbstractApiTest
@@ -26,59 +26,103 @@ class MessageRepositoryTest extends AbstractApiTest
public function testCreateMessage(): void
{
- $em = $this->getEntityManager();
-
- $messageRepo = self::getContainer()->get(MessageRepository::class);
- $userRepo = self::getContainer()->get(UserRepository::class);
- $messageRelUserRepo = $em->getRepository(MessageRelUser::class);
-
- $admin = $this->getUser('admin');
- $testUser = $this->createUser('test');
-
- $message = (new Message())
- ->setTitle('hello')
- ->setContent('content')
- ->setMsgType(Message::MESSAGE_TYPE_INBOX)
- ->setSender($admin)
- ->addReceiverTo($testUser)
- ->setSendDate(new DateTime())
- ->setVotes(0)
- ->setGroup(null)
- ->setUpdateDate(new DateTime())
- ->setParent(null)
+ $this->createUser('from');
+ $senderUserIri = $this->findIriBy(User::class, ['username' => 'from']);
+ $fromUserToken = $this->getUserToken(['username' => 'from', 'password' => 'from']);
+
+ $this->createUser('to');
+ $receiverUserIri = $this->findIriBy(User::class, ['username' => 'to']);
+ $receiverUserToken = $this->getUserToken(['username' => 'to', 'password' => 'to']);
+
+ $this->createUser('cc');
+ $receiverCopyUserIri = $this->findIriBy(User::class, ['username' => 'cc']);
+ $receiverCopyUserToken = $this->getUserToken(['username' => 'cc', 'password' => 'cc']);
+
+ $response = $this
+ ->createClientWithCredentials($fromUserToken)
+ ->request(
+ 'POST',
+ '/api/messages',
+ [
+ 'json' => [
+ 'title' => 'hello',
+ 'content' => 'content of hello',
+ 'msgType' => Message::MESSAGE_TYPE_INBOX,
+ 'sender' => $senderUserIri,
+ 'receivers' => [
+ [
+ 'receiver' => $receiverUserIri,
+ 'receiverType' => MessageRelUser::TYPE_TO,
+ ],
+ [
+ 'receiver' => $receiverCopyUserIri,
+ 'receiverType' => MessageRelUser::TYPE_CC,
+ ],
+ ],
+ ],
+ ]
+ )
;
- $this->assertHasNoEntityViolations($message);
- $messageRepo->update($message);
-
- $this->assertNotNull($message->getUpdateDate());
- $this->assertNull($message->getParent());
- $this->assertTrue($message->hasUserReceiver($testUser));
-
- $transport = $this->getContainer()->get('messenger.transport.sync_priority_high');
- $this->assertCount(1, $transport->getSent());
-
- // 1. Message exists in the inbox.
- $count = $messageRepo->count(['msgType' => Message::MESSAGE_TYPE_INBOX]);
- $this->assertSame(1, $count);
-
- // One receiver in MessageRelUser.
- $this->assertSame(1, $messageRelUserRepo->count([]));
- $this->assertSame(0, $message->getVotes());
- $this->assertSame(1, $message->getReceivers()->count());
-
- // Check if message was schedule to be sent.
- /** @var InMemoryTransport $transport */
- $transport = $this->getContainer()->get('messenger.transport.sync_priority_high');
- $this->assertCount(1, $transport->getSent());
-
- $em->clear();
-
- /** @var User $testUser */
- $testUser = $userRepo->find($testUser->getId());
+ $this->assertResponseIsSuccessful();
+ $this->assertResponseStatusCodeSame(Response::HTTP_CREATED);
+ $this->assertResponseHeaderSame('content-type', 'application/ld+json; charset=utf-8');
+ $this->assertJsonContains(
+ [
+ '@context' => '/api/contexts/Message',
+ '@type' => 'Message',
+ 'sender' => [
+ '@id' => $senderUserIri,
+ ],
+ 'msgType' => Message::MESSAGE_TYPE_INBOX,
+ 'receiversTo' => [
+ 0 => [
+ '@type' => 'MessageRelUser',
+ 'receiver' => [
+ '@id' => $receiverUserIri,
+ ],
+ 'receiverType' => MessageRelUser::TYPE_TO,
+ ],
+ ],
+ 'receiversCc' => [
+ 0 => [
+ '@type' => 'MessageRelUser',
+ 'receiver' => [
+ '@id' => $receiverCopyUserIri,
+ ],
+ 'receiverType' => MessageRelUser::TYPE_CC,
+ ],
+ ],
+ ]
+ );
+ $this->assertEmailCount(2);
+
+ $messageArray = $response->toArray();
+ $messageRelUserIri = $messageArray['firstReceiver']['@id'];
+
+ $this
+ ->createClientWithCredentials($receiverUserToken)
+ ->request(
+ 'PUT',
+ $messageRelUserIri,
+ [
+ 'json' => [
+ 'read' => true,
+ 'starred' => true,
+ ],
+ ]
+ )
+ ;
- // Receiver should have one message.
- $this->assertSame(1, $testUser->getReceivedMessages()->count());
+ $this->assertResponseIsSuccessful();
+ $this->assertResponseStatusCodeSame(Response::HTTP_OK);
+ $this->assertJsonContains(
+ [
+ '@type' => 'MessageRelUser',
+ 'read' => true,
+ 'starred' => true,
+ ]
+ );
}
public function testCreateMessageWithTags(): Message
@@ -373,162 +417,6 @@ public function testDeleteMessage(): void
$this->assertSame(0, $messageTagRepo->count([]));
}
- public function testCreateMessageWithCc(): void
- {
- $em = $this->getEntityManager();
-
- $messageRepo = self::getContainer()->get(MessageRepository::class);
- $userRepo = self::getContainer()->get(UserRepository::class);
- $messageRelUserRepo = $em->getRepository(MessageRelUser::class);
-
- $admin = $this->getUser('admin');
- $testUser = $this->createUser('test');
- $receiverCopy = $this->createUser('cc');
-
- $message =
- (new Message())
- ->setTitle('hello')
- ->setContent('content')
- ->setMsgType(Message::MESSAGE_TYPE_INBOX)
- ->setSender($admin)
- ->addReceiverTo($testUser)
- ->addReceiverCc($receiverCopy, MessageRelUser::TYPE_CC)
- ;
-
- $this->assertHasNoEntityViolations($message);
- $messageRepo->update($message);
-
- // 1. Message exists in the inbox.
- $count = $messageRepo->count(['msgType' => Message::MESSAGE_TYPE_INBOX]);
- $this->assertSame(1, $count);
-
- $this->assertSame(2, $messageRelUserRepo->count([]));
-
- // Check if message was schedule to be sent.
- /** @var InMemoryTransport $transport */
- $transport = $this->getContainer()->get('messenger.transport.sync_priority_high');
- $this->assertCount(1, $transport->getSent());
-
- $em->clear();
-
- /** @var Message $message */
- $message = $messageRepo->find($message->getId());
-
- $this->assertSame(2, $message->getReceivers()->count());
-
- // Delete message.
- $messageRepo->delete($message);
-
- // No messages.
- $this->assertSame(0, $messageRepo->count([]));
- // No message_rel_user.
- $this->assertSame(0, $messageRelUserRepo->count([]));
- }
-
- public function testCreateMessageWithApi(): void
- {
- $fromUser = $this->createUser('from');
- $toUser = $this->createUser('to');
- $messageRepo = self::getContainer()->get(MessageRepository::class);
-
- $tokenFrom = $this->getUserToken(
- [
- 'username' => 'from',
- 'password' => 'from',
- ]
- );
-
- $response = $this->createClientWithCredentials($tokenFrom)->request(
- 'POST',
- '/api/messages',
- [
- 'json' => [
- 'title' => 'hello',
- 'content' => 'content of hello',
- 'msgType' => Message::MESSAGE_TYPE_INBOX,
- 'sender' => $fromUser->getIri(),
- 'receivers' => [
- [
- 'receiver' => $toUser->getIri(),
- ],
- ],
- ],
- ]
- );
-
- $this->assertResponseIsSuccessful();
- $this->assertResponseStatusCodeSame(201);
- $this->assertResponseHeaderSame('content-type', 'application/ld+json; charset=utf-8');
- $this->assertJsonContains(
- [
- // '@context' => '/api/contexts/Message',
- // '@type' => 'Message',
- // 'title' => 'hello',
- 'receiversTo' => [
- [
- '@type' => 'MessageRelUser',
- 'receiver' => [
- '@id' => $toUser->getIri(),
- '@type' => 'http://schema.org/Person',
- 'username' => $toUser->getUsername(),
- ],
- 'read' => false,
- 'starred' => false,
- ],
- ],
- ]
- );
-
- // Messages: 1 from inbox
- $this->assertSame(1, $messageRepo->count(['msgType' => Message::MESSAGE_TYPE_INBOX]));
-
- // The message was added in the queue.
- /** @var InMemoryTransport $transport */
- $transport = $this->getContainer()->get('messenger.transport.sync_priority_high');
- $this->assertCount(1, $transport->getSent());
-
- // Receiver adds tags + starred
-
- $messageId = $response->toArray()['id'];
-
- /** @var Message $message */
- $message = $messageRepo->find($messageId);
-
- /** @var MessageRelUser $messageRelUser */
- $messageRelUser = $message->getReceivers()->first();
-
- $response = $this->createClientWithCredentials($tokenFrom)->request(
- 'PUT',
- '/api/message_rel_users/'.$messageRelUser->getId(),
- [
- 'json' => [
- 'read' => true,
- 'starred' => true,
- /*'tags' => [
- [
- '',
- ],
- [
- 'tag' => 'pop',
- ]
- ]*/
- ],
- ]
- );
-
- $this->assertResponseIsSuccessful();
- $this->assertResponseStatusCodeSame(200);
- $this->assertJsonContains(
- [
- '@context' => '/api/contexts/MessageRelUser',
- '@type' => 'MessageRelUser',
- 'read' => true,
- 'starred' => true,
- // 'tags' => []
- ]
- );
- }
-
public function testCreateMessageWithApiAsOtherUser(): void
{
$fromUser = $this->createUser('from');
From a416426b939cf0ac1795aa269048e751b7230b81 Mon Sep 17 00:00:00 2001
From: Angel Fernando Quiroz Campos
Date: Fri, 24 May 2024 17:23:26 -0500
Subject: [PATCH 293/413] Internal: validate email address before set it in
mail - refs BT#21613
---
public/main/inc/lib/api.lib.php | 26 ++++++++++++++-----
.../Repository/MessageRepositoryTest.php | 1 -
2 files changed, 20 insertions(+), 7 deletions(-)
diff --git a/public/main/inc/lib/api.lib.php b/public/main/inc/lib/api.lib.php
index 7213d8c0de0..2ad2f434aa3 100644
--- a/public/main/inc/lib/api.lib.php
+++ b/public/main/inc/lib/api.lib.php
@@ -20,6 +20,7 @@
use Symfony\Component\Mime\Address;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\User\UserInterface;
+use Symfony\Component\Validator\Constraints as Assert;
use ZipStream\Option\Archive;
use ZipStream\ZipStream;
use Chamilo\CoreBundle\Component\Utils\ActionIcon;
@@ -7112,6 +7113,9 @@ function api_set_noreply_and_from_address_to_mailer(
array $sender,
array $replyToAddress = []
): void {
+ $validator = Container::getLegacyHelper()->getValidator();
+ $emailConstraint = new Assert\Email();
+
$noReplyAddress = api_get_setting('noreply_email_address');
$avoidReplyToAddress = false;
@@ -7129,13 +7133,23 @@ function api_set_noreply_and_from_address_to_mailer(
$senderEmail = !empty($sender['email']) ? $sender['email'] : $defaultSenderEmail;
// Send errors to the platform admin
- $email
- ->getHeaders()
- ->addIdHeader('Errors-To', api_get_setting('admin.administrator_email'))
- ;
+ $adminEmail = api_get_setting('admin.administrator_email');
+
+ $adminEmailValidation = $validator->validate($adminEmail, $emailConstraint);
+
+ if (!empty($adminEmail) && 0 === $adminEmailValidation->count()) {
+ $email
+ ->getHeaders()
+ ->addIdHeader('Errors-To', $adminEmail)
+ ;
+ }
+
+ if (!$avoidReplyToAddress) {
+ $replyToEmailValidation = $validator->validate($replyToAddress['mail'], $emailConstraint);
- if (!$avoidReplyToAddress && !empty($replyToAddress)) {
- $email->addReplyTo(new Address($replyToAddress['mail'], $replyToAddress['name']));
+ if (!empty($replyToAddress) && 0 === $replyToEmailValidation->count()) {
+ $email->addReplyTo(new Address($replyToAddress['mail'], $replyToAddress['name']));
+ }
}
if ('true' === api_get_setting('mail.smtp_unique_sender')) {
diff --git a/tests/CoreBundle/Repository/MessageRepositoryTest.php b/tests/CoreBundle/Repository/MessageRepositoryTest.php
index b73d98ffb76..05b5d671e40 100644
--- a/tests/CoreBundle/Repository/MessageRepositoryTest.php
+++ b/tests/CoreBundle/Repository/MessageRepositoryTest.php
@@ -18,7 +18,6 @@
use Chamilo\Tests\AbstractApiTest;
use Chamilo\Tests\ChamiloTestTrait;
use Symfony\Component\HttpFoundation\Response;
-use Symfony\Component\Messenger\Transport\InMemoryTransport;
class MessageRepositoryTest extends AbstractApiTest
{
From 0da3b71f7ff82b7661ccde24a60e2bd72b8a8ee6 Mon Sep 17 00:00:00 2001
From: Angel Fernando Quiroz Campos
Date: Fri, 24 May 2024 18:26:41 -0500
Subject: [PATCH 294/413] CI: Suppress psalm error about ContainerDependency
---
src/CoreBundle/EventListener/LegacyListener.php | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/CoreBundle/EventListener/LegacyListener.php b/src/CoreBundle/EventListener/LegacyListener.php
index 01d699cc6bc..b52183e88bc 100644
--- a/src/CoreBundle/EventListener/LegacyListener.php
+++ b/src/CoreBundle/EventListener/LegacyListener.php
@@ -26,6 +26,9 @@
*/
class LegacyListener
{
+ /**
+ * @psalm-suppress ContainerDependency
+ */
public function __construct(
private readonly Environment $twig,
private readonly TokenStorageInterface $tokenStorage,
From d17fb609b495ca651eef2573a4aaa01537dbf18b Mon Sep 17 00:00:00 2001
From: Yannick Warnier
Date: Mon, 27 May 2024 10:08:59 +0200
Subject: [PATCH 295/413] Language: Update language terms
---
translations/messages.es.po | 194 +++++++++++++++++++++++++++++++++++-
1 file changed, 193 insertions(+), 1 deletion(-)
diff --git a/translations/messages.es.po b/translations/messages.es.po
index 15d931e2365..341b0ecbb8f 100644
--- a/translations/messages.es.po
+++ b/translations/messages.es.po
@@ -1,7 +1,7 @@
msgid ""
msgstr ""
"Project-Id-Version: chamilo\n"
-"PO-Revision-Date: 2024-05-23 13:20+0000\n"
+"PO-Revision-Date: 2024-05-27 08:08+0000\n"
"Last-Translator: Yannick Warnier \n"
"Language-Team: Spanish \n"
@@ -26603,3 +26603,195 @@ msgstr ""
"Defina un arreglo de rangos de puntuación y colores para mostrar informes "
"utilizando este modelo. Esto le permite mostrar colores en lugar de "
"calificaciones numéricas."
+
+msgid "Gradebook comments"
+msgstr "Comentarios en la herramienta de evaluaciones"
+
+msgid "Add additional columns to the gradebook's main report (1 = ranking, 2 = best score, 3 = average)."
+msgstr ""
+"Añadir columnas adicionales al informe principal de la herramienta de "
+"evaluaciones (1 = clasificación, 2 = mejor puntuación, 3 = promedio)."
+
+msgid "Hide gradebook table for learners"
+msgstr "Ocultar la tabla de la herramienta de evaluaciones para alumnos"
+
+msgid "Improve speed when rendering gradebook student reports using Doctrine APCU cache. APCu is an optional but recommended PHP extension."
+msgstr ""
+"Mejorar la velocidad al generar informes de alumnos en la herramienta de "
+"evaluaciones utilizando la caché APCU de Doctrine. APCu es una extensión PHP "
+"opcional pero recomendada."
+
+msgid "Allow multiple evaluation attempts in gradebook"
+msgstr ""
+"Permitir varios intentos de evaluación en la herramienta de evaluaciones"
+
+msgid "Gradebook reports score style"
+msgstr "Estilo de puntuación de informes de la herramienta de evaluaciones"
+
+msgid "User extra fields in gradebook flat view"
+msgstr ""
+"Campos de perfil de usuario en la vista plana de la herramienta de "
+"evaluaciones"
+
+msgid "If your portal is resources-limited, reducing the generation of the dynamic gradebok charts with potentially thousands of results is a good option."
+msgstr ""
+"Si su portal tiene recursos limitados, reducir la generación de los gráficos "
+"dinámicos de la herramienta de evaluaciones (con potencialmente miles de "
+"resultados) es una buena opción."
+
+msgid "Hide percentage in best/average gradebook results"
+msgstr ""
+"Ocultar porcentaje en los resultados promedio/mejores de la herramienta de "
+"evaluaciones"
+
+msgid "Language switcher in main menu"
+msgstr "Selector de idioma en el menú principal"
+
+msgid "Use country flags for languages. This is not enabled by default because some languages are not strictly attached to a country, which can lead to frustration for some users."
+msgstr ""
+"Utilizar banderas de países para los idiomas. Esto no está habilitado de "
+"forma predeterminada porque algunos idiomas no están estrictamente "
+"vinculados a un país, lo que puede causar frustración para algunos usuarios."
+
+msgid "Gradebook extra statistics"
+msgstr "Estadísticas adicionales en la herramienta de evaluaciones"
+
+msgid "Multiple-language document templates"
+msgstr "Plantillas de documentos multilingües"
+
+msgid "When using inter-gradebook dependencies, you can choose a list of mandatory courses that will be required before approving any gradebook that has dependencies."
+msgstr ""
+"Al utilizar dependencias entre herramientas de evaluaciones, puede elegir "
+"una lista de cursos obligatorios que serán necesarios antes de aprobar "
+"cualquier herramienta de evaluaciones que tenga dependencias."
+
+msgid "Invisible tests visible in learning paths"
+msgstr "Hacer visibles en lecciones los ejercicios invisibles"
+
+msgid "Multiple-language courses"
+msgstr "Cursos multilingües"
+
+msgid "Use APCu caching to speed up gradebok"
+msgstr "Utilice el caché APCu para acelerar la herramienta de evaluaciones"
+
+msgid "Enables a mechanism of gradebook dependencies that lets people know which other items they need to go through first in order to complete the gradebook."
+msgstr ""
+"Activa un mecanismo de dependencias en la herramienta de evaluaciones que "
+"permite a los alumnos saber qué otros elementos necesitan completar primero "
+"para finalizar los elementos de la evaluación."
+
+msgid "Language flags"
+msgstr "Banderas de idiomas"
+
+msgid "Enable document templates (at the platform or course level) to be configured for specific languages."
+msgstr ""
+"Habilitar la posibilidad de usar plantillas de documentos (a nivel de "
+"plataforma o curso) para idiomas específicos."
+
+msgid "Add the given columns ('variables' array) to the main results table in the gradebook."
+msgstr ""
+"Agregar las columnas dadas (array 'variables') a la tabla de resultados "
+"principales en la herramienta de evaluaciones."
+
+msgid "Cache results in the gradebook"
+msgstr "Poner resultados en caché en la herramienta de evaluaciones"
+
+msgid "Avoid learners clicking on items from the gradebook by removing the links on the items."
+msgstr ""
+"Evitar que los alumnos hagan clic en elementos de la herramienta de "
+"evaluaciones eliminando los enlaces de los ítems."
+
+msgid "Enable skills by gradebook's subcategory"
+msgstr "Habilite competencias por subcategoría de evaluaciones"
+
+msgid "Add gradebook score style configuration in the flat view. See api.lib.php in order to find the options: examples SCORE_DIV = 1, SCORE_PERCENT = 2, etc"
+msgstr ""
+"Añada configuración de estilo de puntuación en la herramienta de "
+"evaluaciones en la vista plana. Consulte api.lib.php para encontrar las "
+"opciones: ejemplos SCORE_DIV = 1, SCORE_PERCENT = 2, etc"
+
+msgid "Enable gradebook comments so teachers can add a comment to the overall performance of the learner in this course. The comment will appear in the PDF export for the learner."
+msgstr ""
+"Activar comentarios en la herramienta de evaluaciones para que los tutores "
+"puedan agregar un comentario sobre el rendimiento general del alumno en este "
+"curso. El comentario aparecerá en la exportación en PDF para el alumno."
+
+msgid "Generate a block inside the side menu where a few badges can be shown as pending approval. Requires gradebooks to be listed here, by (numerical) ID."
+msgstr ""
+"Generar un bloque dentro del menú lateral donde se puedan mostrar algunas "
+"insignias como pendientes de aprobación. Requiere que las evaluaciones se "
+"listen aquí, por ID (numérico)."
+
+msgid "Display a language selector in the main menu that immediately updates the language preference of the user. This can be useful in multilingual portals where learners have to switch from one language to another for their learning."
+msgstr ""
+"Mostrar un selector de idioma en el menú principal que actualice "
+"inmediatamente la preferencia de idioma del usuario. Esto puede ser útil en "
+"portales multilingües donde los alumnos tienen que cambiar de un idioma a "
+"otro para su aprendizaje."
+
+msgid "Skills are normally attributed for completing a whole gradebook. By enabling this option, you allow skills to be attached to sub-sections of gradebooks."
+msgstr ""
+"Las competencias suelen otorgarse por completar toda la herramienta de "
+"evaluaciones. Al activar esta opción, permite que las competencias se "
+"asignen a subsecciones de la herramienta de evaluaciones."
+
+msgid "Mandatory courses for gradebook dependencies"
+msgstr "Cursos obligatorios para dependencias de la herramienta de evaluaciones"
+
+msgid "Hide gradebook button 'download PDF report'"
+msgstr "Ocultar botón 'descargar informe PDF' de la herramienta de evaluaciones"
+
+msgid "Use global score display setting in gradebook"
+msgstr ""
+"Utilice la configuración de visualización de puntuación global en la "
+"herramienta de evaluaciones"
+
+msgid "Hide item links for learners in gradebook"
+msgstr "Ocultar enlaces de ítems para alumnos en la herramienta de evaluaciones"
+
+msgid "Gradebook PDF export options"
+msgstr "Opciones de exportación de PDF de la herramienta de evaluaciones"
+
+msgid "Change the PDF export for learners based on the provided settings ('hide_score_weight', 'hide_feedback_textarea', ...)"
+msgstr ""
+"Modificar la exportación en PDF para alumnos basada con la configuración "
+"proporcionada ('hide_score_weight', 'hide_feedback_textarea', ...)"
+
+msgid "Reduce gradebook load time by hiding the results table (but still giving access to certificates, skills, etc)."
+msgstr ""
+"Reducir el tiempo de carga del libro de calificaciones ocultando la tabla de "
+"resultados (pero manteniendo el acceso a certificados, habilidades, etc.)."
+
+msgid "Inter-gradebook dependencies"
+msgstr "Dependencias entre herramientas de evaluaciones"
+
+msgid "Enable courses managed in more than one language. This option adds a language selector within the course page to let users switch easily, and adds a 'multiple_language' extra field to courses which allows for remote management procedures."
+msgstr ""
+"Habilite cursos gestionados en más de un idioma. Esta opción añade un "
+"selector de idioma dentro de la página del curso para permitir a los "
+"usuarios cambiar fácilmente, y añade un campo de perfil 'multiple_language' "
+"a los cursos que permite procedimientos de gestión remota."
+
+msgid "Put some of the large calculations of averages in cached fields for the links and evaluations to increase speed (considerably). The potential negative impact is that it can take some time to refresh the gradebook results tables."
+msgstr ""
+"Colocar algunos de los grandes cálculos de promedios en campos almacenados "
+"en caché para los enlaces y evaluaciones para aumentar la velocidad "
+"(considerablemente). El posible impacto negativo es que puede tomar unos "
+"minutos con datos pasados en la tablas de resultados (en la misma "
+"herramienta de evaluaciones)."
+
+msgid "Custom score display in gradebook's standalone column"
+msgstr ""
+"Visualización personalizada de puntuaciones en una columna independiente de "
+"la herramienta de evaluaciones"
+
+msgid "Gradebook badges sidebar"
+msgstr "Barra lateral de insignias de la herramienta de evaluaciones"
+
+msgid "Make tests marked as 'invisible' in the tests tool appear when they are included in a learning path."
+msgstr ""
+"Hacer que los ejercicios marcados como 'invisible' en la herramienta de "
+"ejercicios aparezcan cuando se incluyan en una lección."
+
+msgid "Use test settings for grades display"
+msgstr "Utilice la configuración de ejercicios para mostrar las calificaciones"
From ded0739f6419a828f45538b091ef11e2f5f5c8bc Mon Sep 17 00:00:00 2001
From: Yannick Warnier
Date: Mon, 27 May 2024 17:58:09 +0200
Subject: [PATCH 296/413] Message: Check whether there is at least one
attachment before showing the attachments section - refs BT#21594
---
assets/vue/views/message/MessageShow.vue | 53 ++++++++++---------
.../default/message/view_message.html.twig | 2 +-
translations/messages.fr.po | 4 +-
3 files changed, 30 insertions(+), 29 deletions(-)
diff --git a/assets/vue/views/message/MessageShow.vue b/assets/vue/views/message/MessageShow.vue
index 63dd0a06867..a9e598c0947 100644
--- a/assets/vue/views/message/MessageShow.vue
+++ b/assets/vue/views/message/MessageShow.vue
@@ -104,36 +104,37 @@
-
-
-
@@ -10708,7 +10714,7 @@ private function sendNotificationForOralQuestions(
'.get_lang('Answer').'
-
'.$answer.$file.'
+
'.$answer.'
'.$file.'
';
}
}
diff --git a/public/main/inc/lib/exercise.lib.php b/public/main/inc/lib/exercise.lib.php
index 69949173417..8023b561acb 100644
--- a/public/main/inc/lib/exercise.lib.php
+++ b/public/main/inc/lib/exercise.lib.php
@@ -5115,38 +5115,54 @@ public static function getOralFeedbackForm($attemptId, $questionId)
}
/**
- * Get the HTML audio element for the oral file of a specific track exercise question attempt.
+ * Retrieves the generated audio files for an oral question in an exercise attempt.
+ *
+ * @param int $trackExerciseId The ID of the tracked exercise.
+ * @param int $questionId The ID of the question.
+ * @param bool $returnUrls (Optional) If set to true, only the URLs of the audio files are returned. Default is false.
+ *
+ * @return array|string If $returnUrls is true, returns an array of URLs of the audio files. Otherwise, returns an HTML string with audio tags.
*/
- public static function getOralFileAudio(int $trackExerciseId, int $questionId): string
+ public static function getOralFileAudio(int $trackExerciseId, int $questionId, bool $returnUrls = false): array|string
{
/** @var TrackEExercise $trackExercise */
$trackExercise = Container::getTrackEExerciseRepository()->find($trackExerciseId);
if (null === $trackExercise) {
- return '';
+ return $returnUrls ? [] : '';
}
$questionAttempt = $trackExercise->getAttemptByQuestionId($questionId);
if (null === $questionAttempt) {
- return '';
+ return $returnUrls ? [] : '';
}
$assetRepo = Container::getAssetRepository();
- $html = '';
- foreach ($questionAttempt->getAttemptFiles() as $attemptFile) {
- $html .= Display::tag(
- 'audio',
- '',
- [
- 'src' => $assetRepo->getAssetUrl($attemptFile->getAsset()),
- 'controls' => '',
- ]
- );
- }
+ if ($returnUrls) {
+ $basePath = rtrim(api_get_path(WEB_PATH), '/');
+ $urls = [];
+ foreach ($questionAttempt->getAttemptFiles() as $attemptFile) {
+ $urls[] = $basePath.$assetRepo->getAssetUrl($attemptFile->getAsset());
+ }
- return $html;
+ return $urls;
+ } else {
+ $html = '';
+ foreach ($questionAttempt->getAttemptFiles() as $attemptFile) {
+ $html .= Display::tag(
+ 'audio',
+ '',
+ [
+ 'src' => $assetRepo->getAssetUrl($attemptFile->getAsset()),
+ 'controls' => '',
+ ]
+ );
+ }
+
+ return $html;
+ }
}
/**
From 46e9e151dbeb81c3034639c5ad64d4cda7b9ab48 Mon Sep 17 00:00:00 2001
From: Yannick Warnier
Date: Tue, 28 May 2024 23:12:17 +0200
Subject: [PATCH 302/413] Language: Update language terms
---
translations/messages.es.po | 269 +++++++++++++++++++++++++++++++++++-
1 file changed, 268 insertions(+), 1 deletion(-)
diff --git a/translations/messages.es.po b/translations/messages.es.po
index 341b0ecbb8f..19b295c604e 100644
--- a/translations/messages.es.po
+++ b/translations/messages.es.po
@@ -1,7 +1,7 @@
msgid ""
msgstr ""
"Project-Id-Version: chamilo\n"
-"PO-Revision-Date: 2024-05-27 08:08+0000\n"
+"PO-Revision-Date: 2024-05-28 21:11+0000\n"
"Last-Translator: Yannick Warnier \n"
"Language-Team: Spanish \n"
@@ -26795,3 +26795,270 @@ msgstr ""
msgid "Use test settings for grades display"
msgstr "Utilice la configuración de ejercicios para mostrar las calificaciones"
+
+msgid "Learning paths subscription settings"
+msgstr "Configuración de suscripción a lecciones"
+
+msgid "Disable JS files that Chamilo usually adds to HTML files in the learning path (while displaying them)."
+msgstr ""
+"Desactivar los archivos JS que Chamilo suele añadir a los archivos HTML en "
+"la lección (mientras se muestran)."
+
+msgid "Hide 'My learning paths' page"
+msgstr "Ocultar la página 'Mis lecciones'"
+
+msgid "Add a minimum time field to learning paths. If the user has not spent that much time on the learning path, the last item of the learning path cannot be completed."
+msgstr ""
+"Agregar un campo de tiempo mínimo a las lecciones. Si el usuario no ha "
+"pasado ese tiempo en la lección, no se puede completar el último elemento de "
+"la lección."
+
+msgid "Set this to 'left' or 'right' to change the side of the learning path menu."
+msgstr ""
+"Establezca esto en 'left' (izquierda) o 'right' (derecha) para cambiar el "
+"lado del menú de la lección."
+
+msgid "Minimum time to complete learning path"
+msgstr "Tiempo mínimo para completar la lección"
+
+msgid "Export learning paths in the Chamilo backup format"
+msgstr "Exportar lecciones en el formato de exportación de cursos de Chamilo"
+
+msgid "Display tests from learning paths even if invisible"
+msgstr "Mostrar ejercicios de lecciones incluso si están ocultos"
+
+msgid "Use username as student_id in SCORM communication"
+msgstr "Usar el nombre de usuario como student_id en la comunicación SCORM"
+
+msgid "Foldable learning paths' categories"
+msgstr "Categorías de lecciones plegables"
+
+msgid "Normally, all .htaccess files are filtered and removed when importing content in Chamilo. This feature allows .htaccess to be imported if it is present in a SCORM package."
+msgstr ""
+"Normalmente, todos los archivos .htaccess se filtran y eliminan al importar "
+"contenido en la plataforma. Esta función permite que se importe .htaccess si "
+"está presente en un paquete SCORM."
+
+msgid "Hide requirements label in learning paths"
+msgstr "Ocultar etiqueta de requisitos en lecciones"
+
+msgid "Show hidden exercises that were added to a LP in the exercise list. If we are in a session, the test is invisible in the base course, it is included in a LP and the setting to show it is not specifically set to true, then hide it."
+msgstr ""
+"Mostrar ejercicios ocultos que se agregaron a una lección en la lista de "
+"ejercicios. Si estamos en una sesión, el ejercicio es invisible en el curso "
+"base, está incluido en una lección y la configuración para mostrarlo no está "
+"específicamente establecida, entonces ocultarlo."
+
+msgid "SCORM import within course import"
+msgstr "Importación de SCORM dentro de la importación del curso"
+
+msgid "Hide time from learning paths records"
+msgstr "Ocultar el tiempo de los registros de lecciones"
+
+msgid "Use learning path score as progress"
+msgstr "Utilizar la puntuación de la lección como progreso"
+
+msgid "Hide learning paths time spent in reports in general."
+msgstr "Ocultar el tiempo dedicado en lecciones de los informes en general."
+
+msgid "Use extra field as student_id in SCORM communication"
+msgstr "Usar el campo de perfil como student_id en la comunicación SCORM"
+
+msgid "Learning path menu location"
+msgstr "Ubicación del menú de lección"
+
+msgid "Teachers can access blocked learning paths"
+msgstr "Los profesores pueden acceder a lecciones bloqueadas"
+
+msgid "Export all files when exporting a learning path"
+msgstr "Exportar todos los archivos al exportar una lección"
+
+msgid "Learning path's prerequisites"
+msgstr "Pre-requisitos de la lección"
+
+msgid "Learning paths categories can be managed in sessions"
+msgstr "Las categorías de lecciones pueden gestionarse en sesiones"
+
+msgid "Disable JS in learning paths view"
+msgstr "Desactivar JS en la vista de lecciones"
+
+msgid "Configure additional options for the learning paths subscription feature. Options include 'allow_add_users_to_lp' and 'allow_add_users_to_lp_category'."
+msgstr ""
+"Configure opciones adicionales para la función de suscripción a lecciones. "
+"Las opciones incluyen 'allow_add_users_to_lp' y "
+"'allow_add_users_to_lp_category'."
+
+msgid "Add learning paths and tests info to ticket reporting"
+msgstr "Añadir información de lecciones y ejercicios al reporte de tickets"
+
+msgid "When exporting a LP, all files and folders in the same path of an html will be exported too."
+msgstr ""
+"Al exportar una lección, todos los archivos y carpetas en la misma ruta de "
+"un html también serán exportados."
+
+msgid "Use learning path item status from other sessions"
+msgstr "Utilizar estado del ítem de lección de otras sesiones"
+
+msgid "Allow users to complete prerequisites in a learning path if the corresponding item was already completed in another session."
+msgstr ""
+"Permitir a los usuarios completar los requisitos previos en una lección si "
+"el elemento correspondiente ya se completó en otra sesión."
+
+#, fuzzy
+msgid "The page 'My learning path' was added in 1.11. Use this option to hide it."
+msgstr ""
+"La página 'Mis lecciones' se añadió en la 1.11. Active esta opción para "
+"ocultarla."
+
+msgid "On the learning paths lists, display a visual element to show that other learning paths are currently blocked by some prerequisites rule."
+msgstr ""
+"En las listas de lecciones, mostrar un elemento visual para indicar que "
+"otras lecciones están actualmente bloqueadas por alguna regla de requisitos "
+"previos."
+
+msgid "This helps with browser compatibility by preventing tricky JS events to execute."
+msgstr ""
+"Esto ayuda con la compatibilidad del navegador al evitar la ejecución de "
+"eventos JS complicados."
+
+msgid "Enable the possibility to export any of your learning paths in a Chamilo course backup format."
+msgstr ""
+"Habilitar la posibilidad de exportar cualquiera de sus lecciones en un "
+"formato de copia de seguridad de curso de Chamilo."
+
+msgid "Enable to allow users to fold the categories in the learning paths list."
+msgstr ""
+"Habilitar para permitir a los usuarios contraer las categorías en la lista "
+"de lecciones."
+
+msgid "Prevent beforeunload JS event in learning path"
+msgstr "Evitar el evento JS beforeunload en la lección"
+
+msgid "Teachers do not need to pass complete learning paths to have access to a prerequisites-blocked learning path."
+msgstr ""
+"Los profesores no necesitan completar lecciones completas para tener acceso "
+"a una lección con bloqueo por requisitos previos."
+
+msgid "Allow .htaccess from SCORM packages"
+msgstr "Permitir .htaccess de paquetes SCORM"
+
+msgid "Hide the pre-requisites tooltip on learning path items. This is mostly an estaethic choice."
+msgstr ""
+"Ocultar el tooltip de requisitos previos en los elementos de la lección. "
+"Esto es principalmente una elección estética."
+
+msgid "Enable to copy the directory structure of SCORM packages when restoring a course (from the course maintenance tool)."
+msgstr ""
+"Habilitar para copiar la estructura de directorios de paquetes SCORM al "
+"restaurar un curso (desde la herramienta de mantenimiento del curso)."
+
+msgid "This is useful when using SCORM content with only one large SCO. SCORM does not communicate progress, so this is a trick to use the score as progress. Enabling this option will let you configure this on a per-learning path basis."
+msgstr ""
+"Esto es útil al usar contenido SCORM con un único SCO grande. SCORM no "
+"comunica el progreso, por lo que este truco se puede usar para poner la "
+"puntuación como progreso. Habilitar esta opción le permitirá configurar esto "
+"para cada lección individualmente."
+
+msgid "Give the name of the extra field to be used as student_id for all SCORM communication."
+msgstr ""
+"Indique el nombre del campo adicional que se utilizará como student_id para "
+"toda la comunicación SCORM."
+
+msgid "Foldable learning paths' items"
+msgstr "Elementos de lección plegables"
+
+msgid "Display link to learning path on course home when invisible"
+msgstr ""
+"Mostrar enlace a la lección en la página principal del curso cuando esté "
+"oculto"
+
+msgid "Show max progress instead of average for learning paths reporting"
+msgstr ""
+"Mostrar el progreso máximo en lugar del promedio en los informes de lecciones"
+
+msgid "Enable editing tests even if they have been included in a learning path. The default is to prevent edition if the test is in a learning path, because that can affect consistency of tracking among many learners if test modifications are significant."
+msgstr ""
+"Permitir la edición de ejercicios incluso si han sido incluidos en una "
+"lección. La configuración predeterminada es evitar la edición si el "
+"ejercicio está en una lección, porque eso puede afectar la consistencia del "
+"seguimiento entre muchos alumnos si las modificaciones del ejercicio son "
+"significativas."
+
+msgid "Download button after finishing learning paths"
+msgstr "Botón de descarga después de completar lecciones"
+
+msgid "Show download files button after finishing all LP. Example: if ABC is the course code, and 1 and 100 are the doc id, choose: ['courses' => ['ABC' => [1, 100]]]."
+msgstr ""
+"Mostrar botón de descarga de archivos después de finalizar todas las "
+"lecciones. Ejemplo: si ABC es el código del curso, y 1 y 100 son los ids de "
+"documento, elija: ['courses' => ['ABC' => [1, 100]]]."
+
+msgid "Select max progress vs average for learning paths at course level"
+msgstr ""
+"Seleccione el progreso máximo vs el promedio para lecciones a nivel de curso"
+
+msgid "This adds an 'unlocked' column in the learning paths list if the learner is subscribed to the given learning path and has access to it."
+msgstr ""
+"Esto añade una columna 'desbloqueado' en la lista de lecciones si el alumno "
+"está suscrito a la lección correspondiente y tiene acceso a ella."
+
+msgid "Edition of tests included in learning paths"
+msgstr "Edición de ejercicios incluidos en lecciones"
+
+msgid "Fixed encoding in learning path"
+msgstr "Codificación fija en las lecciones"
+
+msgid "Display tests in list of learning path tests even if invisible"
+msgstr ""
+"Muestre ejercicios en la lista de ejercicios de la lección incluso si están "
+"invisibles"
+
+msgid "When a test is used as prerequisite for an item in the learning path, use the last attempt of the test only as validation for the prerequisite (default is to use best attempt)."
+msgstr ""
+"Cuando un ejercicio se utiliza como requisito previo para un elemento de una "
+"lección, utilizar únicamente el último intento del ejercicio como validación "
+"para el requisito previo (por defecto se utiliza el mejor intento)."
+
+msgid "Enable subscription to learning paths and learning path categories to groups/classes."
+msgstr ""
+"Habilite la suscripción a lecciones y categorías de lecciones para grupos/"
+"clases."
+
+msgid "Learning path display settings"
+msgstr "Configuración de visualización de la lección"
+
+msgid "Use last score in learning path test prerequisites"
+msgstr ""
+"Utilice la última puntuación en los requisitos previos del ejercicio en "
+"lecciones"
+
+msgid "Learners can export learning paths"
+msgstr "Los alumnos pueden exportar lecciones"
+
+msgid "Reduce resource usage by ignoring a check on the text encoding in imported learning paths."
+msgstr ""
+"Reducir el uso de recursos ignorando la verificación de la codificación de "
+"texto en lecciones importadas."
+
+msgid "Enable this to allow learners to download the learning paths as SCORM packages."
+msgstr ""
+"Activar para permitir que los alumnos descarguen las lecciones como paquetes "
+"SCORM."
+
+msgid "Learning paths subscription for classes"
+msgstr "Suscripción a lecciones para clases"
+
+msgid "Unlocked information in learning paths list"
+msgstr "Información desbloqueada en la lista de lecciones"
+
+msgid "Enable redefinition of the setting to show the best progress instead of averages in reporting of learnpaths at a course level."
+msgstr ""
+"Habilitar la redefinición de la configuración para mostrar el mejor progreso "
+"en lugar de promedios en los informes de lecciones a nivel de curso."
+
+msgid "Configure additional options for the learning paths display. Options include 'show_reporting_icon', 'hide_lp_arrow_navigation', 'show_toolbar_by_default', 'navigation_in_the_middle' and 'add_extra_quit_to_home_icon'."
+msgstr ""
+"Configure opciones adicionales para la visualización de lecciones. Las "
+"opciones incluyen 'show_reporting_icon', 'hide_lp_arrow_navigation', "
+"'show_toolbar_by_default', 'navigation_in_the_middle' y "
+"'add_extra_quit_to_home_icon'."
From d4ef4c8108960eb4278c08a97cc853e158cf9f80 Mon Sep 17 00:00:00 2001
From: christianbeeznst
Date: Tue, 28 May 2024 16:40:12 -0500
Subject: [PATCH 303/413] Skill: Fix URL generation for assignment notification
link - refs BT#21715
---
public/main/skills/assign.php | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/public/main/skills/assign.php b/public/main/skills/assign.php
index 697842e3248..6bb719aead2 100644
--- a/public/main/skills/assign.php
+++ b/public/main/skills/assign.php
@@ -57,9 +57,34 @@
$currentValue = isset($_REQUEST['current_value']) ? (int) $_REQUEST['current_value'] : 0;
$currentLevel = isset($_REQUEST['current']) ? (int) str_replace('sub_skill_id_', '', $_REQUEST['current']) : 0;
+// Handle skill and subskill selection
+$skillId = isset($_REQUEST['id']) ? (int) $_REQUEST['id'] : key($skillsOptions);
$subSkillList = isset($_REQUEST['sub_skill_list']) ? explode(',', $_REQUEST['sub_skill_list']) : [];
$subSkillList = array_unique($subSkillList);
+if (empty($subSkillList) && $skillId) {
+ $skillRelSkill = new SkillRelSkillModel();
+ $parents = $skillRelSkill->getSkillParents($skillId);
+ ksort($parents);
+
+ $subSkillList = [];
+ foreach ($parents as $parent) {
+ if ($parent['skill_id'] != 1) {
+ $subSkillList[] = $parent['skill_id'];
+ }
+ }
+ $subSkillList[] = $skillId;
+ $subSkillList = array_unique($subSkillList);
+
+ $firstParentId = $subSkillList[0];
+ $subSkillListToString = implode(',', array_slice($subSkillList, 0, -1)) . ',' . $skillId;
+ $currentLevel = 'sub_skill_id_' . count($subSkillList) - 1;
+
+ $currentUrl = api_get_path(WEB_CODE_PATH).'skills/assign.php?user='.$userId.'&id='.$firstParentId.'¤t_value='.$skillId.'¤t='.$currentLevel.'&sub_skill_list='.$subSkillListToString;
+ header('Location: '.$currentUrl);
+ exit;
+}
+
if (!empty($subSkillList)) {
// Compare asked skill with current level
$correctLevel = false;
From b8a3a9f8fb137130c9658f2cf702e5c98ccac7f0 Mon Sep 17 00:00:00 2001
From: Angel Fernando Quiroz Campos
Date: Sun, 26 May 2024 17:08:24 -0500
Subject: [PATCH 304/413] Refactoring user ID list to send mails - refs
BT#21648
---
src/CoreBundle/State/MessageProcessor.php | 31 +++++++++++++----------
1 file changed, 17 insertions(+), 14 deletions(-)
diff --git a/src/CoreBundle/State/MessageProcessor.php b/src/CoreBundle/State/MessageProcessor.php
index d82df59b08a..3c630ef904c 100644
--- a/src/CoreBundle/State/MessageProcessor.php
+++ b/src/CoreBundle/State/MessageProcessor.php
@@ -11,6 +11,7 @@
use ApiPlatform\Metadata\Post;
use ApiPlatform\State\ProcessorInterface;
use Chamilo\CoreBundle\Entity\Message;
+use Chamilo\CoreBundle\Entity\MessageRelUser;
use Notification;
final class MessageProcessor implements ProcessorInterface
@@ -45,19 +46,21 @@ private function saveNotificationForInboxMessage(Message $message): void
$message->getSender()->getId()
);
- foreach ($message->getReceivers() as $receiver) {
- $user = $receiver->getReceiver();
-
- (new Notification())
- ->saveNotification(
- $message->getId(),
- Notification::NOTIFICATION_TYPE_MESSAGE,
- [$user->getId()],
- $message->getTitle(),
- $message->getContent(),
- $sender_info,
- )
- ;
- }
+ $userIdList = $message
+ ->getReceivers()
+ ->map(fn (MessageRelUser $messageRelUser): int => $messageRelUser->getReceiver()->getId())
+ ->getValues()
+ ;
+
+ (new Notification())
+ ->saveNotification(
+ $message->getId(),
+ Notification::NOTIFICATION_TYPE_MESSAGE,
+ $userIdList,
+ $message->getTitle(),
+ $message->getContent(),
+ $sender_info,
+ )
+ ;
}
}
From faf578c66191cf7edac6d6341b40bfade491808c Mon Sep 17 00:00:00 2001
From: Angel Fernando Quiroz Campos
Date: Mon, 27 May 2024 17:30:07 -0500
Subject: [PATCH 305/413] Internal: Allow to attach file in mail from stream -
refs BT#21648
---
src/CoreBundle/ServiceHelper/MailHelper.php | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/src/CoreBundle/ServiceHelper/MailHelper.php b/src/CoreBundle/ServiceHelper/MailHelper.php
index d55d744cc58..520c9c2c57b 100644
--- a/src/CoreBundle/ServiceHelper/MailHelper.php
+++ b/src/CoreBundle/ServiceHelper/MailHelper.php
@@ -12,6 +12,7 @@
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\BodyRendererInterface;
+use Symfony\Component\Mime\Part\DataPart;
final class MailHelper
{
@@ -77,6 +78,10 @@ public function send(
if (!empty($file_attach['path']) && !empty($file_attach['filename'])) {
$templatedEmail->attachFromPath($file_attach['path'], $file_attach['filename']);
}
+
+ if (!empty($file_attach['stream']) && !empty($file_attach['filename'])) {
+ $templatedEmail->addPart(new DataPart($file_attach['stream'], $file_attach['filename']));
+ }
}
}
From bf69c78e739c8669395d072333cc2d58dced6726 Mon Sep 17 00:00:00 2001
From: Angel Fernando Quiroz Campos
Date: Mon, 27 May 2024 17:34:22 -0500
Subject: [PATCH 306/413] Internal: API: Message: Allow to add attachments by
create message endpoint - refs BT#21648
---
.../Api/CreateMessageAttachmentAction.php | 55 ----------------
src/CoreBundle/Entity/Message.php | 33 ++++++++--
src/CoreBundle/Entity/MessageAttachment.php | 65 ++++++++-----------
src/CoreBundle/State/MessageProcessor.php | 35 +++++++++-
4 files changed, 88 insertions(+), 100 deletions(-)
delete mode 100644 src/CoreBundle/Controller/Api/CreateMessageAttachmentAction.php
diff --git a/src/CoreBundle/Controller/Api/CreateMessageAttachmentAction.php b/src/CoreBundle/Controller/Api/CreateMessageAttachmentAction.php
deleted file mode 100644
index e8dd2de2a21..00000000000
--- a/src/CoreBundle/Controller/Api/CreateMessageAttachmentAction.php
+++ /dev/null
@@ -1,55 +0,0 @@
-files->get('file');
-
- if (empty($uploadedFile)) {
- throw new BadRequestHttpException('file is required');
- }
-
- $messageRepo = $em->getRepository(Message::class);
-
- $message = $messageRepo->find($request->get('messageId'));
-
- $attachment = (new MessageAttachment())
- ->setFilename($uploadedFile->getFilename())
- ->setMessage($message)
- ->setParent($message->getSender())
- ->setCreator($message->getSender())
- ;
-
- foreach ($message->getReceivers() as $receiver) {
- $attachment->addUserLink($receiver->getReceiver());
- }
-
- $message->addAttachment($attachment);
-
- $em->persist($attachment);
- $repo->addFile($attachment, $uploadedFile);
- $em->flush();
-
- return $attachment;
- }
-}
diff --git a/src/CoreBundle/Entity/Message.php b/src/CoreBundle/Entity/Message.php
index efbbc4bd91b..55fe3f879a4 100644
--- a/src/CoreBundle/Entity/Message.php
+++ b/src/CoreBundle/Entity/Message.php
@@ -157,8 +157,14 @@ class Message
/**
* @var Collection
*/
- #[Groups(['message:read'])]
- #[ORM\OneToMany(mappedBy: 'message', targetEntity: MessageAttachment::class, cascade: ['remove', 'persist'])]
+ #[Assert\Valid]
+ #[Groups(['message:read', 'message:write'])]
+ #[ORM\OneToMany(
+ mappedBy: 'message',
+ targetEntity: MessageAttachment::class,
+ cascade: ['persist'],
+ orphanRemoval: true,
+ )]
protected Collection $attachments;
#[ORM\OneToMany(mappedBy: 'message', targetEntity: MessageFeedback::class, orphanRemoval: true)]
@@ -374,10 +380,27 @@ public function getAttachments(): Collection
return $this->attachments;
}
- public function addAttachment(MessageAttachment $attachment): self
+ public function addAttachment(MessageAttachment $attachment): static
+ {
+ if (!$this->attachments->contains($attachment)) {
+ $this->attachments->add($attachment);
+ $attachment
+ ->setMessage($this)
+ ->setParent($this->sender)
+ ->setCreator($this->sender)
+ ;
+ }
+
+ return $this;
+ }
+
+ public function removeAttachment(MessageAttachment $attachment): static
{
- $this->attachments->add($attachment);
- $attachment->setMessage($this);
+ if ($this->attachments->removeElement($attachment)) {
+ if ($attachment->getMessage() === $this) {
+ $attachment->setMessage(null);
+ }
+ }
return $this;
}
diff --git a/src/CoreBundle/Entity/MessageAttachment.php b/src/CoreBundle/Entity/MessageAttachment.php
index d439d905f00..324ed03a8be 100644
--- a/src/CoreBundle/Entity/MessageAttachment.php
+++ b/src/CoreBundle/Entity/MessageAttachment.php
@@ -8,9 +8,6 @@
use ApiPlatform\Metadata\ApiResource;
use ApiPlatform\Metadata\Get;
-use ApiPlatform\Metadata\GetCollection;
-use ApiPlatform\Metadata\Post;
-use Chamilo\CoreBundle\Controller\Api\CreateMessageAttachmentAction;
use Chamilo\CoreBundle\Repository\Node\MessageAttachmentRepository;
use Doctrine\ORM\Mapping as ORM;
use Stringable;
@@ -20,38 +17,6 @@
types: ['http://schema.org/MediaObject'],
operations: [
new Get(),
- new GetCollection(),
- new Post(
- controller: CreateMessageAttachmentAction::class,
- openapiContext: [
- 'requestBody' => [
- 'content' => [
- 'multipart/form-data' => [
- 'schema' => [
- 'type' => 'object',
- 'properties' => [
- 'file' => [
- 'type' => 'string',
- 'format' => 'binary',
- ],
- 'messageId' => [
- 'type' => 'integer',
- ],
- ],
- ],
- ],
- ],
- ],
- ],
- security: 'is_granted(\'ROLE_USER\')',
- validationContext: [
- 'groups' => [
- 'Default',
- 'message_attachment:create',
- ],
- ],
- deserialize: false
- ),
],
normalizationContext: [
'groups' => ['message:read'],
@@ -68,20 +33,24 @@ class MessageAttachment extends AbstractResource implements ResourceInterface, S
#[ORM\Column(name: 'path', type: 'string', length: 255, nullable: false)]
protected string $path;
- #[Groups(['message:read'])]
+
+ #[Groups(['message:read', 'message:write'])]
#[ORM\Column(name: 'comment', type: 'text', nullable: true)]
protected ?string $comment = null;
#[ORM\Column(name: 'size', type: 'integer', nullable: false)]
protected int $size;
- #[ORM\ManyToOne(targetEntity: Message::class, cascade: ['persist'], inversedBy: 'attachments')]
+ #[ORM\ManyToOne(targetEntity: Message::class, inversedBy: 'attachments')]
#[ORM\JoinColumn(name: 'message_id', referencedColumnName: 'id', nullable: false)]
protected Message $message;
#[ORM\Column(name: 'filename', type: 'string', length: 255, nullable: false)]
protected string $filename;
+ #[Groups(['message:write'])]
+ protected ResourceFile $resourceFileToAttach;
+
public function __construct()
{
$this->size = 0;
@@ -152,12 +121,12 @@ public function setSize(int $size): self
return $this;
}
- public function getMessage(): Message
+ public function getMessage(): ?Message
{
return $this->message;
}
- public function setMessage(Message $message): self
+ public function setMessage(?Message $message): static
{
$this->message = $message;
@@ -188,4 +157,22 @@ public function setResourceName(string $name): self
{
return $this->setFilename($name);
}
+
+ public function getResourceFileToAttach(): ResourceFile
+ {
+ return $this->resourceFileToAttach;
+ }
+
+ public function setResourceFileToAttach(ResourceFile $resourceFileToAttach): self
+ {
+ $this
+ ->setFilename($resourceFileToAttach->getOriginalName())
+ ->setSize($resourceFileToAttach->getSize())
+ ->setPath($resourceFileToAttach->getTitle())
+ ;
+
+ $this->resourceFileToAttach = $resourceFileToAttach;
+
+ return $this;
+ }
}
diff --git a/src/CoreBundle/State/MessageProcessor.php b/src/CoreBundle/State/MessageProcessor.php
index 3c630ef904c..1575599310e 100644
--- a/src/CoreBundle/State/MessageProcessor.php
+++ b/src/CoreBundle/State/MessageProcessor.php
@@ -11,14 +11,21 @@
use ApiPlatform\Metadata\Post;
use ApiPlatform\State\ProcessorInterface;
use Chamilo\CoreBundle\Entity\Message;
+use Chamilo\CoreBundle\Entity\MessageAttachment;
use Chamilo\CoreBundle\Entity\MessageRelUser;
+use Chamilo\CoreBundle\Repository\ResourceNodeRepository;
+use Doctrine\ORM\EntityManagerInterface;
use Notification;
+use Vich\UploaderBundle\Storage\FlysystemStorage;
final class MessageProcessor implements ProcessorInterface
{
public function __construct(
private readonly ProcessorInterface $persistProcessor,
private readonly ProcessorInterface $removeProcessor,
+ private readonly FlysystemStorage $storage,
+ private readonly EntityManagerInterface $entityManager,
+ private readonly ResourceNodeRepository $resourceNodeRepository,
) {}
public function process($data, Operation $operation, array $uriVariables = [], array $context = [])
@@ -27,9 +34,20 @@ public function process($data, Operation $operation, array $uriVariables = [], a
return $this->removeProcessor->process($data, $operation, $uriVariables, $context);
}
+ /** @var Message $message */
$message = $this->persistProcessor->process($data, $operation, $uriVariables, $context);
- \assert($message instanceof Message);
+ foreach ($message->getAttachments() as $attachment) {
+ $attachment->resourceNode->setResourceFile(
+ $attachment->getResourceFileToAttach()
+ );
+
+ foreach ($message->getReceivers() as $receiver) {
+ $attachment->addUserLink($receiver->getReceiver());
+ }
+ }
+
+ $this->entityManager->flush();
if ($operation instanceof Post) {
if (Message::MESSAGE_TYPE_INBOX === $message->getMsgType()) {
@@ -52,6 +70,20 @@ private function saveNotificationForInboxMessage(Message $message): void
->getValues()
;
+ $attachmentList = [];
+
+ /** @var MessageAttachment $messageAttachment */
+ foreach ($message->getAttachments() as $messageAttachment) {
+ $stream = $this->resourceNodeRepository->getResourceNodeFileStream(
+ $messageAttachment->resourceNode
+ );
+
+ $attachmentList[] = [
+ 'stream' => $stream,
+ 'filename' => $messageAttachment->getFilename(),
+ ];
+ }
+
(new Notification())
->saveNotification(
$message->getId(),
@@ -60,6 +92,7 @@ private function saveNotificationForInboxMessage(Message $message): void
$message->getTitle(),
$message->getContent(),
$sender_info,
+ $attachmentList,
)
;
}
From 17c2bf6c1f09e0f910251dad530ac7d8fb007d18 Mon Sep 17 00:00:00 2001
From: Angel Fernando Quiroz Campos
Date: Tue, 28 May 2024 17:18:33 -0500
Subject: [PATCH 307/413] Refactoring the message creation form to use
composition api - refs BT#21648
---
assets/vue/components/message/Form.vue | 113 +++++--------------------
1 file changed, 22 insertions(+), 91 deletions(-)
diff --git a/assets/vue/components/message/Form.vue b/assets/vue/components/message/Form.vue
index 68538be1ad1..7c2e4eecde9 100644
--- a/assets/vue/components/message/Form.vue
+++ b/assets/vue/components/message/Form.vue
@@ -3,9 +3,7 @@
'
.get_lang('Sort the following options from the list as you see fit by dragging them to the lower areas. You can put them back in this area to modify your answer.')
- .'