From 9d4db78ba19a6290738d84b8a612bb3edf2dd423 Mon Sep 17 00:00:00 2001 From: qualitus-dahme Date: Wed, 2 Apr 2025 10:31:32 +0200 Subject: [PATCH 001/125] SCORM/Certificate: Fix float value provided for placeholder --- .../classes/Certificate/class.ilScormPlaceholderValues.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/ILIAS/ScormAicc/classes/Certificate/class.ilScormPlaceholderValues.php b/components/ILIAS/ScormAicc/classes/Certificate/class.ilScormPlaceholderValues.php index 74474e35b039..97610ad0d585 100755 --- a/components/ILIAS/ScormAicc/classes/Certificate/class.ilScormPlaceholderValues.php +++ b/components/ILIAS/ScormAicc/classes/Certificate/class.ilScormPlaceholderValues.php @@ -104,7 +104,7 @@ public function getPlaceholderValues(int $userId, int $objId): array } $max_points = $object->getMaxPoints(); - $txtMaxPoints = $max_points; + $txtMaxPoints = (string) $max_points; if (is_null($max_points)) { $txtMaxPoints = $this->language->txt('certificate_points_notavailable'); } elseif ($max_points != floor($max_points)) { From 608d56b3ad86006c401183177873a518dab66617 Mon Sep 17 00:00:00 2001 From: qualitus-dahme Date: Wed, 2 Apr 2025 10:55:53 +0200 Subject: [PATCH 002/125] Scorm: Improve performance when deleting cmi_correct_response records See: https://mantis.ilias.de/view.php?id=42279 --- .../Scorm2004/classes/class.ilSCORM2004StoreData.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/components/ILIAS/Scorm2004/classes/class.ilSCORM2004StoreData.php b/components/ILIAS/Scorm2004/classes/class.ilSCORM2004StoreData.php index 35a40ccf54dd..582cc13fe425 100755 --- a/components/ILIAS/Scorm2004/classes/class.ilSCORM2004StoreData.php +++ b/components/ILIAS/Scorm2004/classes/class.ilSCORM2004StoreData.php @@ -313,9 +313,12 @@ public static function setCMIData( if ($i_set > 3) { $i_set -= 4; if ($getInteractions) { - $q = 'DELETE FROM cmi_correct_response - WHERE cmi_interaction_id IN ( - SELECT cmi_interaction.cmi_interaction_id FROM cmi_interaction WHERE cmi_interaction.cmi_node_id = %s)'; + $q = ' + DELETE cmir + FROM cmi_correct_response cmir + INNER JOIN cmi_interaction cmii ON cmii.cmi_interaction_id = cmir.cmi_interaction_id + WHERE cmii.cmi_node_id = %s + '; $ilDB->manipulateF($q, array('integer'), array($cmi_node_id)); } } From fe16b80e38bfafb4862887a14add4d4dba64fc05 Mon Sep 17 00:00:00 2001 From: Matthias Kunkel Date: Mon, 7 Apr 2025 13:49:05 +0200 Subject: [PATCH 003/125] Updated German lang entries as part of the continuous gender mainstreaming activities. (cherry picked from commit 5f0fefd2c3348e791e0d7a5783d22fd5404b1f64) --- lang/ilias_de.lang | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index 34e4946af12a..b061983b9e7d 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -3878,7 +3878,7 @@ common#:#crs_list_reg_period#:#Anmeldungszeitraum common#:#crs_list_reg_start#:#Anmeldungsbeginn common#:#crs_member_not_passed#:#Nicht bestanden common#:#crs_member_passed#:#Bestanden -common#:#crs_members_gallery#:#Mitgliedergalerie +common#:#crs_members_gallery#:#Galerie common#:#crs_new#:#Neuen Kurs anlegen common#:#crs_removed_from_waiting_list#:#Sie wurden aus der Warteliste des Kurses „%s“ ausgetragen. common#:#crs_status_blocked#:#[Zugang gesperrt] @@ -4306,7 +4306,7 @@ common#:#grp_list_reg_start#:#Anmeldungsbeginn common#:#grp_list_users#:#Benutzer auflisten common#:#grp_mem_change_status#:#Mitgliedsstatus ändern common#:#grp_mem_send_mail#:#Mitglied eine Mail senden -common#:#grp_members_gallery#:#Mitgliedergalerie +common#:#grp_members_gallery#:#Galerie common#:#grp_msg_applicants_assigned#:#Der/die Teilnehmende wurde in die Gruppe aufgenommen. common#:#grp_msg_member_assigned#:#Der/die Teilnehmende wurde in die Gruppe aufgenommen. common#:#grp_msg_membership_annulled#:#Die Mitgliedschaft wurde aufgehoben. @@ -7507,8 +7507,8 @@ crs#:#crs_breadcrumb_crs_only#:#Brotkrumenpfad beginnt mit Kurs crs#:#crs_breadcrumb_full_path#:#Gesamten Pfad anzeigen crs#:#crs_cancel_subscr_request#:#Aufnahmeantrag zurückziehen crs#:#crs_cancel_subscription#:#Austritt aus Kurs „%s“ -crs#:#crs_cancel_subscription_body#:#die Teilnehmerin/der Teilnehmer %s ist aus dem Kurs „%s“ ausgetreten. -crs#:#crs_cancel_subscription_body2#:#Eventuell sind Teilnehmende in die Warteliste dieses Kurses eingetragen. Um die Liste der Teilnehmenden anzuzeigen, rufen Sie bitte folgenden Link auf: +crs#:#crs_cancel_subscription_body#:#%s ist aus dem Kurs „%s“ ausgetreten. +crs#:#crs_cancel_subscription_body2#:#Eventuell stehen Personen auf der Warteliste dieses Kurses. Um die Liste anzuzeigen, rufen Sie bitte folgenden Link auf: crs#:#crs_cancellation_end#:#Spätester Kursaustritt crs#:#crs_cancellation_end_info#:#Mitglieder können nur bis zum gesetzten Datum selbstständig die Kursmitgliedschaft beenden. crs#:#crs_cancellation_end_rbac_info#:#Das Stornierungsende wurde am %s erreicht. Ein Austritt aus dem Kurs ist jetzt nicht mehr möglich. @@ -7627,7 +7627,7 @@ crs#:#crs_loc_objectives_passed_confirmation#:#Sie haben bereits alle Lernziel b crs#:#crs_loc_passes_info#:#Maximalanzahl Testdurchläufe: crs#:#crs_loc_passes_left#:#Verbleibende Anzahl von Testdurchläufen crs#:#crs_loc_passes_reached#:#Keine weiteren Testdurchläufe möglich -crs#:#crs_loc_perc#:#Benötigte Prozentzahl der Punkte +crs#:#crs_loc_perc#:#Benötigte Prozentzahl an Punkten crs#:#crs_loc_progress_do_qualifying#:#Bitte führen Sie den Abschlusstest durch, um das Lernziel abzuschließen. crs#:#crs_loc_progress_do_qualifying_again#:#Bitte bearbeiten Sie das Lernziel erneut. crs#:#crs_loc_progress_no_result_do_initial#:#Bearbeiten Sie den Einstiegstest @@ -7700,7 +7700,7 @@ crs#:#crs_mail_all#:#Für alle Mitglieder crs#:#crs_mail_all_info#:#Alle, die am Kurs teilnehmen, können die Funktion „Mail an Mitglieder” im Reiter „Mitglieder” nutzen. crs#:#crs_mail_context_member_info#:#Für die Kontakt-E-Mails auf dem Reiter „Info“ eines Kurses crs#:#crs_mail_context_member_title#:#Kurs: Reiter „Info“ -crs#:#crs_mail_context_tutor_info#:#Für die Teilnehmer-E-Mails auf den Mitglieds- und Lernfortschrittsansichten eines Kurses +crs#:#crs_mail_context_tutor_info#:#Mails, die im Reiter „Mitglieder“ und „Lernfortschritt“ eines Kurses versendet werden crs#:#crs_mail_context_tutor_title#:#Kurs: Mail an Mitglieder crs#:#crs_mail_permanent_link#:#Wählen Sie den folgenden Link, um auf den Kursinhalt zuzugreifen: crs#:#crs_mail_tutors_only#:#Nur für Kursadminstration und Kursbetreuung @@ -7716,9 +7716,9 @@ crs#:#crs_max_members_reached#:#Die maximale Mitgliederanzahl wurde überschritt crs#:#crs_mem_contact#:#Kontaktperson crs#:#crs_mem_contacts#:#Kontaktpersonen crs#:#crs_mem_send_mail#:#Mail verschicken -crs#:#crs_mem_tbl_header#:#Kursteilnehmer +crs#:#crs_mem_tbl_header#:#Mitglieder crs#:#crs_member#:#Mitglied -crs#:#crs_member_administration#:#Teilnehmerverwaltung +crs#:#crs_member_administration#:#Verwalten crs#:#crs_member_passed_status_changed#:#Update-Status crs#:#crs_members#:#Mitglieder crs#:#crs_members_deleted#:#Die ausgewählten Mitglieder sind aus dem Kurs ausgetragen worden. @@ -7751,12 +7751,12 @@ crs#:#crs_notification_activated#:#Benachrichtigung aktiviert crs#:#crs_notification_deactivated#:#Benachrichtigung deaktiviert crs#:#crs_notification_explanation_admin#:#Sie erhalten diese Mail, da für Sie als Kursbetreuung die Benachrichtigungen aktiviert sind. crs#:#crs_notification_list_title#:#Benachrichtigung -crs#:#crs_notification_salutation#:#Liebe Kursteilnehmerin, lieber Kursteilnehmer, +crs#:#crs_notification_salutation#:#Hallo, crs#:#crs_notify#:#Benachrichtigung bei Beitritten crs#:#crs_nr#:#Nr. crs#:#crs_number_users_added#:#Die folgende Anzahl von Benutzern wurden dem Kurs hinzugefügt: crs#:#crs_obj_final_req_info#:#Bitte geben Sie die Prozentzahl der Punkte ein, ab der das Lernziel erfüllt ist. -crs#:#crs_obj_initial_req_info#:#Kursteilnehmern, die diese Prozentzahl der Punkte erreicht haben, werden keine Kursmaterialien zur weiteren Bearbeitung empfohlen. +crs#:#crs_obj_initial_req_info#:#Wer diese Prozentzahl erreicht hat, braucht keine weiteren Kursmaterialien mehr zu bearbeiten. crs#:#crs_obj_required_points#:#Benötigte Punktzahl crs#:#crs_objective_accomplished#:#Erledigt crs#:#crs_objective_action_itest#:#Fragen des Einstiegstests festlegen @@ -7862,11 +7862,11 @@ crs#:#crs_settings#:#Kurseinstellungen crs#:#crs_settings_saved#:#Die Einstellungen wurden gespeichert. crs#:#crs_shorten_breadcrumb#:#Brotkrumennavigation crs#:#crs_show_all_obj#:#Alle zeigen -crs#:#crs_show_member_export#:#Teilnehmerliste -crs#:#crs_show_member_export_info#:#Mitglieder haben die Möglichkeit eine Teilnehmerliste zu generieren. -crs#:#crs_show_member_export_settings#:#Teilnehmerliste -crs#:#crs_show_members#:#Mitgliedergalerie -crs#:#crs_show_members_info#:#Alle Mitglieder können in diesem Reiter die Mitgliedergalerie einsehen. +crs#:#crs_show_member_export#:#Teilnahmeliste +crs#:#crs_show_member_export_info#:#Mitglieder können eine Liste mit personenbezogenen Daten generieren und drucken. Im neu eingeblendeten Unterreiter „Teilnahmeliste“ kann der Inhalt konfiguriert werden. +crs#:#crs_show_member_export_settings#:#Teilnahmeliste +crs#:#crs_show_members#:#Galerie +crs#:#crs_show_members_info#:#Alle Mitglieder können in diesem Reiter die Galerie einsehen. crs#:#crs_size#:#Dateigröße crs#:#crs_sort_activation#:#Nach Zeitvorgaben crs#:#crs_sort_manual#:#Manuelle Sortierung @@ -10408,8 +10408,8 @@ grp#:#grp_set_on_waiting_list#:#Wenn Sie einen Aufnahmeantrag stellen, werden Si grp#:#grp_setting_header_presentation#:#Darstellung grp#:#grp_setting_header_registration#:#Selbstständiger Beitritt durch Benutzer grp#:#grp_settings#:#Gruppeneinstellungen -grp#:#grp_show_members#:#Mitgliedergalerie -grp#:#grp_show_members_info#:#Alle Mitglieder können im Reiter "Mitglieder" die Mitgliedergalerie einsehen. +grp#:#grp_show_members#:#Galerie +grp#:#grp_show_members_info#:#Alle Mitglieder können im Reiter "Mitglieder" die Galerie einsehen. grp#:#grp_subscription_min_members_info#:#Wird die geforderte Mindestanzahl an Mitgliedern nicht erreicht, kann die Gruppe nicht stattfinden. Wird die Mindestanzahl bis zum Ende des Beitrittszeitraums bzw. dem spätesten Gruppenaustritt nicht erreicht, versendet ILIAS eine Mail an jene Personen der Gruppenadministration, für die im Reiter „Mitglieder“ die Option „Benachrichtigung“ aktiviert ist. grp#:#grp_sure_add_user_to_group#:#Wollen Sie den Benutzer wirklich der Gruppe hinzufügen? grp#:#grp_sure_create_group_add_user#:#Wollen Sie die Gruppen wirklich erstellen und den Benutzer hinzufügen? @@ -11064,7 +11064,7 @@ lso#:#lso_mainbar_button_label_toc#:#Inhalte lso#:#lso_mem_tbl_header#:#Lernsequenz Teilnehmer lso#:#lso_member_administration#:#Teilnehmerverwaltung lso#:#lso_members_deleted#:#Die ausgewählten Mitglieder sind aus der Lernsequenz ausgetragen worden. -lso#:#lso_members_gallery#:#Mitgliedergalerie +lso#:#lso_members_gallery#:#Galerie lso#:#lso_members_print_title#:#Lernsequenzmitglieder lso#:#lso_min_one_admin#:#Dieser Lernsequenz muss mindestens ein Konto mit der Rolle „Lernsequenzadministration“ zugeordnet sein. lso#:#lso_msg_member_assigned#:#Benutzer wurde(n) in die Lernsequenz aufgenommen @@ -11093,7 +11093,7 @@ lso#:#lso_settings_extro#:#Abschlussseite bearbeiten lso#:#lso_settings_intro#:#Einleitungsseite bearbeiten lso#:#lso_settings_old_extro#:#Alte Abschlussseite ansehen lso#:#lso_settings_old_intro#:#Alte Einleitungsseite ansehen -lso#:#lso_show_members_info#:#Mitgliedergalerie für Benutzer sichtbar +lso#:#lso_show_members_info#:#Galerie für Benutzer sichtbar lso#:#lso_start_item#:#%s öffnen lso#:#lso_toast_completed_desc#:#Sie haben diese Lernsequenz abgeschlossen. Natürlich können Sie den Inhalt noch weiter durchsehen. lso#:#lso_toast_completed_title#:#Herzlichen Glückwunsch @@ -11101,7 +11101,7 @@ lso#:#lso_users_already_assigned#:#Ein Benutzer ist bereits Mitglied dieser Lern lso#:#mail_lso_roles#:#alle Personen mit folgenden lokalen Rollen. Label is now generalised for all components that support ‘mail to members‘ lso#:#manage#:#Verwalten lso#:#manage_content_maintab#:#Inhalt -lso#:#members_gallery#:#Mitgliedergalerie +lso#:#members_gallery#:#Galerie lso#:#no_entries_selected_for_delete#:#Es muss mindestens ein Listeneintrag ausgewählt werden. lso#:#not_finished#:#Nicht Abgeschlossen lso#:#notification_lso_completed_title#:#Sie haben die Lernsequenz %s abgeschlossen. @@ -11848,7 +11848,7 @@ mem#:#mem_period_without_time#:#ohne Uhrzeitangabe mem#:#mem_print_view_form#:#Standardeinstellungen für Druckansicht mem#:#mem_settings_tab_print_view#:#Einstellungen Druckansicht mem#:#mem_settings_tab_settings#:#Allgemeine Einstellungen -mem#:#mmbr_gallery_user_actions#:#Aktionen in Mitgliedergalerie +mem#:#mmbr_gallery_user_actions#:#Aktionen in Galerie membership#:#mem_error_preconditions#:#Die Aufnahme konnte nicht erfolgen, da mindestens eine Einstellung dies verhindert. membership#:#mem_force_notification#:#Benachrichtigung per Mail membership#:#mem_force_notification_mode_all#:#Aktiviert für alle Mitglieder (frei änderbar) @@ -13836,7 +13836,7 @@ ps#:#ps_grp_user_fields#:#Persönliche Angaben zu dieser Gruppe ps#:#ps_login_max_attempts#:#Maximale Anzahl von Anmeldeversuchen ps#:#ps_login_max_attempts_info#:# Bestimmt wie viele Anmeldeversuche eines Benutzer höchstens fehlschlagen dürfen. Schlagen mehr Anmeldeversuche fehl, wird dieser Benutzer auf 'inaktiv' gesetzt und muss im 'Benutzer Management' wieder aktiviert werden, bevor er die Plattform benutzen kann. Wird kein Wert eingetragen, ist die Funktion deaktiviert und ILIAS zählt die fehlgeschlagenen Anmeldeversuche nicht. ps#:#ps_not_accepted#:#Nicht zugestimmt -ps#:#ps_participants_list_courses#:#Aktivierung von Teilnehmerlisten in der Mitgliedergalerie der Kurse erlauben +ps#:#ps_participants_list_courses#:#Aktivierung von Teilnehmerlisten in der Galerie der Kurse erlauben ps#:#ps_passwd_policy_change_force_user_reset_succ#:#Die Aktion wurde erfolgreich durchgeführt. ps#:#ps_passwd_policy_changed_force_user_reset#:#Die Änderungen wurden erfolgreich übernommen. Sie haben mindestens eine Änderung bzgl. der Passwortrichtlinie vorgenommen. Möchten Sie, dass lokale Anmeldekonten nach der nächsten erfolgreichen Anmeldung ein neues Passwort vergeben müssen? ps#:#ps_password_change_on_first_login_enabled#:#Passwort ändern bei Erstanmeldung From 6969e69c9a6e37dfce15c52a5eebaa54be76100e Mon Sep 17 00:00:00 2001 From: Matheus Zych <37047867+matheuszych@users.noreply.github.com> Date: Mon, 7 Apr 2025 14:24:43 +0200 Subject: [PATCH 004/125] =?UTF-8?q?T&A=2044764:=20Fixes=20end=20datetime?= =?UTF-8?q?=20of=20availability=20period=20in=20test=20settings=20being=20?= =?UTF-8?q?rese=E2=80=A6=20(#9309)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fixes end datetime of availability period in test settings being reset to 01.01.1970 upon saving * Adds review changes --- .../src/Settings/MainSettings/class.SettingsMainGUI.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/components/ILIAS/Test/src/Settings/MainSettings/class.SettingsMainGUI.php b/components/ILIAS/Test/src/Settings/MainSettings/class.SettingsMainGUI.php index 759b309f4cf8..c9ec9f3b8d8e 100755 --- a/components/ILIAS/Test/src/Settings/MainSettings/class.SettingsMainGUI.php +++ b/components/ILIAS/Test/src/Settings/MainSettings/class.SettingsMainGUI.php @@ -606,15 +606,16 @@ private function saveAvailabilitySettingsSection(array $section): void { $time_based_availability = $section['timebased_availability']; + $participant_data_exists = $this->test_object->participantDataExist(); $this->test_object->storeActivationSettings( - $this->test_object->participantDataExist() + $participant_data_exists ? $this->test_object->isActivationLimited() : $time_based_availability['is_activation_limited'], - $this->test_object->participantDataExist() + $participant_data_exists ? $this->test_object->getActivationStartingTime() : $time_based_availability['activation_starting_time'], - $this->test_object->getActivationEndingTime(), - $this->test_object->getActivationVisibility(), + $time_based_availability['activation_ending_time'], + $time_based_availability['activation_visibility'] ); $this->test_object->getObjectProperties()->storePropertyIsOnline($section['is_online']); } From 70da72cbff8bfb132ecae7b7ba13111f76e1ccd7 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Mon, 7 Apr 2025 14:51:24 +0200 Subject: [PATCH 005/125] User: Do Not Detach From Role If Role Inexistent See: https://mantis.ilias.de/view.php?id=44797 --- .../User/classes/class.ilUserImportParser.php | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/components/ILIAS/User/classes/class.ilUserImportParser.php b/components/ILIAS/User/classes/class.ilUserImportParser.php index 9bfe029cefc7..12d0254e1735 100755 --- a/components/ILIAS/User/classes/class.ilUserImportParser.php +++ b/components/ILIAS/User/classes/class.ilUserImportParser.php @@ -817,13 +817,19 @@ public function detachFromRole( ): void { $this->rbac_admin->deassignUser($a_role_id, $a_user_obj->getId()); - if (substr(ilObject::_lookupTitle($a_role_id), 0, 6) === 'il_crs' || - substr(ilObject::_lookupTitle($a_role_id), 0, 6) === 'il_grp') { - $obj = $this->rbac_review->getObjectOfRole($a_role_id); - $ref = ilObject::_getAllReferences($obj); - $ref_id = end($ref); - $this->recommended_content_manager->removeObjectRecommendation($a_user_obj->getId(), $ref_id); + if (substr(ilObject::_lookupTitle($a_role_id), 0, 6) !== 'il_crs' + && substr(ilObject::_lookupTitle($a_role_id), 0, 6) !== 'il_grp') { + return; + } + + $ref = ilObject::_getAllReferences( + $this->rbac_review->getObjectOfRole($a_role_id) + ); + $ref_id = end($ref); + if (!$ref_id) { + return; } + $this->recommended_content_manager->removeObjectRecommendation($a_user_obj->getId(), $ref_id); } protected function tagContained(string $tagname): bool From ff9cd7e2bd3a9e82716593699e3ac348e6fe70c2 Mon Sep 17 00:00:00 2001 From: Timon Amstutz Date: Mon, 7 Apr 2025 16:08:08 +0200 Subject: [PATCH 006/125] Adjusted example text, see: 44498 and related --- .../examples/Dropzone/File/Wrapper/with_additional_input.php | 2 +- .../src/examples/Dropzone/File/Wrapper/with_clear_button.php | 4 ++-- .../ILIAS/UI/src/examples/Item/Standard/with_lead_avatar.php | 4 ++-- .../ILIAS/UI/src/examples/Item/Standard/with_lead_image.php | 3 +-- .../ILIAS/UI/src/examples/Item/Standard/with_lead_text.php | 2 +- .../UI/src/examples/Item/Standard/with_shy_properties.php | 2 +- 6 files changed, 8 insertions(+), 9 deletions(-) diff --git a/components/ILIAS/UI/src/examples/Dropzone/File/Wrapper/with_additional_input.php b/components/ILIAS/UI/src/examples/Dropzone/File/Wrapper/with_additional_input.php index 7e3751c2965b..a6961b5eba25 100755 --- a/components/ILIAS/UI/src/examples/Dropzone/File/Wrapper/with_additional_input.php +++ b/components/ILIAS/UI/src/examples/Dropzone/File/Wrapper/with_additional_input.php @@ -27,7 +27,7 @@ * * expected output: > * ILIAS shows a base file wrapper box. If you drag a file into the box a small window opens - * including two buttons named "Save" and "Close" and an additional input field. The upload + * including two buttons named "Save" and "Cancel" and an additional input field. The upload * process works as in the base file wrapper example. * --- */ diff --git a/components/ILIAS/UI/src/examples/Dropzone/File/Wrapper/with_clear_button.php b/components/ILIAS/UI/src/examples/Dropzone/File/Wrapper/with_clear_button.php index e757a07b8b92..ed8e224a97ed 100755 --- a/components/ILIAS/UI/src/examples/Dropzone/File/Wrapper/with_clear_button.php +++ b/components/ILIAS/UI/src/examples/Dropzone/File/Wrapper/with_clear_button.php @@ -27,8 +27,8 @@ * * expected output: > * ILIAS shows a base file wrapper. If you drag a file into the box a small window opens - * including three buttons named "Save","Close" and "Clear files!". Clicking the clear button will remove the file. - * The upload process will not upload any files and an empty array becomes visible. + * including three buttons named "Clear files!", "Save" and "Cancel". Clicking the clear button will remove the file. + * The upload process works as in the base file wrapper example. * --- */ function with_clear_button() diff --git a/components/ILIAS/UI/src/examples/Item/Standard/with_lead_avatar.php b/components/ILIAS/UI/src/examples/Item/Standard/with_lead_avatar.php index 6b9e8a61baf1..fb5a12d585c8 100755 --- a/components/ILIAS/UI/src/examples/Item/Standard/with_lead_avatar.php +++ b/components/ILIAS/UI/src/examples/Item/Standard/with_lead_avatar.php @@ -27,8 +27,8 @@ * * expected output: > * ILIAS shows two very similiar boxes including the following informations: A heading with a dummy text in small writings - * ("Lorem ipsum...") below. Beneath those you can see a fine line and more informations about "Last Update" - * and "Location". Additionally a action menu is displayed in the box on the right top. On the left side a avatar is + * ("Lorem ipsum...") below. Beneath those you can see a fine line and more informations about "Last Login" + * and "Location". Additionally an action menu is displayed in the box on the right top. On the left side an avatar is * displayed. * --- */ diff --git a/components/ILIAS/UI/src/examples/Item/Standard/with_lead_image.php b/components/ILIAS/UI/src/examples/Item/Standard/with_lead_image.php index 8785aa9e54b7..652551430493 100755 --- a/components/ILIAS/UI/src/examples/Item/Standard/with_lead_image.php +++ b/components/ILIAS/UI/src/examples/Item/Standard/with_lead_image.php @@ -24,12 +24,11 @@ * --- * description: > * Example for rendering a standard item with an lead image. - * * expected output: > * ILIAS shows a box including the following informations: A heading with a dummy text in small writings * ("Lorem ipsum...") below. Beneath those you can see a fine line and more informations about "Origin", "Last Update" * and "Location". Additionally a action menu is displayed in the box on the right top. On the left side a ILIAS-Logo - * is displayed. On small screens the logo is rendered above the title. + * is displayed. * --- */ function with_lead_image() diff --git a/components/ILIAS/UI/src/examples/Item/Standard/with_lead_text.php b/components/ILIAS/UI/src/examples/Item/Standard/with_lead_text.php index 14e69acdacb0..5570b10c0066 100755 --- a/components/ILIAS/UI/src/examples/Item/Standard/with_lead_text.php +++ b/components/ILIAS/UI/src/examples/Item/Standard/with_lead_text.php @@ -29,7 +29,7 @@ * ILIAS shows a box including the following informations: A heading with a dummy text in small writings * ("Lorem ipsum...") below. Beneath those you can see a fine line and more informations about "Origin", "Last Update" * and "Location". Additionally a action menu is displayed in the box on the right top. On the left side a period of time - * (11:20-12:40) is displayed. On small screens the period of time will be rendered above the title. + * (11:20-12:40) is displayed. * --- */ function with_lead_text() diff --git a/components/ILIAS/UI/src/examples/Item/Standard/with_shy_properties.php b/components/ILIAS/UI/src/examples/Item/Standard/with_shy_properties.php index 4f20bba8730b..04dd3ba2a18e 100755 --- a/components/ILIAS/UI/src/examples/Item/Standard/with_shy_properties.php +++ b/components/ILIAS/UI/src/examples/Item/Standard/with_shy_properties.php @@ -28,7 +28,7 @@ * expected output: > * ILIAS shows a box including the following informations: A heading with a dummy text in small writings * ("Lorem ipsum...") below. Beneath those you can see a fine line and more informations about "LMS", "Code Repo" - * and "Location". "Code Repo" ("ILIAS") and "LMS" ("GitHub") are rendered as shy buttons and are functioning as links. + * and "Location". Properties of "LMS" ("ILIAS") an "Code Repo" ("GitHub") are rendered as shy buttons and are functioning as links. * --- */ function with_shy_properties() From 9be7a9c513ac1c148f83324dfc320a1ae07ed56e Mon Sep 17 00:00:00 2001 From: Fabian Schmid Date: Tue, 8 Apr 2025 07:28:51 +0200 Subject: [PATCH 007/125] [FIX] 0044470: PermanentLink/File: Legacy permanent links for file objects lead to wrong HTTP redirect URL for ILIAS installed in sub-path --- components/ILIAS/StaticURL/src/Handler/HandlerService.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/components/ILIAS/StaticURL/src/Handler/HandlerService.php b/components/ILIAS/StaticURL/src/Handler/HandlerService.php index 74ba558edd84..5b4a9c32da32 100755 --- a/components/ILIAS/StaticURL/src/Handler/HandlerService.php +++ b/components/ILIAS/StaticURL/src/Handler/HandlerService.php @@ -96,6 +96,8 @@ public function performRedirect(URI $base_uri): void } else { // Perform Redirect $uri_path = $response->getURIPath(); + $base_path = $base_uri->getPath(); + $uri_path = str_replace($base_path, '', $uri_path); $full_uri = $base_uri . '/' . trim((string) $uri_path, '/'); } From 91e859ac781ffc397d81ffd4ab252fb42d19e55e Mon Sep 17 00:00:00 2001 From: Fabian Schmid Date: Tue, 8 Apr 2025 09:07:06 +0200 Subject: [PATCH 008/125] [FIX] 0038488: Add top item - delete top item --- .../classes/Administration/class.ilMMTopItemTableGUI.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/ILIAS/MainMenu/classes/Administration/class.ilMMTopItemTableGUI.php b/components/ILIAS/MainMenu/classes/Administration/class.ilMMTopItemTableGUI.php index 4fe92de2665e..7aa3eb411ee8 100755 --- a/components/ILIAS/MainMenu/classes/Administration/class.ilMMTopItemTableGUI.php +++ b/components/ILIAS/MainMenu/classes/Administration/class.ilMMTopItemTableGUI.php @@ -108,7 +108,7 @@ protected function fillRow(array $a_set): void $rendered_modal = ""; if ($item_facade->isDeletable()) { $ditem = $factory->modal()->interruptiveItem()->standard($this->hash($a_set['identification']), $item_facade->getDefaultTitle()); - $action = $this->ctrl->getFormActionByClass(ilMMSubItemGUI::class, ilMMSubItemGUI::CMD_DELETE); + $action = $this->ctrl->getFormActionByClass(ilMMTopItemGUI::class, ilMMTopItemGUI::CMD_DELETE); $m = $factory->modal() ->interruptive($this->lng->txt(ilMMTopItemGUI::CMD_DELETE), $this->lng->txt(ilMMTopItemGUI::CMD_CONFIRM_DELETE), $action) ->withAffectedItems([$ditem]); From d717ba9e4ed3dcac7b1d6a0a205491fa82f6e058 Mon Sep 17 00:00:00 2001 From: Matthias Kunkel Date: Tue, 8 Apr 2025 09:13:26 +0200 Subject: [PATCH 009/125] =?UTF-8?q?Fixed=20Mantis=20#44621:=20Schreibung?= =?UTF-8?q?=20Cron-Job=20oder=20Cronjob=20in=20Deutsch:=20changed=20all=20?= =?UTF-8?q?usages=20to=20=E2=80=9ECron-Job=E2=80=9C.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit 8b79f300b5d70ea72818c09bb2d3e6abc16986c7) --- lang/ilias_de.lang | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index b061983b9e7d..3eec44a2c3e2 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -755,7 +755,7 @@ assessment#:#finish_test_single#:#Sind Sie sicher, dass Sie den Testdurchlauf f assessment#:#finish_unfinished_passes#:#Beendet noch offene Testdurchläufe assessment#:#finish_unfinished_passes_desc#:#Noch nicht beendete Testdurchläufe werden automatisch beendet – vorausgesetzt, es wurde für diese Tests ein Endzeitpunkt festgelegt oder Teilnehmende haben die maximale Bearbeitungsdauer überschritten. assessment#:#finished_by_administrator#:#Beendet durch Administrator -assessment#:#finished_by_cronjob#:#Beendet durch Cronjob +assessment#:#finished_by_cronjob#:#Beendet durch Cron-Job assessment#:#finished_by_duration#:#Beendet aufgrund Zeitlimit assessment#:#finished_by_participant#:#Beendet durch Teilnehmer assessment#:#finished_by_unknown#:#Beendet durch Unbekannt @@ -3178,10 +3178,10 @@ cmix#:#conf_availability_2#:#in neuen und bestehenden Objekten cmix#:#conf_availability_2_info#:#Dieser LRS-Typ kann beim Anlegen neuer xAPI/cmi5-Objekten ausgewählt werden. cmix#:#conf_bypass_proxy#:#Erkennung des Lernfortschritts cmix#:#conf_bypass_proxy_disabled#:#xAPI-Proxy, um sofort Daten zu erhalten. -cmix#:#conf_bypass_proxy_enabled#:#CronJob zur Abfrage des Learning Record Store -cmix#:#conf_bypass_proxy_info#:#In den meisten Fällen wird empfohlen, den xAPI-Proxy zu verwenden. Verwenden Sie den CronJob bei Einschränkungen hinsichtlich Ressourcen oder Server. -cmix#:#conf_cronjob_neccessary#:#CronJob notwendig für den Lernfortschritt -cmix#:#conf_cronjob_neccessary_info#:#Durch Aktivieren dieser Option können die diesen LRS-Typ nutzenden xAPI-Objekte den xAPI-Proxy nicht nutzen, der zeitlich unmittelbar Daten zur Erkennung des Lernfortschritts liefert. Verwenden Sie nur den CronJob bei Einschränkungen hinsichtlich Ressourcen oder Server. +cmix#:#conf_bypass_proxy_enabled#:#Cron-Job zur Abfrage des Learning Record Stores +cmix#:#conf_bypass_proxy_info#:#In den meisten Fällen wird empfohlen, den xAPI-Proxy zu verwenden. Verwenden Sie den Cron-Job bei Einschränkungen hinsichtlich Ressourcen oder Server. +cmix#:#conf_cronjob_neccessary#:#Cron-Job notwendig für den Lernfortschritt +cmix#:#conf_cronjob_neccessary_info#:#Durch Aktivieren dieser Option können die diesen LRS-Typ nutzenden xAPI-Objekte den xAPI-Proxy nicht nutzen, der zeitlich unmittelbar Daten zur Erkennung des Lernfortschritts liefert. Verwenden Sie nur den Cron-Job bei Einschränkungen hinsichtlich Ressourcen oder Server. cmix#:#conf_delete_data#:#Daten im LRS löschen cmix#:#conf_delete_data_info#:#Löschen ist aktuell nur mit dem Learning Record Store (LRS) LearningLocker möglich. Nutzen Sie die Optionen zum Löschen der Benutzeridentifikation nur dann, wenn die Daten im LRS pseudonymisiert wurden. cmix#:#conf_delete_data_opt0#:#nie @@ -3241,9 +3241,9 @@ cmix#:#conf_privacy_setting_info#:#Konfigurationsoptionen für die Datenschutzei cmix#:#conf_remarks#:#Interne Kommentare cmix#:#conf_title#:#Titel cmix#:#conf_use_proxy#:#xAPI-Proxy -cmix#:#conf_use_proxy_info#:#Der xAPI-Proxy liefert in Echtzeit Daten zur Bestimmung des Lernfortschritts in ILIAS. Entsprechend der gewählten Optionen zum Datenschutz reduziert der Proxy personenbezogene Daten. Bei deaktiviertem xAPI-Proxy schreibt der Lerninhalt den Lernfortschritt direkt in den LRS. Dann müssen diese Daten auch direkt aus dem LRS herausgeholt werden. Für die Bestimmung des Lernfortschritts benötigt man dafür den Cronjob „xAPI/cmi5 Ergebnisse holen“. Für cmi5-Objekte ist der xAPI-Proxy zwingend erforderlich und wird automatisch aktiviert. +cmix#:#conf_use_proxy_info#:#Der xAPI-Proxy liefert in Echtzeit Daten zur Bestimmung des Lernfortschritts in ILIAS. Entsprechend der gewählten Optionen zum Datenschutz reduziert der Proxy personenbezogene Daten. Bei deaktiviertem xAPI-Proxy schreibt der Lerninhalt den Lernfortschritt direkt in den LRS. Dann müssen diese Daten auch direkt aus dem LRS herausgeholt werden. Für die Bestimmung des Lernfortschritts benötigt man dafür den Cron-Job „xAPI/cmi5 Ergebnisse holen“. Für cmi5-Objekte ist der xAPI-Proxy zwingend erforderlich und wird automatisch aktiviert. cmix#:#conf_use_proxy_info_cmi5#:#Der xAPI-Proxy liefert in Echtzeit Daten zur Bestimmung des Lernfortschritts in ILIAS. Entsprechend der gewählten Optionen zum Datenschutz reduziert der Proxy personenbezogene Daten. Für cmi5-Objekte ist der xAPI-Proxy zwingend erforderlich. -cmix#:#conf_use_proxy_info_xapi#:#Der xAPI-Proxy liefert in Echtzeit Daten zur Bestimmung des Lernfortschritts in ILIAS. Entsprechend der gewählten Optionen zum Datenschutz reduziert der Proxy personenbezogene Daten. Bei deaktiviertem xAPI-Proxy schreibt der Lerninhalt den Lernfortschritt direkt in den LRS. Dann müssen diese Daten auch direkt aus dem LRS herausgeholt werden. Für die Bestimmung des Lernfortschritts benötigt man dafür den Cronjob „xAPI/cmi5 Ergebnisse holen“. +cmix#:#conf_use_proxy_info_xapi#:#Der xAPI-Proxy liefert in Echtzeit Daten zur Bestimmung des Lernfortschritts in ILIAS. Entsprechend der gewählten Optionen zum Datenschutz reduziert der Proxy personenbezogene Daten. Bei deaktiviertem xAPI-Proxy schreibt der Lerninhalt den Lernfortschritt direkt in den LRS. Dann müssen diese Daten auch direkt aus dem LRS herausgeholt werden. Für die Bestimmung des Lernfortschritts benötigt man dafür den Cron-Job „xAPI/cmi5 Ergebnisse holen“. cmix#:#conf_user_ident#:#Schlüssel zur Identifikation einer Person cmix#:#conf_user_ident_il_uuid_ext_account#:#ID-externes-Konto@ILIAS-Plattform-ID.ilias cmix#:#conf_user_ident_il_uuid_ext_account_info#:#Die E-Mail-Adresse setzt sich zusammen aus der ID eines externen Kontos und einer eigens generierten Plattform-ID. Diese Option ermöglicht Rückschlüsse auf die Person.zulassen. @@ -3740,7 +3740,7 @@ common#:#check_languages#:#Alle Sprachen überprüfen common#:#check_link#:#Externe Links überprüfen common#:#check_link_desc#:#Wenn eingeschaltet, werden alle ILIAS-Lernmodule auf ungültige externe Links überprüft. common#:#check_user_accounts#:#ILIAS-Konten überprüfen -common#:#check_user_accounts_desc#:#Personen, deren ILIAS-Konten zeitlich begrenzt sind, werden zwei Wochen vor Fristende per E-Mail informiert, dass ihr Konto abläuft. Außerdem löscht der Cronjob alle ILIAS-Konten, bei denen der E-Mail-Bestätigungslink nicht fristgerecht angeklickt wurde. +common#:#check_user_accounts_desc#:#Personen, deren ILIAS-Konten zeitlich begrenzt sind, werden zwei Wochen vor Fristende per E-Mail informiert, dass ihr Konto abläuft. Außerdem löscht der Cron-Job alle ILIAS-Konten, bei denen der E-Mail-Bestätigungslink nicht fristgerecht angeklickt wurde. common#:#check_web_resources#:#Weblinks überprüfen common#:#check_web_resources_desc#:#Wenn eingeschaltet, werden alle Weblinks auf ungültige externe Links überprüft und gegebenenfalls deaktiviert. common#:#checked#:#Ausgewählt @@ -3845,7 +3845,7 @@ common#:#create_stylesheet#:#Style erstellen common#:#created#:#Erstellt am common#:#cron_forum_notification#:#Foren-Benachrichtigungen via Cron-Job versenden common#:#cron_forum_notification_crob_desc#:#Wenn aktiviert, sendet ILIAS täglich Benachrichtigungen an die Benutzer, die bei ausgewählten Foren oder Foren-Themen über neue und geänderte Beiträge benachrichtigt werden wollen. Bitte beachten Sie: Wenn Sie diese Form der Foren-Benachrichtigungen aktivieren, werden keine direkten Benachrichtungen mehr verschickt (Administration / Foren / Foren-Benachrichtigungen versenden). -common#:#cron_forum_notification_disabled#:#Kann nicht deaktiviert werden wenn der Cron Job aktiv ist. +common#:#cron_forum_notification_disabled#:#Kann nicht deaktiviert werden, wenn der Cron-Job aktiv ist. common#:#cron_jobs#:#Cron-Jobs common#:#cron_lucene_index#:#Lucene-Suchindex aktualisieren common#:#cron_lucene_index_info#:#Wenn eingeschaltet, wird der Lucene-Suchindex aktualisiert. Bitte konfigurieren Sie vorher den Lucene-Server in der Administration unter „Suchen und finden » Suche“, Reiter „Lucene“. @@ -4157,7 +4157,7 @@ common#:#file_some_invalid_file_types_removed#:#Einige Dateitypen sind nicht erl common#:#file_suffix_repl#:#Ersetzen der Endungen hochgeladener Dateien common#:#file_suffix_repl_info#:#Tragen Sie hier komma-separiert alle Dateitypen mit ihrer Dateiendung ein, die beim Upload als Dateiendung ".sec" erhalten sollen, wenn Sie in den Webspace hochgeladen werden. Dadurch wird ihre direkte Ausführung verhindert. Dies geschieht ohnehin automatisch für Dateien mit folgenden Endungen: common#:#file_system_clean_temp_dir_cron#:#Temporäres Verzeichnis aufräumen -common#:#file_system_clean_temp_dir_cron_info#:#Dieser Cronjob räumt das temp-Verzeichnis von ILIAS auf und löscht Dateien, die älter als 10 Tage sind. Damit wird eine Anhäufung ungenutzter Dateien und ein entsprechend erhöhter Speicherplatzverbrauch durch das temp-Verzeichnis verhindert. +common#:#file_system_clean_temp_dir_cron_info#:#Dieser Cron-Job räumt das temp-Verzeichnis von ILIAS auf und löscht Dateien, die älter als 10 Tage sind. Damit wird eine Anhäufung ungenutzter Dateien und ein entsprechend erhöhter Speicherplatzverbrauch durch das temp-Verzeichnis verhindert. common#:#file_updated#:#Die Datei wurde aktualisiert. common#:#file_upload_pending#:#Hochgeladene Datei common#:#file_valid#:#Datei ist gültig! @@ -12611,7 +12611,7 @@ meta#:#meta_oer_exposed_source#:#Veröffentlichung in meta#:#meta_oer_harvested_licences#:#Lizenzauswahl meta#:#meta_oer_harvested_types#:#Auswahl Objekttypen meta#:#meta_oer_harvester#:#OER Harvester -meta#:#meta_oer_harvester_desc#:#Der OER-Harvester sammelt alle Ressourcen unter ausgewählten CC-Lizenzen, fügt sie einer in den Cron-Job-Einstellungen definierten Kategorie hinzu, und generiert wenn nötig Exportdateien für sie. Für die für Veröffentlichung bereite Ressourcen werden Einträge angelegt, die (wenn aktiviert) über eine OAI-PMH Schnittstelle ausgelesen werden können. Damit dieser Cronjob Ergebnisse liefern kann, muss die Copyright-Auswahl in der Metadaten-Administration aktiviert und konfiguriert sein. Nur Dateiobjekte, Glossare, Inhaltsseiten, Lernmodule (ILIAS, SCORM, und HTML), Fragenpools (für Umfragen und Tests), und Medienpools werden unterstützt. +meta#:#meta_oer_harvester_desc#:#Der OER-Harvester sammelt alle Ressourcen unter ausgewählten CC-Lizenzen, fügt sie einer in den Cron-Job-Einstellungen definierten Kategorie hinzu, und generiert wenn nötig Exportdateien für sie. Für die für Veröffentlichung bereite Ressourcen werden Einträge angelegt, die (wenn aktiviert) über eine OAI-PMH Schnittstelle ausgelesen werden können. Damit dieser Cron-Job Ergebnisse liefern kann, muss die Copyright-Auswahl in der Metadaten-Administration aktiviert und konfiguriert sein. Nur Dateiobjekte, Glossare, Inhaltsseiten, Lernmodule (ILIAS, SCORM, und HTML), Fragenpools (für Umfragen und Tests), und Medienpools werden unterstützt. meta#:#meta_oer_object_type_selection#:#Sammlung folgender Objekttypen meta#:#meta_oer_target#:#Sammlung in meta#:#meta_opera#:#Opera @@ -17404,7 +17404,7 @@ user#:#roles_without_starting_point#:#Rollen ohne definierte Startseite user#:#save_order#:#Reihenfolge speichern user#:#send_mail_reminder_window_too_small#:#Das Intervall ist zu groß, um den Versand einer E-Mail vor der Löschung des Kontos zu gewährleisten. user#:#send_mail_to_inactive_users#:#Benachrichtigungsmail -user#:#send_mail_to_inactive_users_desc#:#Bevor ILIAS-Konten gelöscht werden, sendet ILIAS eine E-Mail an die betroffenen Personen. Durch ein erneutes Anmelden der jeweiligen Person in ILIAS wird die Löschung um die eingestellte Zeitspanne aufgeschoben. Bitte stellen Sie sicher, dass ein externer E-Mail-Empfang möglich ist. Bei Aktivierung des Cronjobs mit Benachrichtigungsmail, kann es vorkommen, dass zu Beginn die Zeitspanne zwischen Benachrichtigung und Löschung geringer ist als die eingestellte Zeitspanne. +user#:#send_mail_to_inactive_users_desc#:#Bevor ILIAS-Konten gelöscht werden, sendet ILIAS eine E-Mail an die betroffenen Personen. Durch ein erneutes Anmelden der jeweiligen Person in ILIAS wird die Löschung um die eingestellte Zeitspanne aufgeschoben. Bitte stellen Sie sicher, dass ein externer E-Mail-Empfang möglich ist. Bei Aktivierung des Cron-Jobs mit Benachrichtigungsmail, kann es vorkommen, dass zu Beginn die Zeitspanne zwischen Benachrichtigung und Löschung geringer ist als die eingestellte Zeitspanne. user#:#send_mail_to_inactive_users_must_be_smaller_than#:#Dieser Wert muss kleiner sein, als der Wert „Vergangene Tage seit letzter Anmeldung“. user#:#send_mail_to_inactive_users_numbers_only#:#Bitte nur ganzzahlige, positive Werte eingeben. Ihre Eingabe wurde gerundet. user#:#send_mail_to_inactive_users_suffix#:#Tage bis zur Löschung. @@ -17774,7 +17774,7 @@ wopi#:#wopi_crawler_cronjob_success#:#WOPI Informationen erfolgreich aktualisier wopi#:#wopi_crawler_cronjob_title#:#Update WOPI Discovery wopi#:#wopi_settings#:#WOPI wopi#:#wopi_url#:#WOPI Discovery URL -wopi#:#wopi_url_byline#:#Vollständige URL des WOPI-Discovery, diese muss über den ILIAS-Server erreichbar sein. Die XML-Daten des Discover werden von ILIAS eingelesen und gespeichert, die Informationen werden regelmäßig durch den Cronjob "Update WOPI Discovery" aktualisiert. Beispiel: https://example.org/hosting/discovery +wopi#:#wopi_url_byline#:#Vollständige URL des WOPI-Discovery, diese muss über den ILIAS-Server erreichbar sein. Die XML-Daten des Discovery werden von ILIAS eingelesen und gespeichert. Die Informationen werden regelmäßig durch den Cron-Job „Update WOPI Discovery“ aktualisiert. Beispiel: https://example.org/hosting/discovery wsp#:#element_already_shared#:#Die Ressource ist für diese Person bereits freigegeben. wsp#:#element_shared#:#Die Ressource wurde freigegeben. wsp#:#error_creating_certificate_pdf#:#Das Zertifikat konnte nicht erstellt werden. Bitte kontaktieren Sie Ihre technische Betreuung und bitten um die Prüfung des Zertifikatsservers. From 90f7a4ce78ad715a6cd713eb736a06338785e5ac Mon Sep 17 00:00:00 2001 From: Timon Amstutz Date: Tue, 8 Apr 2025 11:29:57 +0200 Subject: [PATCH 010/125] Fix of #40739 (cherry picked from commit d2e19ed00ce53af17714a7548d862cd10c19d57e) --- .../ILIAS/Style/System/classes/class.ilStyleDefinition.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/ILIAS/Style/System/classes/class.ilStyleDefinition.php b/components/ILIAS/Style/System/classes/class.ilStyleDefinition.php index 68e109ee990f..7d5a0cfda1cb 100755 --- a/components/ILIAS/Style/System/classes/class.ilStyleDefinition.php +++ b/components/ILIAS/Style/System/classes/class.ilStyleDefinition.php @@ -282,7 +282,7 @@ public static function getCurrentStyle(): ?string $DIC->refinery()->kindlyTo()->string() ); $target_arr = explode('_', $target); - $ref_id = $target_arr[1]; + $ref_id = $target_arr[1] ?? ''; } // check whether any ref id assigns a new style From 93c4cc8a77e331f24dfcf3f54916471c0979f62f Mon Sep 17 00:00:00 2001 From: mjansen Date: Tue, 8 Apr 2025 12:16:53 +0200 Subject: [PATCH 011/125] Auth: Don't hide login form if Shibboleth or CAS are default Mantis: https://mantis.ilias.de/view.php?id=32755 (cherry picked from commit bc316a99ce6404894e311f385fa58ff91ceaff66) --- .../ILIAS/Init/classes/class.ilStartUpGUI.php | 25 ++++++------------- 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/components/ILIAS/Init/classes/class.ilStartUpGUI.php b/components/ILIAS/Init/classes/class.ilStartUpGUI.php index abffb4de1a7e..8ae0c1afcdff 100755 --- a/components/ILIAS/Init/classes/class.ilStartUpGUI.php +++ b/components/ILIAS/Init/classes/class.ilStartUpGUI.php @@ -849,24 +849,13 @@ private function showLoginForm( ): string { global $tpl; - // @todo move this to auth utils. - // login via ILIAS (this also includes ldap) - // If local authentication is enabled for shibboleth users, we - // display the login form for ILIAS here. - if (( - $this->setting->get('auth_mode') != ilAuthUtils::AUTH_SHIBBOLETH || - $this->setting->get('shib_auth_allow_local') - ) && $this->setting->get('auth_mode') != ilAuthUtils::AUTH_CAS) { - return $this->substituteLoginPageElements( - $tpl, - $page_editor_html, - $this->ui_renderer->render($form ?? $this->buildStandardLoginForm()), - '[list-login-form]', - 'LOGIN_FORM' - ); - } - - return $page_editor_html; + return $this->substituteLoginPageElements( + $tpl, + $page_editor_html, + $this->ui_renderer->render($form ?? $this->buildStandardLoginForm()), + '[list-login-form]', + 'LOGIN_FORM' + ); } private function showLoginInformation(string $page_editor_html, ilGlobalTemplateInterface $tpl): string From ecb90031837db502732a1139ae8a8c67b87f69b1 Mon Sep 17 00:00:00 2001 From: Matthias Kunkel Date: Tue, 8 Apr 2025 09:27:55 +0200 Subject: [PATCH 012/125] Fixed Mantis #44614: Suggestion labels in Cron-Table (cherry picked from commit 4d3988a3bff70daf88ad81962e720ea741b2a38c) --- lang/ilias_de.lang | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index 3eec44a2c3e2..f4c0fe5d7293 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -7423,9 +7423,9 @@ cron#:#cron_action_reset#:#Zurücksetzen cron#:#cron_action_reset_success#:#Cron-Job zurückgesetzt. cron#:#cron_action_reset_sure#:#Wollen Sie wirklich den Cron-Job „%s“ zurücksetzen? cron#:#cron_action_reset_sure_multi#:#Wollen Sie wirklich die folgenden Cron-Jobs zurücksetzen? -cron#:#cron_action_run#:#Cron-Job Ausführen -cron#:#cron_action_run_fail#:#Ausführung gescheitert. -cron#:#cron_action_run_success#:#Cron-Job erfolgreich ausgeführt. +cron#:#cron_action_run#:#Cron-Job ausführen +cron#:#cron_action_run_fail#:#Ausführung gescheitert +cron#:#cron_action_run_success#:#Cron-Job erfolgreich ausgeführt cron#:#cron_action_run_sure#:#Wollen Sie wirklich den Cron-Job „%s“ ausführen? cron#:#cron_changed_by_crontab#:#SYSTEM cron#:#cron_component#:#Komponente @@ -7434,11 +7434,11 @@ cron#:#cron_jobs_with_required_intervention#:#Folgende Cron-Jobs benötigen mög cron#:#cron_last_run#:#Letzter Durchlauf cron#:#cron_no_executable_job_selected#:#Bitte wählen Sie mindestens einen ausführbaren Cron-Job. cron#:#cron_result#:#Ergebnis -cron#:#cron_result_info#:#Ergebnis-Info +cron#:#cron_result_info#:#Ergebnisdetails cron#:#cron_result_status_crashed#:#Abbruch cron#:#cron_result_status_fail#:#Fehler cron#:#cron_result_status_invalid_configuration#:#Ungültige Konfiguration -cron#:#cron_result_status_no_action#:#Ok, keine Bearbeitung +cron#:#cron_result_status_no_action#:#Ausgeführt. Keine Änderungen cron#:#cron_result_status_ok#:#Ok cron#:#cron_result_status_reset#:#Zurücksetzen cron#:#cron_running_since#:#Läuft seit @@ -7456,8 +7456,8 @@ cron#:#cron_schedule_yearly#:#Jährlich cron#:#cron_status#:#Status cron#:#cron_status_active#:#Aktiv cron#:#cron_status_inactive#:#Inaktiv -cron#:#cron_status_info#:#Status-Info -crs#:#activation_times_not_valid#:#Die Zeitdauer für 'Verfügbarkeit' ist nicht gültig. +cron#:#cron_status_info#:#Statusänderung +crs#:#activation_times_not_valid#:#Die Zeitdauer für „Verfügbarkeit“ ist nicht gültig. crs#:#assigned#:#Zugeordnet crs#:#contact_email_not_valid#:#Die E-Mail-Adresse ist nicht gültig. crs#:#crs_accept_subscriber#:#Aufnahme in Kurs „%s“ From 22c1779f5ebbdee626f2f459407d3345f66a9d58 Mon Sep 17 00:00:00 2001 From: Matthias Kunkel Date: Tue, 8 Apr 2025 13:58:45 +0200 Subject: [PATCH 013/125] Fixed Mantis #44626: Anpassung der Bezeichnung bei "LOM-Vokabulare". (cherry picked from commit 3b7fb23070ced9d87dcaf2928900d70d8a465ef9) --- lang/ilias_de.lang | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index f4c0fe5d7293..a6f9a5e9c898 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -11829,10 +11829,10 @@ mcst#:#mcst_show_description#:#Beschreibung anzeigen mcst#:#mcst_standard_settings_info#:#Kommagetrennte Liste von Dateiendungen mcst#:#mcst_standard_settings_title#:#Dateiendungen für das Standard Format mcst#:#mcst_standard_title#:#Standard-Mediendatei -mcst#:#mcst_unable_to_determin_playtime#:#Leider konnte die Laufzeit nicht automatisch bestimmt werden. Unter "Bearbeiten" können Sie die Laufzeit manuell einstellen. +mcst#:#mcst_unable_to_determin_playtime#:#Leider konnte die Laufzeit nicht automatisch bestimmt werden. Unter „Bearbeiten“ können Sie die Laufzeit manuell einstellen. mcst#:#mcst_video_cast#:#Videoliste mcst#:#mcst_video_completion_threshold#:#"Bearbeitet"-Schwellenwert -mcst#:#mcst_video_completion_threshold_info#:#Ab diesem Fortschritt wird ein Video als "angesehen" gespeichert. Bitte beachten Sie, dass ILIAS nicht prüft, ob der gesamte Zeitraum auch wirklich angezeigt wurde oder der Benutzer Teile übersprungen hat. +mcst#:#mcst_video_completion_threshold_info#:#Ab diesem Fortschritt wird ein Video als „angesehen“ gespeichert. Bitte beachten Sie, dass ILIAS nicht prüft, ob der gesamte Zeitraum auch wirklich angezeigt wurde oder der Benutzer Teile übersprungen hat. mcst#:#mcst_videoalternative_title#:#Alternatives Videoformat zur Nutzung im Browser mcst#:#mcst_videoportable_settings_info#:#Kommagetrennte Liste von Dateiendungen mcst#:#mcst_videoportable_settings_title#:#Dateiendungen für das Video-Format @@ -11885,7 +11885,7 @@ mep#:#mep_master_language_only_no_media#:#Basissprache für Übersetzung - ohne mep#:#mep_media_files#:#Mediendateien mep#:#mep_media_subtitles#:#Untertitel mep#:#mep_mob#:#Medienobjekt -mep#:#mep_move_select_insert#:#Navigieren Sie zum Zielordner und wählen Sie "Einfügen". +mep#:#mep_move_select_insert#:#Navigieren Sie zum Zielordner und wählen Sie „Einfügen“. mep#:#mep_mpg#:#Inhaltsbaustein mep#:#mep_new_content_snippet#:#Neuer Inhaltsbaustein mep#:#mep_new_folder#:#Neuer Ordner @@ -11905,7 +11905,7 @@ mep#:#mobs_always_show_file_manager_info#:#Wenn deaktiviert, wird die Dateistruk mep#:#mobs_black_list_file_types#:#Verbotene Dateitypen mep#:#mobs_black_list_file_types_and_allowed_info#:#Diese Liste schränkt die Menge der erlaubten Dateitypen ein. Tragen Sie dazu die jeweilige MIME-Typen mit Komma getrennt ein (z.B. text/html, application/pdf). Aktuell erlaubte MIME-Typen: mep#:#mobs_restrict_file_types#:#Erlaubte Dateitypen -mep#:#mobs_restrict_file_types_info#:#Bestimmen Sie alle Dateitypen, die in Medienobjekten hochgeladen werden dürfen. Tragen Sie dazu die jeweilige Dateiendungen mit Komma getrennt ein (z.B. jpg,gif). Wird kein Eintrag vorgenommen, sind alle Typen erlaubt. +mep#:#mobs_restrict_file_types_info#:#Bestimmen Sie alle Dateitypen, die in Medienobjekten hochgeladen werden dürfen. Tragen Sie dazu die jeweilige Dateiendungen mit Komma getrennt ein (z.B. jpg, gif). Wird kein Eintrag vorgenommen, sind alle Typen erlaubt. meta#:#adt_error_max_length#:#Der eingegebene Text ist zu lang. Bitte geben Sie einen kürzeren Text ein. meta#:#md_adn_int_error_no_default#:#Bitte wählen Sie eine aktivierte Sprache als "Default-Sprache" aus. meta#:#md_adv_active#:#Aktiv @@ -11975,7 +11975,7 @@ meta#:#md_copyright#:#Copyright meta#:#md_copyright_add#:#Neue Vorgabe meta#:#md_copyright_admin_tab#:#Copyright & OER meta#:#md_copyright_alt_text#:#Alternativtext -meta#:#md_copyright_alt_text_info#:#Wird für das ‘alt’ Attribut des Bildes verwendet +meta#:#md_copyright_alt_text_info#:#Wird für das „Alt“-Attribut des Bildes verwendet meta#:#md_copyright_default#:#Standard meta#:#md_copyright_edit#:#Copyright-Vorgabe bearbeiten meta#:#md_copyright_enable_info#:#Im Unterreiter „Lizenzen“ hinterlegte Auswahl wird in Objekten angeboten. @@ -11995,28 +11995,28 @@ meta#:#md_copyrights_deleted#:#Die ausgewählten Vorgaben wurden entfernt. meta#:#md_days#:#Tage: meta#:#md_delete_cp_sure#:#Möchten Sie wirklich die ausgewählten Vorgaben entfernen? meta#:#md_delimiter#:#Trennzeichen -meta#:#md_delimiter_info#:#Das Trennzeichen wird in der Schnellbearbeitung der Metadaten verwendet, um mehrere Angaben zu trennen. Standardzeichen ist ','. +meta#:#md_delimiter_info#:#Das Trennzeichen wird in der Schnellbearbeitung der Metadaten verwendet, um mehrere Angaben zu trennen. Standardzeichen ist „'“. meta#:#md_editor_custom_input#:#Eigene Angabe meta#:#md_editor_from_vocab_input#:#Aus Vokabular meta#:#md_editor_value#:#Begriff meta#:#md_fields#:#Felder meta#:#md_import_file_vocab#:#Importdatei -meta#:#md_import_vocab#:#Import +meta#:#md_import_vocab#:#Vokabular importieren meta#:#md_import_vocab_modal#:#Aus Datei importieren meta#:#md_months#:#Monate: meta#:#md_oai_contact_mail#:#E-Mail-Kontaktadresse meta#:#md_oai_identifier_prefix#:#OAI Präfix -meta#:#md_oai_identifier_prefix_info#:#Dieser Präfix wird als Namespace in den Bezeichnern von abgefragten OER Datensätzen benutzt. +meta#:#md_oai_identifier_prefix_info#:#Dieser Präfix wird als Namespace in den Bezeichnern von abgefragten OER-Datensätzen benutzt. meta#:#md_oai_pmh_enabled#:#Abfragen über OAI-PMH Schnittstelle erlauben -meta#:#md_oai_pmh_enabled_info#:#Wenn aktiviert, können vom OER Harvester gefundene Resourcen von externen Parteien wie OER Repositorien abgefragt werden. +meta#:#md_oai_pmh_enabled_info#:#Wenn aktiviert, können vom OER-Harvester gefundene Resourcen von externen Parteien wie OER Repositorien abgefragt werden. meta#:#md_oai_repository_name#:#Name des Repositoriums -meta#:#md_oai_repository_name_info#:#Bei Anfragen über die Schnittstelle wird dies als Name dieser ILIAS Installation angegeben. +meta#:#md_oai_repository_name_info#:#Bei Anfragen über die Schnittstelle wird dies als Name dieser ILIAS-Installation angegeben. meta#:#md_obj_types#:#Zugeordnete Objekte meta#:#md_record_export_table#:#Exportdateien meta#:#md_record_list_table#:#Benutzerdefinierte Metadatensätze meta#:#md_separated_by#:#Getrennt mit %s meta#:#md_settings#:#Einstellungen -meta#:#md_settings_harvester#:#OER Harvester +meta#:#md_settings_harvester#:#OER-Harvester meta#:#md_settings_licence#:#Nutzungsregeln meta#:#md_settings_publishing#:#Abfrage durch Repositorien meta#:#md_time#:#Zeit: @@ -12031,24 +12031,24 @@ meta#:#md_vocab_deactivate_action#:#Deaktivieren meta#:#md_vocab_delete_action#:#Löschen meta#:#md_vocab_delete_confirmation_text#:#Sind Sie sicher, dass sie dass Vokabular %s (%s) mit den folgenden Begriffen löschen wollen? meta#:#md_vocab_delete_confirmation_title#:#Vokabular löschen -meta#:#md_vocab_deletion_successful#:#Vokabular erfolgreich gelöscht. +meta#:#md_vocab_deletion_successful#:#Vokabular erfolgreich gelöscht meta#:#md_vocab_disallow_custom_input_action#:#Keine eigenen Angaben erlauben meta#:#md_vocab_element_column#:#Element meta#:#md_vocab_element_with_condition#:#%s mit %s %s meta#:#md_vocab_import_invalid#:#Die Importdatei ist ungültig:
%s -meta#:#md_vocab_import_successful#:#Vokabular erfolgreich imported. +meta#:#md_vocab_import_successful#:#Vokabular erfolgreich importiert meta#:#md_vocab_import_upload_failed#:#Das Hochladen der Importdatei ist fehlgeschlagen. -meta#:#md_vocab_preview_column#:#Vorschau -meta#:#md_vocab_show_all_action#:#Alle Begriffe anzeigen +meta#:#md_vocab_preview_column#:#Werte +meta#:#md_vocab_show_all_action#:#Alle Werte anzeigen meta#:#md_vocab_source_column#:#Quelle -meta#:#md_vocab_table_title#:#Vokabulare +meta#:#md_vocab_table_title#:#Metadaten-Elemente mit vordefinierten Werten meta#:#md_vocab_type_column#:#Typ meta#:#md_vocab_type_controlled_string#:#Kontrollierter Text meta#:#md_vocab_type_controlled_vocab_value#:#Kontrollierte Auswahl meta#:#md_vocab_type_copyright#:#Copyright meta#:#md_vocab_type_standard#:#Standard -meta#:#md_vocab_update_successful#:#Vokabular erfolgreich aktualisiert. -meta#:#md_vocabularies_config#:#LOM Vokabulare +meta#:#md_vocab_update_successful#:#Vokabular erfolgreich aktualisiert +meta#:#md_vocabularies_config#:#LOM-Vokabulare meta#:#meta_1#:#1 meta#:#meta_2#:#2 meta#:#meta_3#:#3 @@ -12610,7 +12610,7 @@ meta#:#meta_oer_copyright_selection_info#:#Nur Objekte, die unter einer der ausg meta#:#meta_oer_exposed_source#:#Veröffentlichung in meta#:#meta_oer_harvested_licences#:#Lizenzauswahl meta#:#meta_oer_harvested_types#:#Auswahl Objekttypen -meta#:#meta_oer_harvester#:#OER Harvester +meta#:#meta_oer_harvester#:#OER-Harvester meta#:#meta_oer_harvester_desc#:#Der OER-Harvester sammelt alle Ressourcen unter ausgewählten CC-Lizenzen, fügt sie einer in den Cron-Job-Einstellungen definierten Kategorie hinzu, und generiert wenn nötig Exportdateien für sie. Für die für Veröffentlichung bereite Ressourcen werden Einträge angelegt, die (wenn aktiviert) über eine OAI-PMH Schnittstelle ausgelesen werden können. Damit dieser Cron-Job Ergebnisse liefern kann, muss die Copyright-Auswahl in der Metadaten-Administration aktiviert und konfiguriert sein. Nur Dateiobjekte, Glossare, Inhaltsseiten, Lernmodule (ILIAS, SCORM, und HTML), Fragenpools (für Umfragen und Tests), und Medienpools werden unterstützt. meta#:#meta_oer_object_type_selection#:#Sammlung folgender Objekttypen meta#:#meta_oer_target#:#Sammlung in From 5169df34c85630a687d8ce39a07a2f153e284660 Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Fri, 28 Mar 2025 15:06:40 +0100 Subject: [PATCH 014/125] Glossary: remove some unused code, old public access export (bt-42313) --- .../class.ilGloAdvColSortInputGUI.php | 116 --------- .../class.ilGlossaryAdvMetaDataAdapter.php | 2 + .../class.PresentationGUIRequest.php | 13 - .../class.ilGlossaryPresentationGUI.php | 81 +----- components/ILIAS/Glossary/ROADMAP.md | 8 + .../Glossary/Table/DownloadListTable.php | 196 -------------- .../Glossary/Table/class.TableManager.php | 6 - .../Glossary/Term/class.ilGlossaryTerm.php | 2 + .../Glossary/classes/class.ilObjGlossary.php | 43 --- .../classes/class.ilObjGlossaryGUI.php | 246 ------------------ .../default/tpl.adv_col_sort_input.html | 9 - .../default/tpl.glo_export_file_row.html | 17 -- lang/ilias_de.lang | 3 - lang/ilias_en.lang | 3 - 14 files changed, 13 insertions(+), 732 deletions(-) delete mode 100755 components/ILIAS/Glossary/Metadata/class.ilGloAdvColSortInputGUI.php delete mode 100644 components/ILIAS/Glossary/Table/DownloadListTable.php delete mode 100755 components/ILIAS/Glossary/templates/default/tpl.adv_col_sort_input.html delete mode 100755 components/ILIAS/Glossary/templates/default/tpl.glo_export_file_row.html diff --git a/components/ILIAS/Glossary/Metadata/class.ilGloAdvColSortInputGUI.php b/components/ILIAS/Glossary/Metadata/class.ilGloAdvColSortInputGUI.php deleted file mode 100755 index ebf12709c870..000000000000 --- a/components/ILIAS/Glossary/Metadata/class.ilGloAdvColSortInputGUI.php +++ /dev/null @@ -1,116 +0,0 @@ - - */ -class ilGloAdvColSortInputGUI extends ilFormPropertyGUI -{ - private \ILIAS\Repository\InternalGUIService $gui; - protected array $value; - - public function __construct( - string $a_title = "", - string $a_id = "" - ) { - global $DIC; - - $this->lng = $DIC->language(); - parent::__construct($a_title, $a_id); - $this->setType("glo_adv_col_sort"); - // temp workaround - $this->gui = $DIC->repository()->internal()->gui(); - } - - public function setValue(array $a_value): void - { - $this->value = $a_value; - } - - public function getValue(): array - { - return $this->value; - } - - - /** - * Input should always be valid, since we sort only - */ - public function checkInput(): bool - { - return true; - } - - public function getInput(): array - { - $val = $this->arrayArray($this->getPostVar()); - $val = ilArrayUtil::stripSlashesRecursive($val); - return $val; - } - - public function render(): string - { - $lng = $this->lng; - $up = $this->gui->symbol()->glyph("up")->render(); - $down = $this->gui->symbol()->glyph("down")->render(); - - $tpl = new ilTemplate("tpl.adv_col_sort_input.html", true, true, "components/ILIAS/Glossary"); - if (is_array($this->getValue())) { - foreach ($this->getValue() as $k => $v) { - $tpl->setCurrentBlock("item"); - $tpl->setVariable("TEXT", $v["text"]); - $tpl->setVariable("ID", $this->getFieldId() . "~" . $k); - $tpl->setVariable("DOWN", $down); - $tpl->setVariable("TXT_DOWN", $lng->txt("down")); - $tpl->setVariable("UP", $up); - $tpl->setVariable("TXT_UP", $lng->txt("up")); - $tpl->setVariable('NAME', $this->getPostVar() . "[" . $k . "][id]"); - $tpl->setVariable('TNAME', $this->getPostVar() . "[" . $k . "][text]"); - $tpl->setVariable('VAL', ilLegacyFormElementsUtil::prepareFormOutput($v["id"])); - $tpl->setVariable('TVAL', ilLegacyFormElementsUtil::prepareFormOutput($v["text"])); - $tpl->parseCurrentBlock(); - } - } - - return $tpl->get(); - } - - public function insert(ilTemplate $a_tpl): void - { - $a_tpl->setCurrentBlock("prop_generic"); - $a_tpl->setVariable("PROP_GENERIC", $this->render()); - $a_tpl->parseCurrentBlock(); - } - - public function setValueByArray(array $a_values): void - { - if ($this->getPostVar() && isset($a_values[$this->getPostVar()])) { - $this->setValue($a_values[$this->getPostVar()]); - } - } - - public function getTableFilterHTML(): string - { - $html = $this->render(); - return $html; - } -} diff --git a/components/ILIAS/Glossary/Metadata/class.ilGlossaryAdvMetaDataAdapter.php b/components/ILIAS/Glossary/Metadata/class.ilGlossaryAdvMetaDataAdapter.php index 590af5130d2e..34ef30ab119e 100755 --- a/components/ILIAS/Glossary/Metadata/class.ilGlossaryAdvMetaDataAdapter.php +++ b/components/ILIAS/Glossary/Metadata/class.ilGlossaryAdvMetaDataAdapter.php @@ -114,6 +114,8 @@ public function getColumnOrder(): array /** * Save column order + * + * TODO: this is not a setting anymore, remove? */ public function saveColumnOrder(array $a_cols): void { diff --git a/components/ILIAS/Glossary/Presentation/class.PresentationGUIRequest.php b/components/ILIAS/Glossary/Presentation/class.PresentationGUIRequest.php index 7181bf73505d..4429aada8360 100755 --- a/components/ILIAS/Glossary/Presentation/class.PresentationGUIRequest.php +++ b/components/ILIAS/Glossary/Presentation/class.PresentationGUIRequest.php @@ -56,19 +56,6 @@ protected function getTableAction(string $key): string return $this->str($key); } - public function getTableGlossaryDownloadListAction(): string - { - return $this->getTableAction("glo_download_list_table_action"); - } - - /** - * @return string[] - */ - public function getTableGlossaryDownloadFileIds(): array - { - return $this->getTableIds("glo_download_list_table_file_ids"); - } - public function getFileId(): string { return $this->str("file_id"); diff --git a/components/ILIAS/Glossary/Presentation/class.ilGlossaryPresentationGUI.php b/components/ILIAS/Glossary/Presentation/class.ilGlossaryPresentationGUI.php index 0f81e092abbf..f71fd32506ad 100755 --- a/components/ILIAS/Glossary/Presentation/class.ilGlossaryPresentationGUI.php +++ b/components/ILIAS/Glossary/Presentation/class.ilGlossaryPresentationGUI.php @@ -28,7 +28,6 @@ class ilGlossaryPresentationGUI implements ilCtrlBaseClassInterface protected \ILIAS\COPage\Xsl\XslManager $xsl; protected \ILIAS\GlobalScreen\Services $global_screen; protected \ILIAS\Glossary\InternalGUIService $gui; - protected \ILIAS\Glossary\InternalDomainService $domain; protected array $mobs; protected bool $fill_on_load_code; protected string $offline_dir; @@ -56,16 +55,9 @@ class ilGlossaryPresentationGUI implements ilCtrlBaseClassInterface protected string $requested_search_str; protected string $requested_file_id; protected int $requested_mob_id; - protected string $requested_table_glossary_download_list_action = ""; - /** - * @var string[] - */ - protected array $requested_table_glossary_download_file_ids = []; protected \ILIAS\Style\Content\Service $content_style_service; protected \ILIAS\Style\Content\GUIService $content_style_gui; protected \ILIAS\Style\Content\Object\ObjectFacade $content_style_domain; - protected \ILIAS\UI\Factory $ui_fac; - protected \ILIAS\UI\Renderer $ui_ren; public function __construct( string $export_format = "", @@ -74,8 +66,8 @@ public function __construct( global $DIC; $service = $DIC->glossary()->internal(); + $domain = $service->domain(); - $this->domain = $domain = $service->domain(); $this->gui = $gui = $service->gui(); $this->access = $DIC->access(); @@ -92,9 +84,6 @@ public function __construct( $this->export_format = $export_format; $this->setOfflineDirectory($export_dir); - $this->offline = ($export_format != ""); - $this->ui_fac = $DIC->ui()->factory(); - $this->ui_ren = $DIC->ui()->renderer(); $this->offline = ($export_format !== ""); $this->ctrl->saveParameter($this, array("ref_id", "letter", "tax_node")); @@ -126,9 +115,6 @@ public function initByRequest(?array $query_params = null): void $this->requested_search_str = $request->getSearchString(); $this->requested_file_id = $request->getFileId(); $this->requested_mob_id = $request->getMobId(); - $this->requested_table_glossary_download_list_action = $request->getTableGlossaryDownloadListAction(); - $this->requested_table_glossary_download_file_ids = $request->getTableGlossaryDownloadFileIds(); - // determine term id and check whether it is valid (belongs to // current glossary or a virtual (online) sub-glossary) @@ -614,61 +600,6 @@ public function media(string $a_mode = "media"): string return ""; } - /** - * show download list - */ - public function showDownloadList(): void - { - $ilAccess = $this->access; - $lng = $this->lng; - $ilTabs = $this->tabs_gui; - - if (!$ilAccess->checkAccess("read", "", $this->requested_ref_id)) { - throw new ilPermissionException($lng->txt("permission_denied")); - } - - $this->setTabs(); - $ilTabs->activateTab("download"); - - // set title header - $this->tpl->setTitle($this->glossary->getTitle()); - $this->tpl->setTitleIcon(ilUtil::getImagePath("standard/icon_glo.svg")); - - $table = $this->domain->table()->getDownloadListTable($this->glossary)->getComponent(); - - $this->tpl->setContent($this->ui_ren->render($table)); - } - - /** - * send download file (xml/html) - */ - public function downloadExportFile(): void - { - $ilAccess = $this->access; - $lng = $this->lng; - - if (!$ilAccess->checkAccess("read", "", $this->requested_ref_id)) { - throw new ilPermissionException($lng->txt("permission_denied")); - } - - $file_type = ""; - if (($this->requested_table_glossary_download_list_action == "downloadExportFile") - && !empty($this->requested_table_glossary_download_file_ids)) { - $file_id = $this->requested_table_glossary_download_file_ids[0]; - $file_type = explode(":", $file_id)[0]; - } - - $file = $this->glossary->getPublicExportFile($file_type); - if ($file != "") { - $dir = $this->glossary->getExportDirectory($file_type); - if (is_file($dir . "/" . $file)) { - ilFileDelivery::deliverFileLegacy($dir . "/" . $file, $file); - exit; - } - } - throw new ilGlossaryException($lng->txt("file_not_found")); - } - public function setLocator(): void { $gloss_loc = new ilGlossaryLocatorGUI(); @@ -921,16 +852,6 @@ public function getTabs(): void $lng->txt("cont_print_view"), $ilCtrl->getLinkTarget($this, "printViewSelection") ); - - // download links - if ($this->glossary->isActiveDownloads()) { - $this->tabs_gui->addTab( - "download", - $lng->txt("download"), - $ilCtrl->getLinkTarget($this, "showDownloadList") - ); - } - //} } if ($ilAccess->checkAccess("write", "", $this->requested_ref_id) || diff --git a/components/ILIAS/Glossary/ROADMAP.md b/components/ILIAS/Glossary/ROADMAP.md index dca010ac16b5..fce7dc96ee12 100755 --- a/components/ILIAS/Glossary/ROADMAP.md +++ b/components/ILIAS/Glossary/ROADMAP.md @@ -10,6 +10,14 @@ Up to ILIAS 8, it was possible to define LOM for glossary definitions. Since mul from ILIAS 9 onwards, LOM for definitions have also been abandoned (see Jour Fixe decision in FR). Now, there is "dead metadata" in the corresponding database tables, which should be deleted. +### Remove Public Access Exports From DB + +In the table `glossary`, the following columns can be removed: + +- `downloads_active` +- `public_xml_file` +- `public_html_file` + ## Mid Term ### Use central Online/Offline code diff --git a/components/ILIAS/Glossary/Table/DownloadListTable.php b/components/ILIAS/Glossary/Table/DownloadListTable.php deleted file mode 100644 index 08a010d69b78..000000000000 --- a/components/ILIAS/Glossary/Table/DownloadListTable.php +++ /dev/null @@ -1,196 +0,0 @@ - - */ -class DownloadListTable -{ - protected \ilCtrl $ctrl; - protected \ilLanguage $lng; - protected UI\Factory $ui_fac; - protected ServerRequestInterface $request; - protected Data\Factory $df; - protected \ilObjUser $user; - protected \ilObjGlossary $glossary; - - public function __construct(\ilObjGlossary $glossary) - { - global $DIC; - - $this->ctrl = $DIC->ctrl(); - $this->lng = $DIC->language(); - $this->ui_fac = $DIC->ui()->factory(); - $this->request = $DIC->http()->request(); - $this->df = new Data\Factory(); - $this->user = $DIC->user(); - $this->glossary = $glossary; - } - - public function getComponent(): UI\Component\Table\Data - { - $columns = $this->getColumns(); - $actions = $this->getActions(); - $data_retrieval = $this->getDataRetrieval(); - - $table = $this->ui_fac->table() - ->data($data_retrieval, $this->lng->txt("download"), $columns) - ->withId( - self::class . "_" . - $this->glossary->getRefId() - ) - ->withActions($actions) - ->withRequest($this->request); - - return $table; - } - - protected function getColumns(): array - { - if ((int) $this->user->getTimeFormat() === \ilCalendarSettings::TIME_FORMAT_12) { - $date_format = $this->df->dateFormat()->withTime12($this->user->getDateFormat()); - } else { - $date_format = $this->df->dateFormat()->withTime24($this->user->getDateFormat()); - } - - $columns = [ - "format" => $this->ui_fac->table()->column()->text($this->lng->txt("cont_format"))->withIsSortable(false), - "file" => $this->ui_fac->table()->column()->text($this->lng->txt("cont_file"))->withIsSortable(false), - "size" => $this->ui_fac->table()->column()->number($this->lng->txt("size"))->withIsSortable(false), - "date" => $this->ui_fac->table()->column()->date( - $this->lng->txt("date"), - $date_format - )->withIsSortable(false), - ]; - - return $columns; - } - - protected function getActions(): array - { - $query_params_namespace = ["glo_download_list_table"]; - - $uri_download = $this->df->uri( - ILIAS_HTTP_PATH . "/" . $this->ctrl->getLinkTargetByClass("ilglossarypresentationgui", "downloadExportFile") - ); - $url_builder_download = new UI\URLBuilder($uri_download); - list($url_builder_download, $action_parameter_token_download, $row_id_token_download) = - $url_builder_download->acquireParameters( - $query_params_namespace, - "action", - "file_ids" - ); - - $actions["download"] = $this->ui_fac->table()->action()->single( - $this->lng->txt("download"), - $url_builder_download->withParameter($action_parameter_token_download, "downloadExportFile"), - $row_id_token_download - ); - - return $actions; - } - - protected function getDataRetrieval(): UI\Component\Table\DataRetrieval - { - $data_retrieval = new class ( - $this->glossary, - $this->df - ) implements UI\Component\Table\DataRetrieval { - use TableRecords; - - public function __construct( - protected \ilObjGlossary $glossary, - protected Data\Factory $df - ) { - } - - public function getRows( - UI\Component\Table\DataRowBuilder $row_builder, - array $visible_column_ids, - Data\Range $range, - Data\Order $order, - ?array $filter_data, - ?array $additional_parameters - ): \Generator { - $records = $this->getRecords($range); - foreach ($records as $idx => $record) { - $row_id = (string) $record["file_id"]; - - yield $row_builder->buildDataRow($row_id, $record); - } - } - - public function getTotalRowCount( - ?array $filter_data, - ?array $additional_parameters - ): ?int { - return count($this->getRecords()); - } - - protected function getRecords(?Data\Range $range = null): array - { - $export_files = []; - $types = ["xml", "html"]; - foreach ($types as $type) { - $pe_file = $this->glossary->getPublicExportFile($type); - if ($pe_file != "") { - $dir = $this->glossary->getExportDirectory($type); - if (is_file($dir . "/" . $pe_file)) { - $size = filesize($dir . "/" . $pe_file); - $export_files[] = [ - "type" => $type, - "file" => $pe_file, - "size" => $size - ]; - } - } - } - - $records = []; - $i = 0; - foreach ($export_files as $exp_file) { - $records[$i]["file_id"] = $exp_file["type"] . ":" . $exp_file["file"]; - $records[$i]["format"] = strtoupper($exp_file["type"]); - $records[$i]["file"] = $exp_file["file"]; - $records[$i]["size"] = $exp_file["size"]; - $file_arr = explode("__", $exp_file["file"]); - $records[$i]["date"] = (new \DateTimeImmutable())->setTimestamp((int) $file_arr[0]); - - $i++; - } - - if ($range) { - $records = $this->limitRecords($records, $range); - } - - return $records; - } - }; - - return $data_retrieval; - } -} diff --git a/components/ILIAS/Glossary/Table/class.TableManager.php b/components/ILIAS/Glossary/Table/class.TableManager.php index dca0ee8e9573..7267c50b0d6d 100644 --- a/components/ILIAS/Glossary/Table/class.TableManager.php +++ b/components/ILIAS/Glossary/Table/class.TableManager.php @@ -61,10 +61,4 @@ public function getTermListTable( ): TermListTable { return new TermListTable($glossary, $tax_node); } - - public function getDownloadListTable( - \ilObjGlossary $glossary - ): DownloadListTable { - return new DownloadListTable($glossary); - } } diff --git a/components/ILIAS/Glossary/Term/class.ilGlossaryTerm.php b/components/ILIAS/Glossary/Term/class.ilGlossaryTerm.php index e54223cc8279..bd85e6f407da 100755 --- a/components/ILIAS/Glossary/Term/class.ilGlossaryTerm.php +++ b/components/ILIAS/Glossary/Term/class.ilGlossaryTerm.php @@ -332,6 +332,8 @@ public function updateShortText(): void /** * Set all short texts of glossary dirty * (e.g. if length is changed in settings) + * + * TODO: the new SettingsGUI doesn't use this, remove? */ public static function setShortTextsDirty(int $a_glo_id): void { diff --git a/components/ILIAS/Glossary/classes/class.ilObjGlossary.php b/components/ILIAS/Glossary/classes/class.ilObjGlossary.php index 1e44a38a7b8f..35de32c3bd67 100755 --- a/components/ILIAS/Glossary/classes/class.ilObjGlossary.php +++ b/components/ILIAS/Glossary/classes/class.ilObjGlossary.php @@ -28,7 +28,6 @@ class ilObjGlossary extends ilObject implements ilAdvancedMetaDataSubItems protected array $mob_ids = []; protected bool $show_tax = false; protected int $style_id = 0; - protected bool $downloads_active = false; protected bool $glo_menu_active = false; protected bool $online = false; protected int $snippet_length = 0; @@ -40,7 +39,6 @@ class ilObjGlossary extends ilObject implements ilAdvancedMetaDataSubItems protected ilGlobalTemplateInterface $tpl; public array $auto_glossaries = array(); protected ilObjUser $user; - protected array $public_export_file = []; public function __construct( @@ -98,14 +96,7 @@ public function read(): void $gl_rec = $this->db->fetchAssoc($gl_set); $this->setOnline(ilUtil::yn2tf($gl_rec["is_online"])); $this->setVirtualMode((string) ($gl_rec["virtual"] ?? "")); - if (isset($gl_rec["public_xml_file"]) && $gl_rec["public_xml_file"] != "") { - $this->setPublicExportFile("xml", $gl_rec["public_xml_file"]); - } - if (isset($gl_rec["public_html_file"]) && $gl_rec["public_html_file"] != "") { - $this->setPublicExportFile("html", $gl_rec["public_html_file"]); - } $this->setActiveGlossaryMenu(ilUtil::yn2tf($gl_rec["glo_menu_active"])); - $this->setActiveDownloads(ilUtil::yn2tf($gl_rec["downloads_active"])); $this->setPresentationMode((string) $gl_rec["pres_mode"]); $this->setSnippetLength((int) $gl_rec["snippet_length"]); $this->setShowTaxonomy((bool) $gl_rec["show_tax"]); @@ -231,16 +222,6 @@ public function isActiveGlossaryMenu(): bool return $this->glo_menu_active; } - public function setActiveDownloads(bool $a_down): void - { - $this->downloads_active = $a_down; - } - - public function isActiveDownloads(): bool - { - return $this->downloads_active; - } - public function setShowTaxonomy(bool $a_val): void { $this->show_tax = $a_val; @@ -320,10 +301,7 @@ public function update(): bool array( 'is_online' => array('text', ilUtil::tf2yn($this->getOnline())), 'virtual' => array('text', $this->getVirtualMode()), - 'public_xml_file' => array('text', $this->getPublicExportFile("xml")), - 'public_html_file' => array('text', $this->getPublicExportFile("html")), 'glo_menu_active' => array('text', ilUtil::tf2yn($this->isActiveGlossaryMenu())), - 'downloads_active' => array('text', ilUtil::tf2yn($this->isActiveDownloads())), 'pres_mode' => array('text', $this->getPresentationMode()), 'show_tax' => array('integer', $this->getShowTaxonomy()), 'snippet_length' => array('integer', $this->getSnippetLength()), @@ -508,27 +486,6 @@ public function getExportDirectory(string $a_type = "xml"): string return ilExport::_getExportDirectory($this->getId(), $a_type, $this->getType()); } - /** - * specify public export file for type - * @param string $a_type type ("xml" / "html") - * @param string $a_file file name - */ - public function setPublicExportFile( - string $a_type, - string $a_file - ): void { - $this->public_export_file[$a_type] = $a_file; - } - - /** - * get public export file - * @param string $a_type type ("xml" / "html") - */ - public function getPublicExportFile(string $a_type): string - { - return $this->public_export_file[$a_type] ?? ""; - } - public function delete(): bool { // always call parent delete function first!! diff --git a/components/ILIAS/Glossary/classes/class.ilObjGlossaryGUI.php b/components/ILIAS/Glossary/classes/class.ilObjGlossaryGUI.php index 72a5631e32ec..f67523f7a793 100755 --- a/components/ILIAS/Glossary/classes/class.ilObjGlossaryGUI.php +++ b/components/ILIAS/Glossary/classes/class.ilObjGlossaryGUI.php @@ -500,210 +500,6 @@ public function properties(): void $this->ctrl->redirectByClass(SettingsGUI::class); } - public function initSettingsForm(// todo: remove this and all related methods - string $a_mode = "edit" - ): void { - $obj_service = $this->getObjectService(); - - $this->form = new ilPropertyFormGUI(); - - // title - $title = new ilTextInputGUI($this->lng->txt("title"), "title"); - $title->setRequired(true); - $this->form->addItem($title); - - // description - $desc = new ilTextAreaInputGUI($this->lng->txt("desc"), "description"); - $this->form->addItem($desc); - - // glossary mode - // for layout of this property see https://mantis.ilias.de/view.php?id=31833 - $glo_mode = new ilRadioGroupInputGUI($this->lng->txt("glo_content_assembly"), "glo_mode"); - //$glo_mode->setInfo($this->lng->txt("glo_mode_desc")); - $op1 = new ilRadioOption($this->lng->txt("glo_mode_normal"), "none", $this->lng->txt("glo_mode_normal_info")); - $op2 = new ilRadioOption($this->lng->txt("glo_collection"), "coll", $this->lng->txt("glo_collection_info")); - if (!empty($this->object->getGlossariesForCollection()) && $this->object->isVirtual()) { - $op1->setDisabled(true); - $op2->setDisabled(true); - $glo_mode->setInfo($this->lng->txt("glo_change_to_standard_unavailable_info")); - } - if (!empty(ilGlossaryTerm::getTermsOfGlossary($this->object->getId())) && !$this->object->isVirtual()) { - $op1->setDisabled(true); - $op2->setDisabled(true); - $glo_mode->setInfo($this->lng->txt("glo_change_to_collection_unavailable_info")); - } - $glo_mode->addOption($op1); - $glo_mode->addOption($op2); - $this->form->addItem($glo_mode); - - - $this->lng->loadLanguageModule("rep"); - $section = new ilFormSectionHeaderGUI(); - $section->setTitle($this->lng->txt('rep_activation_availability')); - $this->form->addItem($section); - - // online - $online = new ilCheckboxInputGUI($this->lng->txt("cont_online"), "cobj_online"); - $online->setValue("y"); - $online->setInfo($this->lng->txt("glo_online_info")); - $this->form->addItem($online); - - $section = new ilFormSectionHeaderGUI(); - $section->setTitle($this->lng->txt('cont_presentation')); - $this->form->addItem($section); - - // tile image - $obj_service->commonSettings()->legacyForm($this->form, $this->object)->addTileImage(); - - // presentation mode - $pres_mode = new ilRadioGroupInputGUI($this->lng->txt("glo_presentation_mode"), "pres_mode"); - $pres_mode->setValue("table"); - $op1 = new ilRadioOption($this->lng->txt("glo_table_form"), "table", $this->lng->txt("glo_table_form_info")); - - // short text length - $snl = new ilNumberInputGUI($this->lng->txt("glo_text_snippet_length"), "snippet_length"); - $snl->setMaxValue(3000); - $snl->setMinValue(100); - $snl->setMaxLength(4); - $snl->setSize(4); - $snl->setInfo($this->lng->txt("glo_text_snippet_length_info")); - $snl->setValue(200); - $snl->setSuffix($this->lng->txt("characters")); - $op1->addSubItem($snl); - - $pres_mode->addOption($op1); - $op2 = new ilRadioOption($this->lng->txt("glo_full_definitions"), "full_def", $this->lng->txt("glo_full_definitions_info")); - $pres_mode->addOption($op2); - $this->form->addItem($pres_mode); - - // flashcard training - $flash_active = new ilCheckboxInputGUI($this->lng->txt("glo_flashcard_training"), "flash_active"); - $flash_active->setValue("y"); - $flash_active->setInfo($this->lng->txt("glo_flashcard_training_info")); - - //flashcard training mode - $flash_mode = new ilRadioGroupInputGUI($this->lng->txt("glo_mode"), "flash_mode"); - $op1 = new ilRadioOption($this->lng->txt("glo_term_vs_def"), "term", $this->lng->txt("glo_term_vs_def_info")); - $flash_mode->addOption($op1); - $op2 = new ilRadioOption($this->lng->txt("glo_def_vs_term"), "def", $this->lng->txt("glo_def_vs_term_info")); - $flash_mode->addOption($op2); - $flash_active->addSubItem($flash_mode); - $this->form->addItem($flash_active); - - // show taxonomy - $show_tax = null; - $tax_ids = ilObjTaxonomy::getUsageOfObject($this->object->getId()); - if (count($tax_ids) > 0) { - $show_tax = new ilCheckboxInputGUI($this->lng->txt("glo_show_taxonomy"), "show_tax"); - $show_tax->setInfo($this->lng->txt("glo_show_taxonomy_info")); - $this->form->addItem($show_tax); - } - - // downloads - $down = new ilCheckboxInputGUI($this->lng->txt("cont_downloads"), "glo_act_downloads"); - $down->setValue("y"); - $down->setInfo($this->lng->txt("cont_downloads_desc")); - $this->form->addItem($down); - - if ($a_mode == "edit") { - $title->setValue($this->object->getTitle()); - $desc->setValue($this->object->getDescription()); - $online->setChecked($this->object->getOnline()); - $mode1 = $this->object->getVirtualMode() === "none" - ? "none" - : "coll"; - $glo_mode->setValue($mode1); - $pres_mode->setValue($this->object->getPresentationMode()); - $snl->setValue($this->object->getSnippetLength()); - - $down->setChecked($this->object->isActiveDownloads()); - $flash_active->setChecked($this->object->isActiveFlashcards()); - $flash_mode->setValue($this->object->getFlashcardsMode()); - - // additional features - $feat = new ilFormSectionHeaderGUI(); - $feat->setTitle($this->lng->txt('obj_features')); - $this->form->addItem($feat); - - ilObjectServiceSettingsGUI::initServiceSettingsForm( - $this->object->getId(), - $this->form, - array( - ilObjectServiceSettingsGUI::CUSTOM_METADATA, - ilObjectServiceSettingsGUI::TAXONOMIES - ) - ); - } - - // sort columns, if adv fields are given - $adv_ap = new ilGlossaryAdvMetaDataAdapter($this->object->getRefId()); - $cols = $adv_ap->getColumnOrder(); - if (count($cols) > 1) { - $ti = new ilGloAdvColSortInputGUI($this->lng->txt("cont_col_ordering"), "field_order"); - $this->form->addItem($ti); - $ti->setValue($cols); - $ti->setInfo($this->lng->txt("glo_col_ordering_info")); - } - - // save and cancel commands - $this->form->addCommandButton("saveProperties", $this->lng->txt("save")); - - $this->form->setTitle($this->lng->txt("cont_glo_properties")); - $this->form->setFormAction($this->ctrl->getFormAction($this)); - } - - - public function saveProperties(): void - { - $obj_service = $this->getObjectService(); - - $this->initSettingsForm(); - if ($this->form->checkInput()) { - $this->object->setTitle($this->form->getInput("title")); - $this->object->setDescription($this->form->getInput("description")); - $this->object->setOnline(ilUtil::yn2tf($this->form->getInput("cobj_online"))); - $glo_mode = $this->form->getInput("glo_mode") ?: $this->object->getVirtualMode(); - $this->object->setVirtualMode($glo_mode); - $this->object->setActiveDownloads(ilUtil::yn2tf($this->form->getInput("glo_act_downloads"))); - $this->object->setPresentationMode($this->form->getInput("pres_mode")); - $this->object->setSnippetLength($this->form->getInput("snippet_length")); - $this->object->setActiveFlashcards(ilUtil::yn2tf($this->form->getInput("flash_active"))); - $this->object->setFlashcardsMode($this->form->getInput("flash_mode")); - $this->object->update(); - - // tile image - $obj_service->commonSettings()->legacyForm($this->form, $this->object)->saveTileImage(); - - // field order of advanced metadata - $adv_ap = new ilGlossaryAdvMetaDataAdapter($this->object->getRefId()); - $cols = $adv_ap->getColumnOrder(); - if (count($cols) > 1) { - $adv_ap->saveColumnOrder($this->form->getInput("field_order")); - } - - // set definition short texts dirty - ilGlossaryTerm::setShortTextsDirty($this->object->getId()); - - ilObjectServiceSettingsGUI::updateServiceSettingsForm( - $this->object->getId(), - $this->form, - array( - ilObjectServiceSettingsGUI::CUSTOM_METADATA, - ilObjectServiceSettingsGUI::TAXONOMIES - ) - ); - - // Update ecs export settings - $ecs = new ilECSGlossarySettings($this->object); - if ($ecs->handleSettingsUpdate($this->form)) { - $this->tpl->setOnScreenMessage('success', $this->lng->txt("msg_obj_modified"), true); - $this->ctrl->redirect($this, "properties"); - } - } - $this->form->setValuesByPost(); - $this->tpl->setContent($this->form->getHTML()); - } - public function getProperties( int $tax_id ): array { @@ -995,34 +791,6 @@ public function exportHTML(): void $this->ctrl->redirectByClass("ilexportgui", ""); } - /** - * download export file - */ - public function publishExportFile(): void - { - $files = $this->edit_request->getFiles(); - if (count($files) == 0) { - $this->tpl->setOnScreenMessage('failure', $this->lng->txt("no_checkbox"), true); - $this->ctrl->redirectByClass("ilexportgui", ""); - } - if (count($files) > 1) { - $this->tpl->setOnScreenMessage('failure', $this->lng->txt("cont_select_max_one_item"), true); - $this->ctrl->redirectByClass("ilexportgui", ""); - } - - $file = explode(":", $files[0]); - $export_dir = $this->object->getExportDirectory($file[0]); - - if ($this->object->getPublicExportFile($file[0]) == - $file[1]) { - $this->object->setPublicExportFile($file[0], ""); - } else { - $this->object->setPublicExportFile($file[0], $file[1]); - } - $this->object->update(); - $this->ctrl->redirectByClass("ilexportgui", ""); - } - public function deleteTerms(): void { if (!empty($this->edit_request->getTermIdsInModal()) @@ -1216,20 +984,6 @@ public function setContentStyleSheet( $this->content_style_gui->addCss($ctpl, $this->object->getRefId()); } - /** - * Get public access value for export table - */ - public function getPublicAccessColValue( - string $a_type, - string $a_file - ): string { - if ($this->object->getPublicExportFile($a_type) == $a_file) { - return $this->lng->txt("yes"); - } - - return " "; - } - /** * Show taxonomy */ diff --git a/components/ILIAS/Glossary/templates/default/tpl.adv_col_sort_input.html b/components/ILIAS/Glossary/templates/default/tpl.adv_col_sort_input.html deleted file mode 100755 index bf17c43349ff..000000000000 --- a/components/ILIAS/Glossary/templates/default/tpl.adv_col_sort_input.html +++ /dev/null @@ -1,9 +0,0 @@ - -
- {TEXT} - - - - -
- \ No newline at end of file diff --git a/components/ILIAS/Glossary/templates/default/tpl.glo_export_file_row.html b/components/ILIAS/Glossary/templates/default/tpl.glo_export_file_row.html deleted file mode 100755 index a9fbd07ae373..000000000000 --- a/components/ILIAS/Glossary/templates/default/tpl.glo_export_file_row.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - {TXT_TYPE} - - - {TXT_FILENAME} - - - {TXT_SIZE} - - - {TXT_DATE} - - diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index a6f9a5e9c898..3fe7c8144003 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -6310,7 +6310,6 @@ content#:#cont_click_starting_point#:#Bitte klicken Sie auf den Startpunkt des P content#:#cont_click_tl_corner#:#Bitte klicken Sie in die obere linke Ecke des gewünschten Bereichs content#:#cont_code_import_file#:#Import content#:#cont_code_manual_editing#:#Manual Editing -content#:#cont_col_ordering#:#Spaltenanordnung content#:#cont_colspan#:#Verbund Spalte content#:#cont_commented_by#:#Kommentiert von content#:#cont_comments#:#Kommentare erlauben @@ -7278,7 +7277,6 @@ content#:#glo_full_definitions_info#:#Alle Begriffe und Erklärungen werden voll content#:#glo_hide_taxonomy#:#Taxonomie ausblenden content#:#glo_list_usages#:#Nutzung content#:#glo_mode_normal_info#:#Das Glossar beinhaltet alle Begriffe, die im Glossar angelegt wurden. -content#:#glo_online_info#:#Nur wenn das Glossar online geschaltet ist, können Benutzer das Glossar sehen und benutzen. content#:#glo_presentation_mode#:#Ansicht content#:#glo_presentation_view#:#Präsentationsansicht content#:#glo_quick_navigation#:#Schnellzugriff @@ -10204,7 +10202,6 @@ glo#:#glo_bulk_creation#:#Aus Excel kopieren glo#:#glo_change_to_collection_unavailable_info#:#Um die Zusammenstellung der Inhalte auf "Sammelglossar" zu ändern, müssen Sie zuerst alle bestehenden Begriffe innerhalb dieses Glossars im Reiter "Inhalt" löschen. glo#:#glo_change_to_standard_unavailable_info#:#Um die Zusammenstellung der Inhalte auf "Normales Glossar" zu ändern, müssen Sie zuerst die ausgewählten Glossare im Reiter "Inhalt" entfernen. glo#:#glo_check#:#Prüfen -glo#:#glo_col_ordering_info#:#Sortieren Sie die Titel der Metadatenfelder, die in der Präsentationsansicht des Glossars als Spaltenüberschriften angezeigt werden. glo#:#glo_collection#:#Sammelglossar glo#:#glo_collection_empty_info#:#Dieses Sammelglossar ist aktuell leer. Bitte fügen mindestens ein Glossar hinzu. glo#:#glo_collection_info#:#Das Glossar sammelt automatisch alle Begriffe aus den ausgewählten Glossaren. diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index b828b7115968..78f67d55a719 100755 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -6311,7 +6311,6 @@ content#:#cont_click_starting_point#:#Please click on the starting point of the content#:#cont_click_tl_corner#:#Please click on the top left corner of the desired area. content#:#cont_code_import_file#:#Import content#:#cont_code_manual_editing#:#Manuelle Eingabe -content#:#cont_col_ordering#:#Column Ordering content#:#cont_colspan#:#Col. Span content#:#cont_commented_by#:#Commented by content#:#cont_comments#:#Store Comments @@ -7279,7 +7278,6 @@ content#:#glo_full_definitions_info#:#Terms and definitions are fully displayed content#:#glo_hide_taxonomy#:#Hide Taxonomy content#:#glo_list_usages#:#List Usages content#:#glo_mode_normal_info#:#All terms created within this glossary will be included. -content#:#glo_online_info#:#Only if the glossary is online, users are able to use the glossary. content#:#glo_presentation_mode#:#Presentation Mode content#:#glo_presentation_view#:#Presentation View content#:#glo_quick_navigation#:#Quick Navigation @@ -10205,7 +10203,6 @@ glo#:#glo_bulk_creation#:#Paste From Excel glo#:#glo_change_to_collection_unavailable_info#:#To change the type of content assembly to "Collection Glossary", you first have to delete all existing terms within this glossary in tab "Content". glo#:#glo_change_to_standard_unavailable_info#:#To change the type of content assembly to "Standard Glossary", you first have to remove the selected glossaries in tab "Content". glo#:#glo_check#:#Check -glo#:#glo_col_ordering_info#:#Order the titles of the metadata fields. They are presented as column headers in the table presentation of the glossary. glo#:#glo_collection#:#Collection Glossary glo#:#glo_collection_empty_info#:#This collection glossary is currently empty. Please add at least one glossary to it. glo#:#glo_collection_info#:#The glossary automatically collects all terms from the selected glossaries. From e0b86f149c7c9d622362f60168cf4327ebd48287 Mon Sep 17 00:00:00 2001 From: Thibeau Fuhrer Date: Tue, 8 Apr 2025 14:48:08 +0200 Subject: [PATCH 015/125] [FIX] UICore: remove `bootstrap.min.js` includes. (#9330) --- .../class.ilDataCollectionGlobalTemplate.php | 3 -- .../RTE/classes/class.ilRTEGlobalTemplate.php | 2 - .../Component/Layout/Page/Renderer.php | 2 - .../classes/class.ilGlobalPageTemplate.php | 1 - .../UICore/classes/class.ilGlobalTemplate.php | 3 -- .../UICore/classes/class.ilUIFramework.php | 40 ------------------- 6 files changed, 51 deletions(-) delete mode 100755 components/ILIAS/UICore/classes/class.ilUIFramework.php diff --git a/components/ILIAS/DataCollection/classes/class.ilDataCollectionGlobalTemplate.php b/components/ILIAS/DataCollection/classes/class.ilDataCollectionGlobalTemplate.php index a4aff96b960d..582c139beff7 100755 --- a/components/ILIAS/DataCollection/classes/class.ilDataCollectionGlobalTemplate.php +++ b/components/ILIAS/DataCollection/classes/class.ilDataCollectionGlobalTemplate.php @@ -475,9 +475,6 @@ public function loadStandardTemplate(): void iljQueryUtil::initjQuery(); iljQueryUtil::initjQueryUI(); - // always load ui framework - ilUIFramework::init(); - $this->addBlockFile("CONTENT", "content", "tpl.adm_content.html"); $this->addBlockFile("STATUSLINE", "statusline", "tpl.statusline.html"); diff --git a/components/ILIAS/RTE/classes/class.ilRTEGlobalTemplate.php b/components/ILIAS/RTE/classes/class.ilRTEGlobalTemplate.php index 1eae55d82ef6..2ddab893bcf7 100755 --- a/components/ILIAS/RTE/classes/class.ilRTEGlobalTemplate.php +++ b/components/ILIAS/RTE/classes/class.ilRTEGlobalTemplate.php @@ -191,8 +191,6 @@ public function loadStandardTemplate(): void iljQueryUtil::initjQuery(); iljQueryUtil::initjQueryUI(); - ilUIFramework::init(); - $this->addBlockFile('CONTENT', 'content', 'tpl.adm_content.html'); $this->addBlockFile('STATUSLINE', 'statusline', 'tpl.statusline.html'); diff --git a/components/ILIAS/UI/src/Implementation/Component/Layout/Page/Renderer.php b/components/ILIAS/UI/src/Implementation/Component/Layout/Page/Renderer.php index 9c4cc1422cb6..c408d3d859d2 100755 --- a/components/ILIAS/UI/src/Implementation/Component/Layout/Page/Renderer.php +++ b/components/ILIAS/UI/src/Implementation/Component/Layout/Page/Renderer.php @@ -27,7 +27,6 @@ use ILIAS\UI\Implementation\Render\Template; use ILIAS\UI\Implementation\Render\ResourceRegistry; use iljQueryUtil; -use ilUIFramework; use LogicException; class Renderer extends AbstractComponentRenderer @@ -169,7 +168,6 @@ protected function setHeaderVars(Template $tpl, bool $for_ui_demo = false): Temp $additional_js_files = [ iljQueryUtil::getLocaljQueryPath(), 'assets/js/Basic.js', - ilUIFramework::BOOTSTRAP_JS, './assets/js/jquery.js', './assets/js/jquery-migrate.min.js', ]; diff --git a/components/ILIAS/UICore/classes/class.ilGlobalPageTemplate.php b/components/ILIAS/UICore/classes/class.ilGlobalPageTemplate.php index 84bdf34e6861..c65d30bf37e2 100755 --- a/components/ILIAS/UICore/classes/class.ilGlobalPageTemplate.php +++ b/components/ILIAS/UICore/classes/class.ilGlobalPageTemplate.php @@ -98,7 +98,6 @@ protected function prepareBasicJS(): void iljQueryUtil::initjQuery($this); iljQueryUtil::initjQueryUI($this); $this->gs->layout()->meta()->addJs("assets/js/Basic.js", true, 1); - ilUIFramework::init($this); ilBuddySystemGUI::initializeFrontend($this); ilOnScreenChatGUI::initializeFrontend($this); GlobalPageHandler::initPage($this); diff --git a/components/ILIAS/UICore/classes/class.ilGlobalTemplate.php b/components/ILIAS/UICore/classes/class.ilGlobalTemplate.php index b034cdac3b00..2b1471d6e1fb 100755 --- a/components/ILIAS/UICore/classes/class.ilGlobalTemplate.php +++ b/components/ILIAS/UICore/classes/class.ilGlobalTemplate.php @@ -525,9 +525,6 @@ public function loadStandardTemplate(): void iljQueryUtil::initjQuery(); iljQueryUtil::initjQueryUI(); - // always load ui framework - ilUIFramework::init(); - $this->addBlockFile("CONTENT", "content", "tpl.adm_content.html"); $this->addBlockFile("STATUSLINE", "statusline", "tpl.statusline.html"); diff --git a/components/ILIAS/UICore/classes/class.ilUIFramework.php b/components/ILIAS/UICore/classes/class.ilUIFramework.php deleted file mode 100755 index 4a498f4ebecc..000000000000 --- a/components/ILIAS/UICore/classes/class.ilUIFramework.php +++ /dev/null @@ -1,40 +0,0 @@ - - * @author Thibeau Fuhrer - */ -class ilUIFramework -{ - public const BOOTSTRAP_JS = "./assets/js/bootstrap.min.js"; - - public static function init(?ilGlobalTemplateInterface $template = null): void - { - global $DIC; - - $template = $template ?? $DIC->ui()->mainTemplate(); - $template->addJavaScript( - self::BOOTSTRAP_JS, - true, - 0 - ); - } -} From c5c95379de0d862bab6c46480ad367195f7b377a Mon Sep 17 00:00:00 2001 From: Matheus Zych <37047867+matheuszych@users.noreply.github.com> Date: Tue, 8 Apr 2025 10:56:36 +0200 Subject: [PATCH 016/125] T&A 44733: Fixes invalid data types in assFormulaQuestionResult::getReachedPoints method (#9308) * Fixes invalid data types in assFormulaQuestionResult::getReachedPoints method * Adds review changes * Adds further review changes --- .../classes/class.assFormulaQuestion.php | 16 +- .../class.assFormulaQuestionResult.php | 220 +++++++++--------- .../ilAssLacCompositeEvaluator.php | 17 +- .../tests/assFormulaQuestionTest.php | 1 + 4 files changed, 133 insertions(+), 121 deletions(-) diff --git a/components/ILIAS/TestQuestionPool/classes/class.assFormulaQuestion.php b/components/ILIAS/TestQuestionPool/classes/class.assFormulaQuestion.php index f15dd992390a..f85b3d4cf6b4 100755 --- a/components/ILIAS/TestQuestionPool/classes/class.assFormulaQuestion.php +++ b/components/ILIAS/TestQuestionPool/classes/class.assFormulaQuestion.php @@ -821,7 +821,9 @@ public function calculateReachedPoints( if (!array_key_exists($matches[1], $user_solution)) { $user_solution[$matches[1]] = []; } - $user_solution[$matches[1]]['unit'] = $solution_value['value2']; + $user_solution[$matches[1]]['unit'] = $this->unitrepository->getUnit( + $this->refinery->kindlyTo()->int()->transform($solution_value['value2']), + ); } } @@ -831,7 +833,7 @@ public function calculateReachedPoints( $this->getVariables(), $this->getResults(), $user_solution[$result->getResult()]['value'] ?? '', - $user_solution[$result->getResult()]['unit'] ?? '', + $user_solution[$result->getResult()]['unit'] ?? null, $this->unitrepository->getUnits() ); } @@ -845,14 +847,12 @@ public function calculateReachedPointsFromPreviewSession(ilAssQuestionPreviewSes $points = 0; foreach ($this->getResults() as $result) { - $v = isset($user_solution[$result->getResult()]) ? $user_solution[$result->getResult()] : null; - $u = isset($user_solution[$result->getResult() . '_unit']) ? $user_solution[$result->getResult() . '_unit'] : null; - + $unit_id = $user_solution[$result->getResult() . '_unit'] ?? null; $points += $result->getReachedPoints( $this->getVariables(), $this->getResults(), - $v, - $u, + $user_solution[$result->getResult()] ?? '', + $unit_id !== null ? $this->unitrepository->getUnit($unit_id) : null, $this->unitrepository->getUnits() ); } @@ -1114,7 +1114,7 @@ public function getBestSolution(array $solutions): array $check_unit = false; if (array_key_exists($result_name, $available_units) && $available_units[$result_name] !== null) { - $check_unit = in_array($user_solution[$result_name]['unit'], $available_units[$result_name]); + $check_unit = in_array($user_solution[$result_name]['unit'] ?? null, $available_units[$result_name]); } if ($check_unit == true) { diff --git a/components/ILIAS/TestQuestionPool/classes/class.assFormulaQuestionResult.php b/components/ILIAS/TestQuestionPool/classes/class.assFormulaQuestionResult.php index 4a6444d96a99..cf3fcb753456 100755 --- a/components/ILIAS/TestQuestionPool/classes/class.assFormulaQuestionResult.php +++ b/components/ILIAS/TestQuestionPool/classes/class.assFormulaQuestionResult.php @@ -16,6 +16,8 @@ * *********************************************************************/ +use ILIAS\Refinery\Factory as Refinery; + /** * Formula Question Result * @author Helmut Schottmüller @@ -30,6 +32,7 @@ class assFormulaQuestionResult public const RESULT_CO_FRAC = 3; private \ilGlobalTemplateInterface $main_tpl; + private Refinery $refinery; private $available_units = []; private ?float $range_min = null; @@ -52,6 +55,7 @@ public function __construct( ) { global $DIC; $this->main_tpl = $DIC->ui()->mainTemplate(); + $this->refinery = $DIC->refinery(); $this->setRangeMin($range_min_txt); $this->setRangeMax($range_max_txt); @@ -400,131 +404,131 @@ protected function isInTolerance($user_answer, $expected, $tolerated_percentage) && $user_answer <= $upper_boundary; } - protected function checkSign($v1, $v2): bool + private function checkSign(float $v1, float $v2): bool { - if ((($v1 >= 0) && ($v2 >= 0)) || (($v1 <= 0) && ($v2 <= 0))) { - return true; - } else { - return false; - } + return ($v1 >= 0.0 && $v2 >= 0.0) || ($v1 <= 0.0 && $v2 <= 0.0); } - public function getReachedPoints($variables, $results, $value, $unit, $units) - { + /** + * @param assFormulaQuestionUnit[] $units + */ + public function getReachedPoints( + array $variables, + array $results, + string $value, + ?assFormulaQuestionUnit $unit, + array $units + ): float { if ($this->getRatingSimple()) { - if ($this->isCorrect($variables, $results, $value, $units[$unit] ?? null)) { - return $this->getPoints(); - } else { - return 0; - } - } else { - $points = 0; - $formula = $this->substituteFormula($variables, $results); + return $this->isCorrect($variables, $results, $value, $unit) ? $this->getPoints() : 0; + } - if (preg_match_all("/(\\\$v\\d+)/ims", $formula, $matches)) { - foreach ($matches[1] as $variable) { - $varObj = $variables[$variable]; - if (!is_object($varObj)) { - continue; - } - if ($varObj->getUnit() != null) { - //convert unit and value to baseunit - if ($varObj->getUnit()->getBaseUnit() != -1) { - $tmp_value = $varObj->getValue() * $varObj->getUnit()->getFactor(); - } else { - $tmp_value = $varObj->getValue(); - } - } else { - $tmp_value = $varObj->getValue(); - } - $formula = preg_replace("/\\\$" . substr($variable, 1) . "(?![0-9]+)/", "(" . $tmp_value . ")" . "\\1", $formula); - } - } + $result = $this->calculateResult($variables, $results); - $math = new EvalMath(); - $math->suppress_errors = true; - $result = $math->evaluate($formula); + if ($unit instanceof assFormulaQuestionUnit) { + $value = $this->transformResultAccordingToType($value, $unit); + } - // result_type extension - switch ($this->getResultType()) { - case assFormulaQuestionResult::RESULT_DEC: - if ((substr_count($value, '.') == 1) || (substr_count($value, ',') == 1)) { - $exp_val = $value; - $frac_value = str_replace(',', '.', $exp_val); - } else { - $frac_value = $value; - } - $check_fraction = true; - break; - case assFormulaQuestionResult::RESULT_FRAC: - $exp_val = explode('/', $value); - if (count($exp_val) == 1) { - $frac_value = ilMath::_div($exp_val[0], 1, $this->getPrecision()); - if (ilMath::_equals(abs($frac_value), abs($result), $this->getPrecision())) { - $check_fraction = true; - } else { - $check_fraction = false; - } - } else { - $frac_value = ilMath::_div($exp_val[0], $exp_val[1], $this->getPrecision()); - if (ilMath::_equals(abs($frac_value), abs($result), $this->getPrecision())) { - $check_fraction = true; - } - } - break; - case assFormulaQuestionResult::RESULT_CO_FRAC: - $exp_val = explode('/', $value); - if (count($exp_val) == 1) { - $check_fraction = false; - } else { - $frac_value = ilMath::_div($exp_val[0], $exp_val[1], $this->getPrecision()); - if (self::isCoprimeFraction($exp_val[0], $exp_val[1])) { - $check_fraction = true; - } - } - break; - case assFormulaQuestionResult::RESULT_NO_SELECTION: - default: - $check_fraction = true; - break; - } + /** @var ?float $value */ + $float_value = $this->refinery->byTrying([ + $this->refinery->kindlyTo()->float(), + $this->refinery->always(null), + ])->transform($value); + $points = 0.0; - // result unit!! - if ($this->getUnit() !== null) { - // if expected resultunit != baseunit convert to resultunit - if ($this->getUnit()->getBaseUnit() != -1) { - $result = ilMath::_div($result, $this->getUnit()->getFactor(), $this->getPrecision()); - } else { - //if resultunit == baseunit calculate to get correct precision - $result = ilMath::_mul($result, $this->getUnit()->getFactor(), $this->getPrecision()); - } + if ($float_value !== null && $this->checkSign($result, $float_value)) { + $points += ilMath::_mul($this->getPoints(), ilMath::_div($this->getRatingSign(), 100)); + } + + if ($float_value !== null && $this->isInTolerance(abs($float_value), abs($result), $this->getTolerance())) { + $points += ilMath::_mul($this->getPoints(), ilMath::_div($this->getRatingValue(), 100)); + } + + if ($unit instanceof assFormulaQuestionUnit && $result_unit instanceof assFormulaQuestionUnit) { + $base1 = $units[$unit->getBaseUnit()] ?? null; + $base2 = $units[$result_unit->getBaseUnit()] ?? null; + if ( + $base1 instanceof assFormulaQuestionUnit + && $base2 instanceof assFormulaQuestionUnit + && $base1->getId() === $base2->getId() + ) { + return $points + ilMath::_mul($this->getPoints(), ilMath::_div($this->getRatingUnit(), 100)); } + } - if (is_object($unit)) { - if (isset($frac_value)) { - $value = ilMath::_mul($frac_value, $unit->getFactor(), 100); + return $points; + } + + private function calculateResult(array $variables, array $results): float + { + $formula = $this->substituteFormula($variables, $results); + + if (preg_match_all("/(\\\$v\\d+)/im", $formula, $matches)) { + foreach ($matches[1] as $variable) { + $varObj = $variables[$variable]; + if (!is_object($varObj)) { + continue; } - } - if ($this->checkSign($result, $value)) { - $points += ilMath::_mul($this->getPoints(), ilMath::_div($this->getRatingSign(), 100)); + //convert unit and value to baseunit + $has_base_unit = $varObj->getUnit() !== null && $varObj->getUnit()->getBaseUnit() !== -1; + $tmp_value = $varObj->getValue() * ($has_base_unit ? $varObj->getUnit()->getFactor() : 1); + $formula = preg_replace("/\\\$" . substr($variable, 1) . "(?![0-9]+)/", "(" . $tmp_value . ")" . "\\1", $formula); } + } - if ($this->isInTolerance(abs($value), abs($result), $this->getTolerance())) { - $points += ilMath::_mul($this->getPoints(), ilMath::_div($this->getRatingValue(), 100)); - } - if ($this->getUnit() !== null) { - $base1 = $units[$unit] ?? null; - if (is_object($base1)) { - $base1 = $units[$base1->getBaseUnit()]; + $eval_math = new EvalMath(); + $eval_math->suppress_errors = true; + $result = $eval_math->evaluate($formula); + + $result_unit = $this->getUnit(); + if ($result_unit instanceof assFormulaQuestionUnit) { + /** @var float $result */ + $result = $result_unit->getBaseUnit() !== -1 + ? ilMath::_div($result, $result_unit->getFactor(), $this->getPrecision()) + : ilMath::_mul($result, $result_unit->getFactor(), $this->getPrecision()); + } + + return $result; + } + + private function transformResultAccordingToType(string $value, assFormulaQuestionUnit $unit): ?float + { + $frac_value = null; + switch ($this->getResultType()) { + case self::RESULT_DEC: + if (substr_count($value, '.') === 1 || substr_count($value, ',') === 1) { + $exp_val = $value; + $frac_value = str_replace(',', '.', $exp_val); + } else { + $frac_value = $value; } - $base2 = $units[$this->getUnit()->getBaseUnit()]; - if (is_object($base1) && is_object($base2) && $base1->getId() == $base2->getId()) { - $points += ilMath::_mul($this->getPoints(), ilMath::_div($this->getRatingUnit(), 100)); + break; + case self::RESULT_FRAC: + $exp_val = explode('/', $value); + $frac_value = ilMath::_div( + $exp_val[0], + count($exp_val) === 1 ? 1 : $exp_val[1], + $this->getPrecision() + ); + break; + case self::RESULT_CO_FRAC: + $exp_val = explode('/', $value); + if (count($exp_val) > 1) { + $frac_value = ilMath::_div($exp_val[0], $exp_val[1], $this->getPrecision()); } - } - return $points; + break; + case self::RESULT_NO_SELECTION: + default: + break; } + + /** @var ?float $float_value */ + $float_value = $this->refinery->byTrying([ + $this->refinery->kindlyTo()->float(), + $this->refinery->always(null), + ])->transform($frac_value !== null ? ilMath::_mul($frac_value, $unit->getFactor(), 100) : $value); + return $float_value; } public function getResultInfo($variables, $results, $value, $unit, $units): array diff --git a/components/ILIAS/TestQuestionPool/classes/questions/LogicalAnswerCompare/ilAssLacCompositeEvaluator.php b/components/ILIAS/TestQuestionPool/classes/questions/LogicalAnswerCompare/ilAssLacCompositeEvaluator.php index d40c1b14c3ff..2083b8144dab 100755 --- a/components/ILIAS/TestQuestionPool/classes/questions/LogicalAnswerCompare/ilAssLacCompositeEvaluator.php +++ b/components/ILIAS/TestQuestionPool/classes/questions/LogicalAnswerCompare/ilAssLacCompositeEvaluator.php @@ -1,4 +1,5 @@ getSolutionForKey($index); $answer = $question->getAvailableAnswerOptions($index - 1); + $unit_repository = $question->getUnitrepository(); $unit = $solutions->getSolutionForKey($index . "_unit"); - $key = null; - if (is_array($unit)) { - $key = $unit['value']; - } + $key = isset($unit["value"]) + ? $unit_repository->getUnit((int) $unit["value"]) + : null; $max_points = $answer->getPoints(); // @PHP8-CR @@ -176,7 +177,13 @@ private function evaluateSubTree(ilAssLacAbstractComposite $composite): bool // to a later date and eventually task this to T&A TechSquad for analysis. // Candidate: //$points = $question->getReachedPoints($question->getVariables(), $question->getResults(), $result["value"], $key, $question->getUnitrepository()->getUnits()); - $points = $answer->getReachedPoints($question->getVariables(), $question->getResults(), $result["value"], $key, $question->getUnitrepository()->getUnits()); + $points = $answer->getReachedPoints( + $question->getVariables(), + $question->getResults(), + $result["value"] ?? "", + $key, + $unit_repository->getUnits() + ); $percentage = 0; if ($max_points != 0) { diff --git a/components/ILIAS/TestQuestionPool/tests/assFormulaQuestionTest.php b/components/ILIAS/TestQuestionPool/tests/assFormulaQuestionTest.php index 0a2cc2ab6c97..36f830e3a94f 100755 --- a/components/ILIAS/TestQuestionPool/tests/assFormulaQuestionTest.php +++ b/components/ILIAS/TestQuestionPool/tests/assFormulaQuestionTest.php @@ -17,6 +17,7 @@ *********************************************************************/ use ILIAS\DI\Container; +use ILIAS\Refinery\Factory; /** * Unit tests From 723a7c898c1bf809e80ccecde85fd2e5ee26d13e Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Tue, 8 Apr 2025 15:29:23 +0200 Subject: [PATCH 017/125] Test: More Fixes in Formula Questions See: https://mantis.ilias.de/view.php?id=44733 --- .../class.assFormulaQuestionResult.php | 123 +++++++----------- 1 file changed, 47 insertions(+), 76 deletions(-) diff --git a/components/ILIAS/TestQuestionPool/classes/class.assFormulaQuestionResult.php b/components/ILIAS/TestQuestionPool/classes/class.assFormulaQuestionResult.php index cf3fcb753456..d45c8f00d9c0 100755 --- a/components/ILIAS/TestQuestionPool/classes/class.assFormulaQuestionResult.php +++ b/components/ILIAS/TestQuestionPool/classes/class.assFormulaQuestionResult.php @@ -31,7 +31,7 @@ class assFormulaQuestionResult public const RESULT_FRAC = 2; public const RESULT_CO_FRAC = 3; - private \ilGlobalTemplateInterface $main_tpl; + private ilGlobalTemplateInterface $main_tpl; private Refinery $refinery; private $available_units = []; @@ -415,120 +415,91 @@ private function checkSign(float $v1, float $v2): bool public function getReachedPoints( array $variables, array $results, - string $value, - ?assFormulaQuestionUnit $unit, + string $answer_value, + ?assFormulaQuestionUnit $answer_unit, array $units ): float { if ($this->getRatingSimple()) { - return $this->isCorrect($variables, $results, $value, $unit) ? $this->getPoints() : 0; + return $this->isCorrect($variables, $results, $answer_value, $answer_unit) + ? $this->getPoints() + : 0.0; } - $result = $this->calculateResult($variables, $results); - - if ($unit instanceof assFormulaQuestionUnit) { - $value = $this->transformResultAccordingToType($value, $unit); - } + $result = $this->calculateCorrectResult($variables, $results); + $float_value = $this->transformAnswerValueAccordingToType($answer_value, $answer_unit); - /** @var ?float $value */ - $float_value = $this->refinery->byTrying([ - $this->refinery->kindlyTo()->float(), - $this->refinery->always(null), - ])->transform($value); $points = 0.0; - - if ($float_value !== null && $this->checkSign($result, $float_value)) { - $points += ilMath::_mul($this->getPoints(), ilMath::_div($this->getRatingSign(), 100)); - } - - if ($float_value !== null && $this->isInTolerance(abs($float_value), abs($result), $this->getTolerance())) { - $points += ilMath::_mul($this->getPoints(), ilMath::_div($this->getRatingValue(), 100)); - } - - if ($unit instanceof assFormulaQuestionUnit && $result_unit instanceof assFormulaQuestionUnit) { - $base1 = $units[$unit->getBaseUnit()] ?? null; - $base2 = $units[$result_unit->getBaseUnit()] ?? null; + if ($answer_unit instanceof assFormulaQuestionUnit && $answer_unit instanceof assFormulaQuestionUnit) { + $base1 = $units[$answer_unit->getBaseUnit()] ?? null; + $base2 = $units[$answer_unit->getBaseUnit()] ?? null; if ( $base1 instanceof assFormulaQuestionUnit && $base2 instanceof assFormulaQuestionUnit && $base1->getId() === $base2->getId() ) { - return $points + ilMath::_mul($this->getPoints(), ilMath::_div($this->getRatingUnit(), 100)); + $points += ilMath::_mul($this->getPoints(), ilMath::_div($this->getRatingUnit(), 100)); } } - return $points; - } - - private function calculateResult(array $variables, array $results): float - { - $formula = $this->substituteFormula($variables, $results); - - if (preg_match_all("/(\\\$v\\d+)/im", $formula, $matches)) { - foreach ($matches[1] as $variable) { - $varObj = $variables[$variable]; - if (!is_object($varObj)) { - continue; - } - - //convert unit and value to baseunit - $has_base_unit = $varObj->getUnit() !== null && $varObj->getUnit()->getBaseUnit() !== -1; - $tmp_value = $varObj->getValue() * ($has_base_unit ? $varObj->getUnit()->getFactor() : 1); - $formula = preg_replace("/\\\$" . substr($variable, 1) . "(?![0-9]+)/", "(" . $tmp_value . ")" . "\\1", $formula); - } + if ($float_value === null) { + return $points; } - $eval_math = new EvalMath(); - $eval_math->suppress_errors = true; - $result = $eval_math->evaluate($formula); + if ($this->checkSign($result, $float_value)) { + $points += ilMath::_mul($this->getPoints(), ilMath::_div($this->getRatingSign(), 100)); + } - $result_unit = $this->getUnit(); - if ($result_unit instanceof assFormulaQuestionUnit) { - /** @var float $result */ - $result = $result_unit->getBaseUnit() !== -1 - ? ilMath::_div($result, $result_unit->getFactor(), $this->getPrecision()) - : ilMath::_mul($result, $result_unit->getFactor(), $this->getPrecision()); + if ($this->isInTolerance(abs($float_value), abs($result), $this->getTolerance())) { + $points += ilMath::_mul($this->getPoints(), ilMath::_div($this->getRatingValue(), 100)); } - return $result; + return $points; } - private function transformResultAccordingToType(string $value, assFormulaQuestionUnit $unit): ?float + private function calculateCorrectResult(array $variables, array $results): float { - $frac_value = null; + return round( + $this->calculateFormula($variables, $results), + $this->precision + ); + } + + private function transformAnswerValueAccordingToType( + string $value, + ?assFormulaQuestionUnit $unit + ): ?float { switch ($this->getResultType()) { case self::RESULT_DEC: - if (substr_count($value, '.') === 1 || substr_count($value, ',') === 1) { - $exp_val = $value; - $frac_value = str_replace(',', '.', $exp_val); - } else { - $frac_value = $value; - } break; case self::RESULT_FRAC: + case self::RESULT_CO_FRAC: $exp_val = explode('/', $value); - $frac_value = ilMath::_div( + $value = ilMath::_div( $exp_val[0], count($exp_val) === 1 ? 1 : $exp_val[1], $this->getPrecision() ); break; - case self::RESULT_CO_FRAC: - $exp_val = explode('/', $value); - if (count($exp_val) > 1) { - $frac_value = ilMath::_div($exp_val[0], $exp_val[1], $this->getPrecision()); - } - break; case self::RESULT_NO_SELECTION: default: - break; + $exp_val = explode('/', $value); + + if (count($exp_val) === 2 + && (float) $exp_val[1] === 0.0) { + return null; + } + + $value = ilMath::_div( + $exp_val[0], + count($exp_val) === 1 ? 1 : $exp_val[1], + 100 + ); } - /** @var ?float $float_value */ - $float_value = $this->refinery->byTrying([ + return $this->refinery->byTrying([ $this->refinery->kindlyTo()->float(), $this->refinery->always(null), - ])->transform($frac_value !== null ? ilMath::_mul($frac_value, $unit->getFactor(), 100) : $value); - return $float_value; + ])->transform(round($value, $this->precision)); } public function getResultInfo($variables, $results, $value, $unit, $units): array From e5f03dc374a3c48dd0dc8f5ca8482a8635ea2337 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Tue, 8 Apr 2025 15:51:51 +0200 Subject: [PATCH 018/125] Test: Remove Unneeded Inclusions of Templates See: https://mantis.ilias.de/view.php?id=44807 --- .../TestQuestionPool/classes/class.assQuestionGUI.php | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/components/ILIAS/TestQuestionPool/classes/class.assQuestionGUI.php b/components/ILIAS/TestQuestionPool/classes/class.assQuestionGUI.php index bf5ad987bd27..02239a020c8f 100755 --- a/components/ILIAS/TestQuestionPool/classes/class.assQuestionGUI.php +++ b/components/ILIAS/TestQuestionPool/classes/class.assQuestionGUI.php @@ -610,17 +610,9 @@ public function getPresentationJavascripts(): array public function getQuestionTemplate(): void { - // @todo Björn: Maybe this has to be changed for PHP 7/ILIAS 5.2.x (ilObjTestGUI::executeCommand, switch -> default case -> $this->prepareOutput(); already added a template to the CONTENT variable wrapped in a block named content) - if (!$this->tpl->blockExists('content')) { - $this->tpl->addBlockFile("CONTENT", "content", "tpl.il_as_qpl_content.html", "components/ILIAS/TestQuestionPool"); - } - // @todo Björn: Maybe this has to be changed for PHP 7/ILIAS 5.2.x (ilObjTestGUI::executeCommand, switch -> default case -> $this->prepareOutput(); already added a template to the STATUSLINE variable wrapped in a block named statusline) - if (!$this->tpl->blockExists('statusline')) { - $this->tpl->addBlockFile("STATUSLINE", "statusline", "tpl.statusline.html"); - } // @todo Björn: Maybe this has to be changed for PHP 7/ILIAS 5.2.x because ass[XYZ]QuestionGUI::editQuestion is called multiple times if (!$this->tpl->blockExists('adm_content')) { - $this->tpl->addBlockFile("ADM_CONTENT", "adm_content", "tpl.il_as_question.html", "components/ILIAS/TestQuestionPool"); + $this->tpl->addBlockFile('ADM_CONTENT', 'adm_content', 'tpl.il_as_question.html', 'components/ILIAS/TestQuestionPool'); } } From b0451eebef43a4fa3eae8baead3bffa86934faef Mon Sep 17 00:00:00 2001 From: Fabian Schmid Date: Tue, 8 Apr 2025 16:03:51 +0200 Subject: [PATCH 019/125] [FIX] 0044810: Permanent Links --- components/ILIAS/StaticURL/src/Handler/HandlerService.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/ILIAS/StaticURL/src/Handler/HandlerService.php b/components/ILIAS/StaticURL/src/Handler/HandlerService.php index 5b4a9c32da32..12b08eeeb541 100755 --- a/components/ILIAS/StaticURL/src/Handler/HandlerService.php +++ b/components/ILIAS/StaticURL/src/Handler/HandlerService.php @@ -95,8 +95,8 @@ public function performRedirect(URI $base_uri): void $full_uri = $this->appendUnknownParameters($this->context, $full_uri); // Read the comment below } else { // Perform Redirect - $uri_path = $response->getURIPath(); - $base_path = $base_uri->getPath(); + $uri_path = $response->getURIPath() ?? ''; + $base_path = $base_uri->getPath() ?? ''; $uri_path = str_replace($base_path, '', $uri_path); $full_uri = $base_uri . '/' . trim((string) $uri_path, '/'); } From 2011183e8e23b8b37214d4bbc33e13c0867fea2d Mon Sep 17 00:00:00 2001 From: Fabian Helfer Date: Wed, 9 Apr 2025 09:36:11 +0200 Subject: [PATCH 020/125] Fix Error in Test Turkey languages (cherry picked from commit 0697ddfac9003838d72a5f9a3c9830a08a826c96) (cherry picked from commit 8e9e6a37f44b5c1e3489992a3bcd3e70d3becacc) --- lang/ilias_tr.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lang/ilias_tr.lang b/lang/ilias_tr.lang index 1319293cb243..ac50d56fce8c 100644 --- a/lang/ilias_tr.lang +++ b/lang/ilias_tr.lang @@ -1714,7 +1714,7 @@ assessment#:#tst_percent_solved#:#Çözme Yüzdesi assessment#:#tst_player_answer_saved_and_locked#:#Answer is saved and locked and can no longer be changed###26 08 2024 new variable assessment#:#tst_please_select_source_pool#:#Please select a question pool.###26 08 2024 new variable assessment#:#tst_please_select_target_for_pool_derives#:#Please select a target conatainer.###25 10 2016 new variable -assessment#:#tst_position#:#% S Soru% s +assessment#:#tst_position#:#%s Soru %s assessment#:#tst_position_without_total#:#Question %s###23 12 2015 new variable assessment#:#tst_postpone#:#Soruları Ertele assessment#:#tst_postpone_off#:#Not answered questions will not be postponed###30 08 2015 new variable From acfb7a1e595b9623cfaafa9fcc901c7881e752b1 Mon Sep 17 00:00:00 2001 From: qualitus-dahme Date: Wed, 9 Apr 2025 10:06:34 +0200 Subject: [PATCH 021/125] Scorm: Fix checking if two items are equal (PHP type issue) when cloning collections See: https://mantis.ilias.de/view.php?id=40551 --- .../classes/collection/class.ilLPCollectionOfSCOs.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/ILIAS/Tracking/classes/collection/class.ilLPCollectionOfSCOs.php b/components/ILIAS/Tracking/classes/collection/class.ilLPCollectionOfSCOs.php index 846afa5594ae..4b330a86e4a1 100755 --- a/components/ILIAS/Tracking/classes/collection/class.ilLPCollectionOfSCOs.php +++ b/components/ILIAS/Tracking/classes/collection/class.ilLPCollectionOfSCOs.php @@ -180,8 +180,8 @@ protected function itemsAreEqual(int $item_a_id, int $item_b_id): bool return ( $res_a && $res_b - && ($res_a['import_id'] == $res_b['import_id']) - && ($res_a['identifierref'] == $res_b['identifierref']) + && ($res_a['id'] == $res_b['id']) + && ($res_a['resourceid'] == $res_b['resourceid']) ); default: return false; From 6f885b70efb53279f1a8dabad3090fe3c8350fc9 Mon Sep 17 00:00:00 2001 From: qualitus-dahme Date: Wed, 9 Apr 2025 10:06:34 +0200 Subject: [PATCH 022/125] Scorm: Fix checking if two items are equal (PHP type issue) when cloning collections See: https://mantis.ilias.de/view.php?id=40551 --- .../classes/collection/class.ilLPCollectionOfSCOs.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/ILIAS/Tracking/classes/collection/class.ilLPCollectionOfSCOs.php b/components/ILIAS/Tracking/classes/collection/class.ilLPCollectionOfSCOs.php index 846afa5594ae..4b330a86e4a1 100755 --- a/components/ILIAS/Tracking/classes/collection/class.ilLPCollectionOfSCOs.php +++ b/components/ILIAS/Tracking/classes/collection/class.ilLPCollectionOfSCOs.php @@ -180,8 +180,8 @@ protected function itemsAreEqual(int $item_a_id, int $item_b_id): bool return ( $res_a && $res_b - && ($res_a['import_id'] == $res_b['import_id']) - && ($res_a['identifierref'] == $res_b['identifierref']) + && ($res_a['id'] == $res_b['id']) + && ($res_a['resourceid'] == $res_b['resourceid']) ); default: return false; From 55999e755364a08f655fe5ca92442380be422994 Mon Sep 17 00:00:00 2001 From: qualitus-dahme Date: Wed, 9 Apr 2025 10:12:19 +0200 Subject: [PATCH 023/125] Scorm: Fix writing learning progress (PHP type issue) See: https://mantis.ilias.de/view.php?id=44171 --- .../ILIAS/ScormAicc/classes/SCORM/class.ilObjSCORMTracking.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/ILIAS/ScormAicc/classes/SCORM/class.ilObjSCORMTracking.php b/components/ILIAS/ScormAicc/classes/SCORM/class.ilObjSCORMTracking.php index cccccc89114d..b69c65855337 100755 --- a/components/ILIAS/ScormAicc/classes/SCORM/class.ilObjSCORMTracking.php +++ b/components/ILIAS/ScormAicc/classes/SCORM/class.ilObjSCORMTracking.php @@ -221,7 +221,7 @@ public static function syncGlobalStatus(int $userId, int $packageId, int $refId, // update learning progress if ($new_global_status != null) { - ilLPStatus::writeStatus($packageId, $userId, $new_global_status, $data->percentageCompleted); + ilLPStatus::writeStatus($packageId, $userId, $new_global_status, (int) $data->percentageCompleted); // here put code for soap to MaxCMS e.g. when if($saved_global_status != $new_global_status) } From 25b2e5ace163dab5019db25983495b6f40d6e1b6 Mon Sep 17 00:00:00 2001 From: qualitus-dahme Date: Wed, 9 Apr 2025 10:12:19 +0200 Subject: [PATCH 024/125] Scorm: Fix writing learning progress (PHP type issue) See: https://mantis.ilias.de/view.php?id=44171 --- .../ILIAS/ScormAicc/classes/SCORM/class.ilObjSCORMTracking.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/ILIAS/ScormAicc/classes/SCORM/class.ilObjSCORMTracking.php b/components/ILIAS/ScormAicc/classes/SCORM/class.ilObjSCORMTracking.php index cccccc89114d..b69c65855337 100755 --- a/components/ILIAS/ScormAicc/classes/SCORM/class.ilObjSCORMTracking.php +++ b/components/ILIAS/ScormAicc/classes/SCORM/class.ilObjSCORMTracking.php @@ -221,7 +221,7 @@ public static function syncGlobalStatus(int $userId, int $packageId, int $refId, // update learning progress if ($new_global_status != null) { - ilLPStatus::writeStatus($packageId, $userId, $new_global_status, $data->percentageCompleted); + ilLPStatus::writeStatus($packageId, $userId, $new_global_status, (int) $data->percentageCompleted); // here put code for soap to MaxCMS e.g. when if($saved_global_status != $new_global_status) } From 4f751b8ce763895f06170ae9ba0d24fde820d466 Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Wed, 9 Apr 2025 10:24:24 +0200 Subject: [PATCH 025/125] Glossary: remove unneeded db columns for legacy public access downloads --- components/ILIAS/Glossary/ROADMAP.md | 8 ---- .../Setup/class.ilGlossaryDBUpdateSteps11.php | 42 +++++++++++++++++++ .../Setup/class.ilGlossarySetupAgent.php | 14 ++++++- 3 files changed, 54 insertions(+), 10 deletions(-) create mode 100755 components/ILIAS/Glossary/classes/Setup/class.ilGlossaryDBUpdateSteps11.php diff --git a/components/ILIAS/Glossary/ROADMAP.md b/components/ILIAS/Glossary/ROADMAP.md index fce7dc96ee12..dca010ac16b5 100755 --- a/components/ILIAS/Glossary/ROADMAP.md +++ b/components/ILIAS/Glossary/ROADMAP.md @@ -10,14 +10,6 @@ Up to ILIAS 8, it was possible to define LOM for glossary definitions. Since mul from ILIAS 9 onwards, LOM for definitions have also been abandoned (see Jour Fixe decision in FR). Now, there is "dead metadata" in the corresponding database tables, which should be deleted. -### Remove Public Access Exports From DB - -In the table `glossary`, the following columns can be removed: - -- `downloads_active` -- `public_xml_file` -- `public_html_file` - ## Mid Term ### Use central Online/Offline code diff --git a/components/ILIAS/Glossary/classes/Setup/class.ilGlossaryDBUpdateSteps11.php b/components/ILIAS/Glossary/classes/Setup/class.ilGlossaryDBUpdateSteps11.php new file mode 100755 index 000000000000..801a30324475 --- /dev/null +++ b/components/ILIAS/Glossary/classes/Setup/class.ilGlossaryDBUpdateSteps11.php @@ -0,0 +1,42 @@ +db = $db; + } + + public function step_1(): void + { + if ($this->db->tableColumnExists('glossary', 'downloads_active')) { + $this->db->dropTableColumn('glossary', 'downloads_active'); + } + if ($this->db->tableColumnExists('glossary', 'public_xml_file')) { + $this->db->dropTableColumn('glossary', 'public_xml_file'); + } + if ($this->db->tableColumnExists('glossary', 'public_html_file')) { + $this->db->dropTableColumn('glossary', 'public_html_file'); + } + } +} diff --git a/components/ILIAS/Glossary/classes/Setup/class.ilGlossarySetupAgent.php b/components/ILIAS/Glossary/classes/Setup/class.ilGlossarySetupAgent.php index 5f5d41a2737e..99081e1c3ceb 100755 --- a/components/ILIAS/Glossary/classes/Setup/class.ilGlossarySetupAgent.php +++ b/components/ILIAS/Glossary/classes/Setup/class.ilGlossarySetupAgent.php @@ -45,7 +45,12 @@ public function getInstallObjective(?Setup\Config $config = null): Setup\Objecti public function getUpdateObjective(?Setup\Config $config = null): Setup\Objective { - return new ilDatabaseUpdateStepsExecutedObjective(new ilGlossaryDBUpdateSteps()); + return new Setup\ObjectiveCollection( + 'Glossary', + false, + new ilDatabaseUpdateStepsExecutedObjective(new ilGlossaryDBUpdateSteps()), + new ilDatabaseUpdateStepsExecutedObjective(new ilGlossaryDBUpdateSteps11()) + ); } public function getBuildObjective(): Setup\Objective @@ -55,7 +60,12 @@ public function getBuildObjective(): Setup\Objective public function getStatusObjective(Setup\Metrics\Storage $storage): Setup\Objective { - return new ilDatabaseUpdateStepsMetricsCollectedObjective($storage, new ilGlossaryDBUpdateSteps()); + return new Setup\ObjectiveCollection( + 'Glossary', + true, + new ilDatabaseUpdateStepsMetricsCollectedObjective($storage, new ilGlossaryDBUpdateSteps()), + new ilDatabaseUpdateStepsMetricsCollectedObjective($storage, new ilGlossaryDBUpdateSteps11()), + ); } public function getMigrations(): array From 4f30a9acdf40edbd54893de9985e5fe2699a15ca Mon Sep 17 00:00:00 2001 From: Nils Haagen Date: Thu, 6 Mar 2025 08:51:18 +0100 Subject: [PATCH 026/125] PRG: 44477 (44216): get userfields during assignment --- .../model/Assignments/class.ilPRGAssignmentDBRepository.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/components/ILIAS/StudyProgramme/classes/model/Assignments/class.ilPRGAssignmentDBRepository.php b/components/ILIAS/StudyProgramme/classes/model/Assignments/class.ilPRGAssignmentDBRepository.php index 25172c61a473..7515e14f0eaa 100755 --- a/components/ILIAS/StudyProgramme/classes/model/Assignments/class.ilPRGAssignmentDBRepository.php +++ b/components/ILIAS/StudyProgramme/classes/model/Assignments/class.ilPRGAssignmentDBRepository.php @@ -105,7 +105,10 @@ public function createFor( $this->insertAssignmentRowDB($row); $this->progresses = []; - $user_data_fields = array_filter($this->user_data_fields, fn($f) => $f !== 'org_units'); + $user_data_fields = array_filter( + $this->user_data_fields, + static fn($field) => !str_starts_with($field, 'udf_') && $field !== 'org_units' + ); $query = 'SELECT ' . implode(',', $user_data_fields) . PHP_EOL . 'FROM usr_data WHERE usr_id = ' . $this->db->quote($usr_id, 'integer'); $res = $this->db->query($query); From e221ff2863372198700e77cf56bab8dcb9af3f6e Mon Sep 17 00:00:00 2001 From: Richard Klees Date: Thu, 10 Apr 2025 10:41:25 +0200 Subject: [PATCH 027/125] IAss: removed outdated migration --- .../Setup/class.IndAssStorageMigration.php | 115 ------------------ 1 file changed, 115 deletions(-) delete mode 100644 components/ILIAS/IndividualAssessment/classes/Setup/class.IndAssStorageMigration.php diff --git a/components/ILIAS/IndividualAssessment/classes/Setup/class.IndAssStorageMigration.php b/components/ILIAS/IndividualAssessment/classes/Setup/class.IndAssStorageMigration.php deleted file mode 100644 index 051a9058e71b..000000000000 --- a/components/ILIAS/IndividualAssessment/classes/Setup/class.IndAssStorageMigration.php +++ /dev/null @@ -1,115 +0,0 @@ -db = $environment->getResource(Setup\Environment::RESOURCE_DATABASE); - $settings_factory = $environment->getResource(Setup\Environment::RESOURCE_SETTINGS_FACTORY); - $client_ini = $environment->getResource(Setup\Environment::RESOURCE_CLIENT_INI); - - $DIC = $GLOBALS["DIC"]; - $GLOBALS["DIC"] = new ILIAS\DI\Container(); - $GLOBALS["DIC"]["ilDB"] = $this->db; - $GLOBALS["DIC"]["ilSetting"] = $settings_factory->settingsFor(); - $GLOBALS["DIC"]["ilClientIniFile"] = $client_ini; - - ILIAS\FileDelivery\Init::init($GLOBALS["DIC"]); - ilInitialisation::bootstrapFilesystems(); - - $this->dic = $GLOBALS["DIC"]; - $GLOBALS["DIC"] = $DIC; - - $stakeholder = new ilIndividualAssessmentGradingStakeholder(); - $this->helper = new \ilResourceStorageMigrationHelper( - $stakeholder, - $environment - ); - } - - /** - * @throws Exception - */ - public function step(Environment $environment): void - { - $GLOBALS["DIC"] = $this->dic; - - $query = "SELECT obj_id, usr_id, file_name FROM iass_members WHERE file_name LIKE '%.%' LIMIT 1;"; - $result = $this->db->query($query); - $row = $this->db->fetchAssoc($result); - - $obj_id = (int)$row['obj_id']; - $usr_id = (int)$row['usr_id']; - $fs_storage = ilIndividualAssessmentFileStorage::getInstance($obj_id); - $fs_storage->setUserId($usr_id); - $filepath = $fs_storage->getAbsolutePath() . '/' . $row['file_name']; - - $resource_id = $this->helper->movePathToStorage($filepath, 6); - if(! $resource_id) { - throw new \Exception('not stored:' . $filepath); - } - - $identifier = $resource_id->serialize(); - $query = "UPDATE iass_members SET file_name = '$identifier' WHERE obj_id = $obj_id AND usr_id = $usr_id"; - $this->db->manipulate($query); - } - - public function getRemainingAmountOfSteps(): int - { - $query = "SELECT COUNT(*) AS amount FROM iass_members WHERE file_name LIKE '%.%';"; - $result = $this->db->query($query); - $row = $this->db->fetchAssoc($result); - return (int) $row['amount']; - } -} From 8409fdefd1a221d744bf1ceadbe33980f2ce1d03 Mon Sep 17 00:00:00 2001 From: Alex Killing Date: Thu, 10 Apr 2025 12:21:08 +0200 Subject: [PATCH 028/125] Help: handle undefined array offsets. (#9328 --- components/ILIAS/Help/Map/MapDBRepository.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/components/ILIAS/Help/Map/MapDBRepository.php b/components/ILIAS/Help/Map/MapDBRepository.php index 8abd601d1cc2..55961727a29c 100755 --- a/components/ILIAS/Help/Map/MapDBRepository.php +++ b/components/ILIAS/Help/Map/MapDBRepository.php @@ -44,7 +44,7 @@ public function saveScreenIdsForChapter( $id[1] = "-"; } $id2 = explode("#", ($id[2] ?? "")); - if ($id2[0] == "") { + if (($id2[0] ?? "") == "") { $id2[0] = "-"; } if (($id2[1] ?? "") == "") { @@ -134,11 +134,11 @@ public function getChaptersForScreenId( $sc_id = explode("/", $a_screen_id); $chaps = array(); foreach ($module_ids as $module_id) { - if ($sc_id[0] != "") { - if ($sc_id[1] == "") { + if (($sc_id[0] ?? "") != "") { + if (($sc_id[1] ?? "") == "") { $sc_id[1] = "-"; } - if ($sc_id[2] == "") { + if (($sc_id[2] ?? "") == "") { $sc_id[2] = "-"; } $set = $this->db->query( From b21ca8c43674eefb8b4b056beba4abe018b66258 Mon Sep 17 00:00:00 2001 From: Thibeau Fuhrer Date: Thu, 10 Apr 2025 14:41:22 +0200 Subject: [PATCH 029/125] [FIX] Style: remove `GeSHi` usage and syntax-highlighting. (#9341) --- .../classes/Documentation/class.ilKSDocumentationEntryGUI.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/components/ILIAS/Style/System/classes/Documentation/class.ilKSDocumentationEntryGUI.php b/components/ILIAS/Style/System/classes/Documentation/class.ilKSDocumentationEntryGUI.php index 8c2bfb4f5662..1254b07118e3 100755 --- a/components/ILIAS/Style/System/classes/Documentation/class.ilKSDocumentationEntryGUI.php +++ b/components/ILIAS/Style/System/classes/Documentation/class.ilKSDocumentationEntryGUI.php @@ -117,9 +117,7 @@ public function createUIComponentOfEntry(): Report } $content_part_1 = $this->f->legacy()->content($example); $code = str_replace('" . $geshi->parse_code() . ''; + $code_html = "
" . htmlspecialchars($code) . '
'; $content_part_2 = $this->f->legacy()->content($code_html); $content = [$content_part_1, $content_part_2]; $sub_panels[] = $this->f->panel()->sub($title, $content); From bd5b87787cdb32723db358d95b22b027acc3d139 Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Thu, 10 Apr 2025 16:26:48 +0200 Subject: [PATCH 030/125] Course/Group/WebLink: abandon LOM in SOAP administration --- .../Course/classes/class.ilCourseExporter.php | 21 +- .../classes/class.ilCourseXMLParser.php | 92 +++---- .../classes/class.ilCourseXMLWriter.php | 25 +- .../Course/classes/class.ilObjCourse.php | 67 +++-- .../xml/SchemaValidation/ilias_crs_11_0.xsd | 211 ++++++++++++++++ .../xml/SchemaValidation/ilias_grp_11_0.xsd | 203 +++++++++++++++ .../SchemaValidation/ilias_ws_crs_11_0.xsd | 231 ++++++++++++++++++ .../SchemaValidation/ilias_ws_grp_11_0.xsd | 209 ++++++++++++++++ .../Group/classes/class.ilGroupExporter.php | 24 +- .../Group/classes/class.ilGroupXMLParser.php | 82 ++----- .../Group/classes/class.ilGroupXMLWriter.php | 24 +- .../classes/class.ilObjLinkResource.php | 17 +- .../classes/class.ilWebLinkXmlParser.php | 68 ++---- .../classes/class.ilWebLinkXmlWriter.php | 6 +- .../classes/class.ilWebResourceExporter.php | 4 +- .../classes/class.ilWebResourceImporter.php | 4 +- ...lass.ilNusoapUserAdministrationAdapter.php | 4 +- .../class.ilSoapCourseAdministration.php | 16 +- .../class.ilSoapWebLinkAdministration.php | 2 +- 19 files changed, 1010 insertions(+), 300 deletions(-) create mode 100644 components/ILIAS/Export/xml/SchemaValidation/ilias_crs_11_0.xsd create mode 100755 components/ILIAS/Export/xml/SchemaValidation/ilias_grp_11_0.xsd create mode 100755 components/ILIAS/Export/xml/SchemaValidation/ilias_ws_crs_11_0.xsd create mode 100755 components/ILIAS/Export/xml/SchemaValidation/ilias_ws_grp_11_0.xsd diff --git a/components/ILIAS/Course/classes/class.ilCourseExporter.php b/components/ILIAS/Course/classes/class.ilCourseExporter.php index c1353d5cf2ae..b1b67514bf90 100755 --- a/components/ILIAS/Course/classes/class.ilCourseExporter.php +++ b/components/ILIAS/Course/classes/class.ilCourseExporter.php @@ -17,15 +17,15 @@ *********************************************************************/ declare(strict_types=0); + /** * Folder export * @author Stefan Meyer - * @ingroup ServicesBooking */ class ilCourseExporter extends ilXmlExporter { - public const ENTITY_OBJECTIVE = 'objectives'; - public const ENTITY_MAIN = 'crs'; + public const string ENTITY_OBJECTIVE = 'objectives'; + public const string ENTITY_MAIN = 'crs'; protected ilXmlWriter $writer; protected ilLogger $logger; @@ -178,19 +178,26 @@ public function getXmlRepresentation(string $a_entity, string $a_schema_version, public function getValidSchemaVersions(string $a_entity): array { return [ + "11.0" => [ + "namespace" => 'http://www.ilias.de/Modules/Course/crs/11', + "xsd_file" => 'ilias_crs_11_0.xsd', + "uses_dataset" => false, + "min" => "11.0", + "max" => "" + ], "10.0" => [ "namespace" => 'http://www.ilias.de/Modules/Course/crs/10', - "xsd_file" => 'ilias_crs_10.xsd', + "xsd_file" => 'ilias_crs_10_0.xsd', "uses_dataset" => false, "min" => "10.0", - "max" => "" + "max" => "10.999" ], "9.0" => [ "namespace" => 'http://www.ilias.de/Modules/Course/crs/9', "xsd_file" => 'ilias_crs_9_0.xsd', "uses_dataset" => false, "min" => "9.0", - "max" => "" + "max" => "9.999" ], "4.1.0" => [ "namespace" => "http://www.ilias.de/Modules/Course/crs/4_1", @@ -204,7 +211,7 @@ public function getValidSchemaVersions(string $a_entity): array "xsd_file" => "ilias_crs_5_0.xsd", "uses_dataset" => false, "min" => "5.0.0", - "max" => "" + "max" => "8.999" ] ]; } diff --git a/components/ILIAS/Course/classes/class.ilCourseXMLParser.php b/components/ILIAS/Course/classes/class.ilCourseXMLParser.php index 89f55dc4e4da..369bca67e41b 100755 --- a/components/ILIAS/Course/classes/class.ilCourseXMLParser.php +++ b/components/ILIAS/Course/classes/class.ilCourseXMLParser.php @@ -17,20 +17,18 @@ *********************************************************************/ declare(strict_types=0); + /** * Course XML Parser * @author Stefan Meyer - * @version $Id$ - * @extends ilMDSaxParser */ -class ilCourseXMLParser extends ilMDSaxParser implements ilSaxSubsetParser +class ilCourseXMLParser extends ilSaxParser implements ilSaxSubsetParser { - public const MODE_SOAP = 1; - public const MODE_EXPORT = 2; + public const int MODE_SOAP = 1; + public const int MODE_EXPORT = 2; private int $mode = self::MODE_EXPORT; - private bool $in_meta_data = false; private bool $in_availability = false; private bool $in_registration = false; private bool $in_period = false; @@ -45,10 +43,6 @@ class ilCourseXMLParser extends ilMDSaxParser implements ilSaxSubsetParser private ?ilObjCourse $course_obj; private ?ilLogger $log; protected ilSetting $setting; - /** - * @var false - */ - protected ?ilMD $md_obj = null; protected ilSaxController $sax_controller; protected ilCourseParticipants $course_members; protected ilCourseWaitingList $course_waiting_list; @@ -68,9 +62,6 @@ public function __construct(ilObjCourse $a_course_obj, string $a_xml_file = '') $this->course_waiting_list = new ilCourseWaitingList($this->course_obj->getId()); // flip the array so we can use array_key_exists $this->course_members_array = array_flip($this->course_members->getParticipants()); - - $this->md_obj = new ilMD($this->course_obj->getId(), 0, 'crs'); - $this->setMDObject($this->md_obj); } public function setMode(int $a_mode): void @@ -83,23 +74,6 @@ public function getMode(): int return $this->mode; } - public function startParsing(): void - { - parent::startParsing(); - - // rewrite autogenerated entry - $general = $this->getMDObject()->getGeneral(); - $identifier_ids = $general->getIdentifierIds(); - if (!isset($identifier_ids[0])) { - return; - } - $identifier = $general->getIdentifier($identifier_ids[0]); - $identifier->setEntry( - 'il__' . $this->getMDObject()->getObjType() . '_' . $this->getMDObject()->getObjId() - ); - $identifier->update(); - } - /** * @inheritDoc */ @@ -119,10 +93,6 @@ public function setHandlers($a_xml_parser): void public function handlerBeginTag($a_xml_parser, string $a_name, array $a_attribs): void { $a_attribs = $this->trimAndStripAttribs($a_attribs); - if ($this->in_meta_data) { - parent::handlerBeginTag($a_xml_parser, $a_name, $a_attribs); - return; - } switch ($a_name) { case 'Course': @@ -275,11 +245,6 @@ public function handlerBeginTag($a_xml_parser, string $a_name, array $a_attribs) $this->course_obj->setSubscriptionLimitationType(ilCourseConstants::IL_CRS_SUBSCRIPTION_DEACTIVATED); break; - case "MetaData": - $this->in_meta_data = true; - parent::handlerBeginTag($a_xml_parser, $a_name, $a_attribs); - break; - case 'ContainerSetting': $this->current_container_setting = ($a_attribs['id'] ?? ''); break; @@ -508,24 +473,14 @@ private function handleWaitingList(array $a_attribs, array $id_data): void */ public function handlerEndTag($a_xml_parser, string $a_name): void { - $this->cdata = $this->trimAndStrip((string) $this->cdata); - if ($this->in_meta_data) { - parent::handlerEndTag($a_xml_parser, $a_name); - } + $this->cdata = $this->trimAndStrip($this->cdata); switch ($a_name) { case 'Course': $this->log->write('CourseXMLParser: import_id = ' . $this->course_obj->getImportId()); - /* - * This needs to be before MDUpdateListener, since otherwise container settings are - * overwritten by ilContainer::update in MDUpdateListener, see #24733. - */ + $this->course_obj->readContainerSettings(); - if ($this->getMode() === self::MODE_SOAP) { - $this->course_obj->MDUpdateListener('General'); - $this->adv_md_handler->save(); - } // see #26169 $transl = ilObjectTranslation::getInstance($this->course_obj->getId()); if ($transl->getDefaultTitle() !== "") { @@ -537,6 +492,18 @@ public function handlerEndTag($a_xml_parser, string $a_name): void $this->course_obj->update(); break; + case "Title": + $transl = ilObjectTranslation::getInstance($this->course_obj->getId()); + $this->course_obj->setTitle(trim($this->cdata)); + $transl->setDefaultTitle(trim($this->cdata)); + break; + + case "Description": + $transl = ilObjectTranslation::getInstance($this->course_obj->getId()); + $this->course_obj->setDescription(trim($this->cdata)); + $transl->setDefaultDescription(trim($this->cdata)); + break; + case 'Settings': break; @@ -624,11 +591,6 @@ public function handlerEndTag($a_xml_parser, string $a_name): void $this->course_obj->setSubscriptionPassword(trim($this->cdata)); break; - case 'MetaData': - $this->in_meta_data = false; - parent::handlerEndTag($a_xml_parser, $a_name); - break; - case 'ContainerSetting': if ($this->current_container_setting) { ilContainer::_writeContainerSetting( @@ -683,10 +645,6 @@ public function handlerEndTag($a_xml_parser, string $a_name): void public function handlerCharacterData($a_xml_parser, string $a_data): void { - // call meta data handler - if ($this->in_meta_data) { - parent::handlerCharacterData($a_xml_parser, $a_data); - } if ($a_data != "\n") { // Replace multiple tabs with one space $a_data = preg_replace("/\t+/", " ", $a_data); @@ -694,4 +652,18 @@ public function handlerCharacterData($a_xml_parser, string $a_data): void $this->cdata .= $a_data; } } + + protected function trimAndStripAttribs(array $attribs): array + { + $ret = []; + foreach ($attribs as $k => $v) { + $ret[$k] = $this->trimAndStrip((string) $v); + } + return $ret; + } + + protected function trimAndStrip(string $input): string + { + return ilUtil::stripSlashes(trim($input)); + } } diff --git a/components/ILIAS/Course/classes/class.ilCourseXMLWriter.php b/components/ILIAS/Course/classes/class.ilCourseXMLWriter.php index a69245a1a176..d8a715295b82 100755 --- a/components/ILIAS/Course/classes/class.ilCourseXMLWriter.php +++ b/components/ILIAS/Course/classes/class.ilCourseXMLWriter.php @@ -26,14 +26,13 @@ * The author is responsible for well-formedness and validity * of the xml document. * @author Stefan Meyer - * @version $Id$ */ class ilCourseXMLWriter extends ilXmlWriter { - public const MODE_SOAP = 1; - public const MODE_EXPORT = 2; + public const int MODE_SOAP = 1; + public const int MODE_EXPORT = 2; - public const EXPORT_VERSION = '8.0'; + public const string EXPORT_VERSION = '8.0'; private int $mode = self::MODE_SOAP; @@ -70,8 +69,8 @@ public function start(): void if ($this->getMode() == self::MODE_SOAP) { $this->__buildHeader(); $this->__buildCourseStart(); - $this->__buildMetaData(); $this->__buildAdvancedMetaData(); + $this->__buildTitleDescription(); if ($this->attach_users) { $this->__buildAdmin(); $this->__buildTutor(); @@ -114,6 +113,15 @@ public function __buildHeader(): void $this->xmlHeader(); } + public function __buildTitleDescription(): void + { + $this->xmlElement('Title', null, $this->course_obj->getTitle()); + + if ($desc = $this->course_obj->getDescription()) { + $this->xmlElement('Description', null, $desc); + } + } + public function __buildCourseStart(): void { $attrs["exportVersion"] = self::EXPORT_VERSION; @@ -122,13 +130,6 @@ public function __buildCourseStart(): void $this->xmlStartTag("Course", $attrs); } - public function __buildMetaData(): void - { - $md2xml = new ilMD2XML($this->course_obj->getId(), $this->course_obj->getId(), 'crs'); - $md2xml->startExport(); - $this->appendXML($md2xml->getXML()); - } - private function __buildAdvancedMetaData(): void { ilAdvancedMDValues::_appendXMLByObjId($this, $this->course_obj->getId()); diff --git a/components/ILIAS/Course/classes/class.ilObjCourse.php b/components/ILIAS/Course/classes/class.ilObjCourse.php index 48cefd180192..da76ef667f3c 100755 --- a/components/ILIAS/Course/classes/class.ilObjCourse.php +++ b/components/ILIAS/Course/classes/class.ilObjCourse.php @@ -22,17 +22,17 @@ */ class ilObjCourse extends ilContainer implements ilMembershipRegistrationCodes { - public const CAL_REG_START = 1; - public const CAL_REG_END = 2; - public const CAL_ACTIVATION_START = 3; - public const CAL_ACTIVATION_END = 4; - public const CAL_COURSE_START = 5; - public const CAL_COURSE_END = 6; - public const CAL_COURSE_TIMING_START = 7; - public const CAL_COURSE_TIMING_END = 8; - - public const STATUS_DETERMINATION_LP = 1; - public const STATUS_DETERMINATION_MANUAL = 2; + public const int CAL_REG_START = 1; + public const int CAL_REG_END = 2; + public const int CAL_ACTIVATION_START = 3; + public const int CAL_ACTIVATION_END = 4; + public const int CAL_COURSE_START = 5; + public const int CAL_COURSE_END = 6; + public const int CAL_COURSE_TIMING_START = 7; + public const int CAL_COURSE_TIMING_END = 8; + + public const int STATUS_DETERMINATION_LP = 1; + public const int STATUS_DETERMINATION_MANUAL = 2; private string $contact_consultation = ''; private string $contact_phone = ''; @@ -578,17 +578,15 @@ public function read(): void $this->__readSettings(); } - public function create($a_upload = false): int + public function create(): int { global $DIC; $ilAppEventHandler = $DIC['ilAppEventHandler']; - $id = parent::create($a_upload); + $id = parent::create(); - if (!$a_upload) { - $this->createMetaData(); - } + $this->createMetaData(); $this->__createDefaultSettings(); $this->app_event_handler->raise( 'components/ILIAS/Course', @@ -730,17 +728,12 @@ public function hasWaitingListAutoFill(): bool /** * Clone course (no member data) - * - * @access public - * @param int target ref_id - * @param int copy id - * */ - public function cloneObject(int $a_target_id, int $a_copy_id = 0, bool $a_omit_tree = false): ?ilObject + public function cloneObject(int $target_id, int $copy_id = 0, bool $omit_tree = false): ?ilObject { global $DIC; - $new_obj = parent::cloneObject($a_target_id, $a_copy_id, $a_omit_tree); + $new_obj = parent::cloneObject($target_id, $copy_id, $omit_tree); $this->cloneAutoGeneratedRoles($new_obj); $this->cloneMetaData($new_obj); @@ -748,7 +741,7 @@ public function cloneObject(int $a_target_id, int $a_copy_id = 0, bool $a_omit_t $new_obj->getMemberObject()->add($this->user->getId(), ilParticipants::IL_CRS_ADMIN); $new_obj->getMemberObject()->updateContact($this->user->getId(), 1); - $cwo = ilCopyWizardOptions::_getInstance($a_copy_id); + $cwo = ilCopyWizardOptions::_getInstance($copy_id); if ($cwo->isRootNode($this->getRefId())) { $this->setOfflineStatus(true); } @@ -784,29 +777,29 @@ public function cloneObject(int $a_target_id, int $a_copy_id = 0, bool $a_omit_t /** * @inheritDoc */ - public function cloneDependencies(int $a_target_id, int $a_copy_id): bool + public function cloneDependencies(int $target_id, int $copy_id): bool { - parent::cloneDependencies($a_target_id, $a_copy_id); + parent::cloneDependencies($target_id, $copy_id); // Clone course start objects $start = new ilContainerStartObjects($this->getRefId(), $this->getId()); - $start->cloneDependencies($a_target_id, $a_copy_id); + $start->cloneDependencies($target_id, $copy_id); // Clone course item settings - ilObjectActivation::cloneDependencies($this->getRefId(), $a_target_id, $a_copy_id); + ilObjectActivation::cloneDependencies($this->getRefId(), $target_id, $copy_id); // clone objective settings - ilLOSettings::cloneSettings($a_copy_id, $this->getId(), ilObject::_lookupObjId($a_target_id)); + ilLOSettings::cloneSettings($copy_id, $this->getId(), ilObject::_lookupObjId($target_id)); // Clone course learning objectives $crs_objective = new ilCourseObjective($this); - $crs_objective->ilClone($a_target_id, $a_copy_id); + $crs_objective->ilClone($target_id, $copy_id); // clone membership limitation foreach (\ilObjCourseGrouping::_getGroupings($this->getId()) as $grouping_id) { $this->course_logger->info('Handling grouping id: ' . $grouping_id); $grouping = new \ilObjCourseGrouping($grouping_id); - $grouping->cloneGrouping($a_target_id, $a_copy_id); + $grouping->cloneGrouping($target_id, $copy_id); } return true; } @@ -900,9 +893,7 @@ public function hasContactData(): bool /** * delete course and all related data - * - * @access public - * @return boolean true if all object data were removed; false if only a references were removed + * return true if all object data were removed; false if only a references were removed */ public function delete(): bool { @@ -1029,7 +1020,7 @@ public function updateSettings(): void 'integer' ) . ', ' . 'min_members = ' . $this->db->quote($this->getSubscriptionMinMembers(), 'integer') . ' ' . - "WHERE obj_id = " . $this->db->quote($this->getId(), 'integer') . ""; + "WHERE obj_id = " . $this->db->quote($this->getId(), 'integer'); $res = $this->db->manipulate($query); @@ -1302,9 +1293,9 @@ public function initDefaultRoles(): void * Each permission is granted by computing the intersection of the * template il_crs_non_member and the permission template of the parent role. */ - public function setParentRolePermissions(int $a_parent_ref): bool + public function setParentRolePermissions(int $parent_ref_id): bool { - $parent_roles = $this->rbac_review->getParentRoleIds($a_parent_ref); + $parent_roles = $this->rbac_review->getParentRoleIds($parent_ref_id); foreach ($parent_roles as $parent_role) { $this->rbac_admin->initIntersectionPermissions( $this->getRefId(), @@ -1353,7 +1344,7 @@ public function getLocalCourseRoles($a_translate = false): array $role_arr = $this->rbac_review->getRolesOfRoleFolder($this->getRefId()); foreach ($role_arr as $role_id) { - if ($this->rbac_review->isAssignable($role_id, $this->getRefId()) == true) { + if ($this->rbac_review->isAssignable($role_id, $this->getRefId())) { $role_Obj = ilObjectFactory::getInstanceByObjId($role_id); if ($a_translate) { $role_name = ilObjRole::_getTranslation($role_Obj->getTitle()); diff --git a/components/ILIAS/Export/xml/SchemaValidation/ilias_crs_11_0.xsd b/components/ILIAS/Export/xml/SchemaValidation/ilias_crs_11_0.xsd new file mode 100644 index 000000000000..8e6a17884708 --- /dev/null +++ b/components/ILIAS/Export/xml/SchemaValidation/ilias_crs_11_0.xsd @@ -0,0 +1,211 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/components/ILIAS/Export/xml/SchemaValidation/ilias_grp_11_0.xsd b/components/ILIAS/Export/xml/SchemaValidation/ilias_grp_11_0.xsd new file mode 100755 index 000000000000..6c4a9a98664e --- /dev/null +++ b/components/ILIAS/Export/xml/SchemaValidation/ilias_grp_11_0.xsd @@ -0,0 +1,203 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/components/ILIAS/Export/xml/SchemaValidation/ilias_ws_crs_11_0.xsd b/components/ILIAS/Export/xml/SchemaValidation/ilias_ws_crs_11_0.xsd new file mode 100755 index 000000000000..fb932d8455ac --- /dev/null +++ b/components/ILIAS/Export/xml/SchemaValidation/ilias_ws_crs_11_0.xsd @@ -0,0 +1,231 @@ + + + + ]> + + + + + + + &AdvancedMetadata; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/components/ILIAS/Export/xml/SchemaValidation/ilias_ws_grp_11_0.xsd b/components/ILIAS/Export/xml/SchemaValidation/ilias_ws_grp_11_0.xsd new file mode 100755 index 000000000000..f6e2ada345ea --- /dev/null +++ b/components/ILIAS/Export/xml/SchemaValidation/ilias_ws_grp_11_0.xsd @@ -0,0 +1,209 @@ + + + + ]> + + + + + + + + &AdvancedMetaData; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/components/ILIAS/Group/classes/class.ilGroupExporter.php b/components/ILIAS/Group/classes/class.ilGroupExporter.php index aca43ad7e39f..8f5eb90e6ce4 100755 --- a/components/ILIAS/Group/classes/class.ilGroupExporter.php +++ b/components/ILIAS/Group/classes/class.ilGroupExporter.php @@ -17,14 +17,9 @@ *********************************************************************/ declare(strict_types=1); + /** -* Folder export -* * @author Stefan Meyer -* -* @version $Id$ -* -* @ingroup ServicesBooking */ class ilGroupExporter extends ilXmlExporter { @@ -59,7 +54,7 @@ public function getXmlExportHeadDependencies(string $a_entity, string $a_target_ ); } - public function getXmlExportTailDependencies(string $a_entity, string $a_target_release, array $a_ids) : array + public function getXmlExportTailDependencies(string $a_entity, string $a_target_release, array $a_ids): array { $deps = []; $advmd_ids = []; @@ -135,19 +130,22 @@ protected function getActiveAdvMDRecords(int $a_id): array return $active; } - - /** - * @inheritDoc - */ public function getValidSchemaVersions(string $a_entity): array { return [ + "11.0" => [ + "namespace" => 'http://www.ilias.de/Modules/Group/grp/11', + "xsd_file" => 'ilias_grp_11_0.xsd', + "uses_dataset" => false, + "min" => "11.0", + "max" => "" + ], "9.0" => [ "namespace" => 'http://www.ilias.de/Modules/Group/grp/9', "xsd_file" => 'ilias_grp_9_0.xsd', "uses_dataset" => false, "min" => "9.0", - "max" => "9.99" + "max" => "10.99" ], "4.1.0" => [ "namespace" => "http://www.ilias.de/Modules/Group/grp/4_1", @@ -161,7 +159,7 @@ public function getValidSchemaVersions(string $a_entity): array "xsd_file" => "ilias_grp_5_0.xsd", "uses_dataset" => false, "min" => "5.0.0", - "max" => "" + "max" => "5.9.999" ] ]; } diff --git a/components/ILIAS/Group/classes/class.ilGroupXMLParser.php b/components/ILIAS/Group/classes/class.ilGroupXMLParser.php index d94eaf59a541..00e2e534e403 100755 --- a/components/ILIAS/Group/classes/class.ilGroupXMLParser.php +++ b/components/ILIAS/Group/classes/class.ilGroupXMLParser.php @@ -22,9 +22,8 @@ * Group Import Parser * * @author Stefan Meyer - * @version $Id: class.ilGroupXMLParser.php 15678 2008-01-06 20:40:55Z akill $ */ -class ilGroupXMLParser extends ilMDSaxParser implements ilSaxSubsetParser +class ilGroupXMLParser extends ilSaxParser implements ilSaxSubsetParser { public static int $CREATE = 1; public static int $UPDATE = 2; @@ -40,12 +39,6 @@ class ilGroupXMLParser extends ilMDSaxParser implements ilSaxSubsetParser protected ilRbacReview $rbacreview; protected ilSetting $settings; - - /** - * @var bool - */ - private bool $lom_parsing_active = false; - protected ?ilSaxController $sax_controller; protected ?ilAdvancedMDValueParser $advanced_md_value_parser = null; @@ -80,15 +73,6 @@ public function __construct(ilObjGroup $group, string $a_xml, int $a_parent_id) $this->log = $DIC->logger()->grp(); $this->setXMLContent($a_xml); - // init md parsing - $this->setMDObject( - new ilMD( - $this->group_obj->getId(), - $this->group_obj->getId(), - $this->group_obj->getType() - ) - ); - // SET MEMBER VARIABLES $this->pushParentId($a_parent_id); } @@ -141,18 +125,6 @@ public function startParsing(): void $status = is_object($this->group_obj) ? $this->group_obj->update() : false; } $this->after_parsing_status = $status; - - // rewrite autogenerated MD entry - $general = $this->getMDObject()->getGeneral(); - $identifier_ids = $general->getIdentifierIds(); - if (!isset($identifier_ids[0])) { - return; - } - $identifier = $general->getIdentifier($identifier_ids[0]); - $identifier->setEntry( - 'il__' . $this->getMDObject()->getObjType() . '_' . $this->getMDObject()->getObjId() - ); - $identifier->update(); } public function getObjectRefId() @@ -173,19 +145,7 @@ public function handlerBeginTag($a_xml_parser, string $a_name, array $a_attribs) $ilErr = $DIC['ilErr']; - if ($this->lom_parsing_active) { - parent::handlerBeginTag($a_xml_parser, $a_name, $a_attribs); - return; - } - switch ($a_name) { - case "MetaData": - $this->lom_parsing_active = true; - parent::handlerBeginTag($a_xml_parser, $a_name, $a_attribs); - break; - - - // GROUP DATA case "group": $this->group_data["admin"] = array(); $this->group_data["member"] = array(); @@ -288,19 +248,9 @@ public function handlerBeginTag($a_xml_parser, string $a_name, array $a_attribs) public function handlerEndTag($a_xml_parser, string $a_name): void { - $this->cdata = $this->trimAndStrip((string) $this->cdata); - - if ($this->lom_parsing_active) { - parent::handlerEndTag($a_xml_parser, $a_name); - } + $this->cdata = $this->trimAndStrip($this->cdata); switch ($a_name) { - case 'MetaData': - $this->lom_parsing_active = false; - parent::handlerEndTag($a_xml_parser, $a_name); - break; - - case "title": $this->group_data["title"] = trim($this->cdata); break; @@ -402,17 +352,13 @@ public function handlerEndTag($a_xml_parser, string $a_name): void /** * @inheritDoc */ - public function handlerCharacterData($a_xml_parser, string $a_data): void + public function handlerCharacterData($a_xml_parser, string $a_name): void { - if ($this->lom_parsing_active) { - parent::handlerCharacterData($a_xml_parser, $a_data); - } - - $a_data = str_replace("<", "<", $a_data); - $a_data = str_replace(">", ">", $a_data); + $a_name = str_replace("<", "<", $a_name); + $a_name = str_replace(">", ">", $a_name); - if (!empty($a_data)) { - $this->cdata .= $a_data; + if (!empty($a_name)) { + $this->cdata .= $a_name; } } @@ -679,4 +625,18 @@ public function initContainerSorting(array $a_attribs, int $a_group_id): void { ilContainerSortingSettings::_importContainerSortingSettings($a_attribs, $a_group_id); } + + protected function trimAndStripAttribs(array $attribs): array + { + $ret = []; + foreach ($attribs as $k => $v) { + $ret[$k] = $this->trimAndStrip((string) $v); + } + return $ret; + } + + protected function trimAndStrip(string $input): string + { + return ilUtil::stripSlashes(trim($input)); + } } diff --git a/components/ILIAS/Group/classes/class.ilGroupXMLWriter.php b/components/ILIAS/Group/classes/class.ilGroupXMLWriter.php index b99af4fc4eef..c057a72dbc17 100755 --- a/components/ILIAS/Group/classes/class.ilGroupXMLWriter.php +++ b/components/ILIAS/Group/classes/class.ilGroupXMLWriter.php @@ -19,18 +19,13 @@ declare(strict_types=1); /** -* XML writer class -* -* Class for writing xml export versions of courses -* * @author Stefan Meyer -* @version $Id: class.ilGroupXMLWriter.php 16108 2008-02-28 17:36:41Z rkuester $ */ class ilGroupXMLWriter extends ilXmlWriter { - public const MODE_SOAP = 1; - public const MODE_EXPORT = 2; - public const EXPORT_VERSION = 3; + public const int MODE_SOAP = 1; + public const int MODE_EXPORT = 2; + public const int EXPORT_VERSION = 3; private int $mode = self::MODE_SOAP; @@ -70,7 +65,6 @@ public function start(): void $this->logger->debug('Using soap mode'); $this->__buildHeader(); $this->__buildGroup(); - $this->__buildMetaData(); $this->__buildAdvancedMetaData(); $this->__buildTitleDescription(); $this->__buildRegistration(); @@ -127,14 +121,6 @@ public function __buildGroup(): void $this->xmlStartTag("group", $attrs); } - protected function __buildMetaData(): bool - { - $md2xml = new ilMD2XML($this->group_obj->getId(), $this->group_obj->getId(), 'grp'); - $md2xml->startExport(); - $this->appendXML($md2xml->getXML()); - return true; - } - private function __buildAdvancedMetaData(): void { ilAdvancedMDValues::_appendXMLByObjId($this, $this->group_obj->getId()); @@ -173,9 +159,7 @@ protected function __buildPeriod(): void $this->xmlElement( 'start', null, - $this->group_obj->getStart() ? - $this->group_obj->getStart()->get(IL_CAL_UNIX) : - null + $this->group_obj->getStart()?->get(IL_CAL_UNIX) ); $this->xmlElement( 'end', diff --git a/components/ILIAS/WebResource/classes/class.ilObjLinkResource.php b/components/ILIAS/WebResource/classes/class.ilObjLinkResource.php index 999f91884ae4..e97088ca3e76 100755 --- a/components/ILIAS/WebResource/classes/class.ilObjLinkResource.php +++ b/components/ILIAS/WebResource/classes/class.ilObjLinkResource.php @@ -21,7 +21,6 @@ use ILIAS\MetaData\Services\ServicesInterface as LOMServices; /** - * Class ilObjLinkResource * @author Stefan Meyer */ class ilObjLinkResource extends ilObject @@ -47,15 +46,10 @@ protected function getWebLinkRepo(): ilWebLinkRepository return $this->repo = new ilWebLinkDatabaseRepository($this->getId()); } - /** - * @todo how to handle this meta data switch - */ public function create($a_upload = false): int { $new_id = parent::create(); - if (!$a_upload) { - $this->createMetaData(); - } + $this->createMetaData(); return $new_id; } @@ -180,7 +174,7 @@ public function cloneObject( return $new_obj; } - public function toXML(ilXmlWriter $writer, bool $skip_lom = false): void + public function toXML(ilXmlWriter $writer): void { $attribs = array("obj_id" => "il_" . IL_INST_ID . "_webr_" . $this->getId( ) @@ -188,13 +182,6 @@ public function toXML(ilXmlWriter $writer, bool $skip_lom = false): void $writer->xmlStartTag('WebLinks', $attribs); - if (!$skip_lom) { - // LOM MetaData - $md2xml = new ilMD2XML($this->getId(), $this->getId(), 'webr'); - $md2xml->startExport(); - $writer->appendXML($md2xml->getXML()); - } - // Sorting switch (ilContainerSortingSettings::_lookupSortMode($this->getId())) { case ilContainer::SORT_MANUAL: diff --git a/components/ILIAS/WebResource/classes/class.ilWebLinkXmlParser.php b/components/ILIAS/WebResource/classes/class.ilWebLinkXmlParser.php index b9936019f8cc..cc542713c2a9 100755 --- a/components/ILIAS/WebResource/classes/class.ilWebLinkXmlParser.php +++ b/components/ILIAS/WebResource/classes/class.ilWebLinkXmlParser.php @@ -19,12 +19,9 @@ declare(strict_types=1); /** - * XML parser for weblink xml * @author Stefan Meyer - * @version $Id$ - * @ingroup components\ILIASWebResource */ -class ilWebLinkXmlParser extends ilMDSaxParser +class ilWebLinkXmlParser extends ilSaxParser { protected const int MODE_UNDEFINED = 0; public const int MODE_UPDATE = 1; @@ -33,7 +30,6 @@ class ilWebLinkXmlParser extends ilMDSaxParser private ilObjLinkResource $webl; private ilWebLinkRepository $web_link_repo; private int $mode = self::MODE_UNDEFINED; - private bool $in_metadata = false; private array $sorting_positions = []; private string $cdata = ''; @@ -68,13 +64,6 @@ public function __construct(ilObjLinkResource $webr, string $xml) $this->getWebLink()->getId() ); - $this->setMDObject( - new ilMD( - $this->getWebLink()->getId(), - $this->getWebLink()->getId(), - 'webr' - ) - ); $this->setThrowException(true); } @@ -86,18 +75,6 @@ public function startParsing(): void $this->getWebLink()->setTitle($this->list_title ?? $this->first_item_title); $this->getWebLink()->setDescription($this->list_description ?? $this->first_item_description); $this->getWebLink()->update(); - - // rewrite autogenerated entry - $general = $this->getMDObject()->getGeneral(); - $identifier_ids = $general->getIdentifierIds(); - if (!isset($identifier_ids[0])) { - return; - } - $identifier = $general->getIdentifier($identifier_ids[0]); - $identifier->setEntry( - 'il__' . $this->getMDObject()->getObjType() . '_' . $this->getMDObject()->getObjId() - ); - $identifier->update(); } public function setWebLink(ilObjLinkResource $webl): void @@ -153,22 +130,8 @@ public function handlerBeginTag( ): void { global $DIC; $a_attribs = $this->trimAndStripAttribs($a_attribs); - if ($this->in_metadata) { - parent::handlerBeginTag($a_xml_parser, $a_name, $a_attribs); - return; - } switch ($a_name) { - case "MetaData": - $this->in_metadata = true; - - // Delete old meta data - $md = new ilMD($this->getWebLink()->getId(), 0, 'webr'); - $md->deleteAll(); - - parent::handlerBeginTag($a_xml_parser, $a_name, $a_attribs); - break; - case 'WebLink': $this->current_sorting_position = (int) ($a_attribs['position'] ?: 0); @@ -292,18 +255,9 @@ public function handlerBeginTag( public function handlerEndTag($a_xml_parser, string $a_name): void { - $this->cdata = $this->trimAndStrip((string) $this->cdata); - - if ($this->in_metadata) { - parent::handlerEndTag($a_xml_parser, $a_name); - } + $this->cdata = $this->trimAndStrip($this->cdata); switch ($a_name) { - case 'MetaData': - $this->in_metadata = false; - parent::handlerEndTag($a_xml_parser, $a_name); - break; - case 'WebLinks': if ($this->is_list || !$this->web_link_repo->doesOnlyOneItemExist()) { $list_draft = new ilWebLinkDraftList( @@ -411,14 +365,24 @@ public function handlerEndTag($a_xml_parser, string $a_name): void public function handlerCharacterData($a_xml_parser, string $a_data): void { - if ($this->in_metadata) { - parent::handlerCharacterData($a_xml_parser, $a_data); - } - if ($a_data != "\n") { // Replace multiple tabs with one space $a_data = preg_replace("/\t+/", " ", $a_data); $this->cdata .= $a_data; } } + + protected function trimAndStripAttribs(array $attribs): array + { + $ret = []; + foreach ($attribs as $k => $v) { + $ret[$k] = $this->trimAndStrip((string) $v); + } + return $ret; + } + + protected function trimAndStrip(string $input): string + { + return ilUtil::stripSlashes(trim($input)); + } } diff --git a/components/ILIAS/WebResource/classes/class.ilWebLinkXmlWriter.php b/components/ILIAS/WebResource/classes/class.ilWebLinkXmlWriter.php index 8b96e2e88ee0..21aa29e0dd16 100755 --- a/components/ILIAS/WebResource/classes/class.ilWebLinkXmlWriter.php +++ b/components/ILIAS/WebResource/classes/class.ilWebLinkXmlWriter.php @@ -19,9 +19,7 @@ declare(strict_types=1); /** - * XML writer for weblinks * @author Stefan Meyer - * @ingroup components\ILIASWebResource */ class ilWebLinkXmlWriter extends ilXmlWriter { @@ -44,13 +42,13 @@ public function setObjId(int $a_obj_id): void /** * @throws UnexpectedValueException Thrown if obj_id is not of type webr or no obj_id is given */ - public function write(bool $skip_lom = false): void + public function write(): void { $this->init(); if ($this->add_header) { $this->buildHeader(); } - $this->weblink->toXML($this, $skip_lom); + $this->weblink->toXML($this); } /** diff --git a/components/ILIAS/WebResource/classes/class.ilWebResourceExporter.php b/components/ILIAS/WebResource/classes/class.ilWebResourceExporter.php index ef20246f25bb..42c477d7f2bc 100755 --- a/components/ILIAS/WebResource/classes/class.ilWebResourceExporter.php +++ b/components/ILIAS/WebResource/classes/class.ilWebResourceExporter.php @@ -19,9 +19,7 @@ declare(strict_types=1); /** - * Booking definition * @author Stefan Meyer - * @ingroup ServicesBooking */ class ilWebResourceExporter extends ilXmlExporter { @@ -51,7 +49,7 @@ public function getXmlRepresentation( try { $this->writer = new ilWebLinkXmlWriter(false); $this->writer->setObjId((int) $a_id); - $this->writer->write(true); + $this->writer->write(); return $this->writer->xmlDumpMem(false); } catch (UnexpectedValueException $e) { $this->logger->warning("Caught error: " . $e->getMessage()); diff --git a/components/ILIAS/WebResource/classes/class.ilWebResourceImporter.php b/components/ILIAS/WebResource/classes/class.ilWebResourceImporter.php index fca2bf700252..a06ff7fed549 100755 --- a/components/ILIAS/WebResource/classes/class.ilWebResourceImporter.php +++ b/components/ILIAS/WebResource/classes/class.ilWebResourceImporter.php @@ -19,9 +19,7 @@ declare(strict_types=1); /** - * Webresource xml importer * @author Stefan Meyer - * @ingroup components\ILIASWebResource */ class ilWebResourceImporter extends ilXmlImporter { @@ -60,7 +58,7 @@ public function importXmlRepresentation( } else { $this->link = new ilObjLinkResource(); $this->link->setType('webr'); - $this->link->create(true); + $this->link->create(); } try { diff --git a/components/ILIAS/soap/classes/class.ilNusoapUserAdministrationAdapter.php b/components/ILIAS/soap/classes/class.ilNusoapUserAdministrationAdapter.php index 809a040f14c1..772b4ae0cc2d 100755 --- a/components/ILIAS/soap/classes/class.ilNusoapUserAdministrationAdapter.php +++ b/components/ILIAS/soap/classes/class.ilNusoapUserAdministrationAdapter.php @@ -214,7 +214,9 @@ private function registerMethods(): void SERVICE_NAMESPACE . '#addCourse', SERVICE_STYLE, SERVICE_USE, - 'ILIAS addCourse(). Course import. See ilias_course_0_1.dtd for details about course xml structure' + 'ILIAS addCourse(). Course import. See ' . + 'components/ILIAS/Export/xml/SchemaValidation/ilias_ws_crs_11_0.xsd ' . + 'for details about course xml structure' ); // deleteCourse() diff --git a/components/ILIAS/soap/classes/class.ilSoapCourseAdministration.php b/components/ILIAS/soap/classes/class.ilSoapCourseAdministration.php index 342f996801d9..61f6ef8713c4 100755 --- a/components/ILIAS/soap/classes/class.ilSoapCourseAdministration.php +++ b/components/ILIAS/soap/classes/class.ilSoapCourseAdministration.php @@ -1,4 +1,5 @@ setType('crs'); $newObj->setTitle('dummy'); $newObj->setDescription(""); - $newObj->create(true); // true for upload + $newObj->create(); // true for upload $newObj->createReference(); $newObj->putInTree($target_id); $newObj->setPermissions($target_id); @@ -363,11 +364,6 @@ public function updateCourse(string $sid, int $course_id, string $xml) return $this->raiseError('Check access failed. No permission to write course', 'Server'); } - // First delete old meta data - - $md = new ilMD($tmp_course->getId(), 0, 'crs'); - $md->deleteAll(); - ilCourseParticipants::_deleteAllEntries($tmp_course->getId()); ilCourseWaitingList::_deleteAll($tmp_course->getId()); diff --git a/components/ILIAS/soap/classes/class.ilSoapWebLinkAdministration.php b/components/ILIAS/soap/classes/class.ilSoapWebLinkAdministration.php index c37ecfbcb408..6386019873e6 100755 --- a/components/ILIAS/soap/classes/class.ilSoapWebLinkAdministration.php +++ b/components/ILIAS/soap/classes/class.ilSoapWebLinkAdministration.php @@ -138,7 +138,7 @@ public function createWebLink(string $sid, int $target_id, string $weblink_xml) // create object, put it into the tree and use the parser to update the settings $webl = new ilObjLinkResource(); $webl->setTitle('XML Import'); - $webl->create(true); + $webl->create(); $webl->createReference(); $webl->putInTree($target_id); $webl->setPermissions($target_id); From 84f5562fe374fcf7ef5d4cc276d462007e8cd1c4 Mon Sep 17 00:00:00 2001 From: mjansen Date: Thu, 10 Apr 2025 13:06:32 +0200 Subject: [PATCH 031/125] Auth: Add info for default authentication method configuration See: https://mantis.ilias.de/view.php?id=32755 --- .../Authentication/classes/class.ilObjAuthSettingsGUI.php | 7 ++++++- lang/ilias_de.lang | 3 ++- lang/ilias_en.lang | 1 + 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/components/ILIAS/Authentication/classes/class.ilObjAuthSettingsGUI.php b/components/ILIAS/Authentication/classes/class.ilObjAuthSettingsGUI.php index 3cbc602c492b..07bb9d53c39b 100755 --- a/components/ILIAS/Authentication/classes/class.ilObjAuthSettingsGUI.php +++ b/components/ILIAS/Authentication/classes/class.ilObjAuthSettingsGUI.php @@ -181,7 +181,12 @@ private function authSettingsObject( $page_content = [ $this->ui_factory->panel()->standard( $this->lng->txt('auth_select'), - $this->ui_factory->legacy()->content($generalSettingsTpl->get()), + $this->ui_factory->legacy()->content(implode('', [ + $this->ui_renderer->render($this->ui_factory->messageBox()->info( + $this->lng->txt('auth_mode_default_change_info') + )), + $generalSettingsTpl->get() + ])), ) ]; diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index 3fe7c8144003..70eff0a5dffb 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -174,7 +174,8 @@ administration#:#auth_auth_mode_determination#:#Bestimmung der Authentifizierung administration#:#auth_automatic#:#Festgelegte Reihenfolge administration#:#auth_by_user#:#Durch den Benutzer administration#:#auth_kind_determination#:#Art der Bestimmung -administration#:#auth_mode_determination_info#:#Hier können Sie festlegen, ob die Authentifizierungsmethode durch die Benutzer beim Login ausgewählt werden muss oder ob die Authentifizierungsdaten anhand einer vorgegebenen Reihenfolge überprüft werden sollen. +administration#:#auth_mode_default_change_info#:#Die Änderung des Standard-Authentifizierungsverfahrens betrifft alle ILIAS-Konten, bei denen die Authentifizierung auf „Standard“ gesetzt ist. Wenn das gewählte Verfahren (z.B. Shibboleth, SAML, LDAP, ...) keine lokale ILIAS-Authentifizierung unterstützt oder diese Funktion nicht aktiviert ist, können betroffene Personen sich möglicherweise nicht mehr anmelden. Um dies zu vermeiden, stellen Sie bitte sicher, dass die lokale Authentifizierung im konfigurierten Verfahren (sofern unterstützt) aktiviert ist oder dass das Authentifizierungsverfahren in den betroffenen ILIAS-Konten entsprechend angepasst wird. +administration#:#auth_mode_determination_info#:#Hier kann festgelegt werden, ob die Authentifizierungsmethode beim Login von der jeweiligen Person ausgewählt werden muss oder ob die Authentifizierungsdaten anhand einer vorgegebenen Reihenfolge überprüft werden sollen. administration#:#clean#:#Räume auf administration#:#clean_desc#:#Entferne ungültige Referenzen und Baumeinträge. Initialisiere Lücken in der Baumstruktur administration#:#cleaning#:#Bereinigen... diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index 78f67d55a719..6f1971475401 100755 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -174,6 +174,7 @@ administration#:#auth_auth_mode_determination#:#Authentication Method Determinat administration#:#auth_automatic#:#Fixed Sequence administration#:#auth_by_user#:#By the User administration#:#auth_kind_determination#:#Kind of Determination +administration#:#auth_mode_default_change_info#:#Changing the default authentication method affects all user accounts configured to use the default authentication method. If the selected default method (e.g., Shibboleth, SAML, SOAP, ...) does not support or is not configured to allow fallback to local ILIAS authentication, affected users may no longer be able to log in. To avoid this, please ensure that local fallback authentication is activated in the configuration of the selected method, or that the authentication method stored for affected user accounts is manually changed. administration#:#auth_mode_determination_info#:#Choose either if the users have to select their authentication method on the login screen or if this is managed by a fixed sequence of authentication methods. administration#:#clean#:#Clean up administration#:#clean_desc#:#Remove invalid references and tree entries. Initialize gaps in tree structure. From 3e0145b44eab9a816911fc61b5db7b50c8afc7f8 Mon Sep 17 00:00:00 2001 From: Fabian Schmid Date: Tue, 8 Apr 2025 09:34:48 +0200 Subject: [PATCH 032/125] [FIX] 0037444: Drop zones can be activated with subtabs, container titles and others --- .../UI/resources/js/Dropzone/File/dropzone.js | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/components/ILIAS/UI/resources/js/Dropzone/File/dropzone.js b/components/ILIAS/UI/resources/js/Dropzone/File/dropzone.js index 5daa1671d8b4..582e7ec93c1c 100755 --- a/components/ILIAS/UI/resources/js/Dropzone/File/dropzone.js +++ b/components/ILIAS/UI/resources/js/Dropzone/File/dropzone.js @@ -12,7 +12,7 @@ * https://www.ilias.de * https://github.com/ILIAS-eLearning * - * ******************************************************************* + ********************************************************************* * * this script is responsible for the dropzone highlighting and * file processing. @@ -126,6 +126,21 @@ il.UI = il.UI || {}; } } + let hasEventFiles = function (event) { + // check if "Files" is in the event.originalEvent.dataTransfer.types + if (event.originalEvent.dataTransfer.types.length === 0) { + return false; + } + let is_file = false; + for (let i = 0; i < event.originalEvent.dataTransfer.types.length; i++) { + if (event.originalEvent.dataTransfer.types[i] === 'Files') { + is_file = true; + break; + } + } + return is_file; + } + let removeAllFilesFromQueue = function (dropzone_id) { if (typeof dropzones[dropzone_id] === 'undefined') { console.error(`Error: tried accessing unknown dropzone '${dropzone_id}'.`); @@ -138,6 +153,9 @@ il.UI = il.UI || {}; * @param {Event} event */ let highlightCurrentDropzoneHook = function (event) { + if(!hasEventFiles(event)) { + return; + } event.preventDefault(); let current_dropzone = $(event.currentTarget); current_dropzone.addClass(CSS.highlight_current); @@ -155,6 +173,10 @@ il.UI = il.UI || {}; * @param {Event} event */ let highlightPossibleDropzones = function (event) { + if(!hasEventFiles(event)) { + return; + } + disableDefaultEventBehaviour(event); drag_enter_counter++; From bcda17189cbe3f5f4f506c4c423fe7ee84f048a5 Mon Sep 17 00:00:00 2001 From: Tim Schmitz Date: Fri, 11 Apr 2025 10:59:03 +0200 Subject: [PATCH 033/125] MetaData: add abstract migration for deletion of LOM for object types --- .../Setup/DeleteLOMForObjectTypeMigration.php | 136 ++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100755 components/ILIAS/MetaData/classes/Setup/DeleteLOMForObjectTypeMigration.php diff --git a/components/ILIAS/MetaData/classes/Setup/DeleteLOMForObjectTypeMigration.php b/components/ILIAS/MetaData/classes/Setup/DeleteLOMForObjectTypeMigration.php new file mode 100755 index 000000000000..af7908b86aab --- /dev/null +++ b/components/ILIAS/MetaData/classes/Setup/DeleteLOMForObjectTypeMigration.php @@ -0,0 +1,136 @@ +db = $environment->getResource(Environment::RESOURCE_DATABASE); + + $io = $environment->getResource(Environment::RESOURCE_ADMIN_INTERACTION); + if ($io instanceof IOWrapper) { + $this->io = $io; + } + } + + final public function step(Environment $environment): void + { + $selects = []; + foreach (LOMDictionaryInitiator::TABLES as $table) { + $selects[] = 'SELECT rbac_id, obj_id FROM ' . $this->db->quoteIdentifier($table) . + ' WHERE obj_type = ' . $this->quotedObjectType(); + } + if (empty($selects)) { + return; + } + $query = 'SELECT rbac_id, obj_id FROM (' . implode(' UNION ', $selects) . + ') AS t ORDER BY t.rbac_id, t.obj_id ASC LIMIT 1'; + $res = $this->db->query($query); + if (!($row = $this->db->fetchAssoc($res))) { + $this->logInfo('No LOM found for ' . $this->objectType()); + return; + } + $rbac_id = $row['rbac_id']; + $obj_id = $row['obj_id']; + + $this->logInfo('Deleting LOM for rbac_id = ' . $rbac_id . ' and obj_id = ' . $obj_id); + + foreach (LOMDictionaryInitiator::TABLES as $table) { + $query = 'DELETE FROM ' . $this->db->quoteIdentifier($table) . + ' WHERE obj_type = ' . $this->quotedObjectType() . + ' AND rbac_id = ' . $this->db->quote($rbac_id, \ilDBConstants::T_INTEGER) . + ' AND obj_id = ' . $this->db->quote($obj_id, \ilDBConstants::T_INTEGER); + $this->db->manipulate($query); + } + $this->logSuccess('Done!'); + } + + final public function getRemainingAmountOfSteps(): int + { + $selects = []; + foreach (LOMDictionaryInitiator::TABLES as $table) { + $selects[] = 'SELECT rbac_id, obj_id FROM ' . $this->db->quoteIdentifier($table) . + ' WHERE obj_type = ' . $this->quotedObjectType(); + } + if (empty($selects)) { + return 0; + } + $query = 'SELECT COUNT(*) AS count FROM (' . implode(' UNION ', $selects) . ') AS t'; + $res = $this->db->query($query); + if ($row = $this->db->fetchAssoc($res)) { + return (int) $row['count']; + } + return 0; + } + + private function quotedObjectType(): string + { + return $this->db->quote($this->objectType(), \ilDBConstants::T_TEXT); + } + + protected function logInfo(string $str): void + { + if (!isset($this->io) || !$this->io->isVerbose()) { + return; + } + $this->io->inform($str); + } + + protected function logSuccess(string $str): void + { + if (!isset($this->io) || !$this->io->isVerbose()) { + return; + } + $this->io->success($str); + } +} From 1df32943a45f2579889490a92ad45da6e76ff6b2 Mon Sep 17 00:00:00 2001 From: mjansen Date: Fri, 11 Apr 2025 12:15:47 +0200 Subject: [PATCH 034/125] Auth/SAML: Save IDP id in "ilCtrl" parameters --- components/ILIAS/Saml/classes/class.ilSamlSettingsGUI.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/ILIAS/Saml/classes/class.ilSamlSettingsGUI.php b/components/ILIAS/Saml/classes/class.ilSamlSettingsGUI.php index c5ccb7ec51c8..3e3add57653c 100755 --- a/components/ILIAS/Saml/classes/class.ilSamlSettingsGUI.php +++ b/components/ILIAS/Saml/classes/class.ilSamlSettingsGUI.php @@ -234,7 +234,7 @@ public function executeCommand(): void } $ipdId = $this->getIdpIdOrZero(); if ($ipdId > 0) { - $this->ctrl->saveParameter($this, self::REQUEST_PARAM_SAML_IDP_ID); + $this->ctrl->setParameter($this, self::REQUEST_PARAM_SAML_IDP_ID, $ipdId); } if (!in_array(strtolower($cmd), array_map('strtolower', self::GLOBAL_COMMANDS), true)) { if (0 === $ipdId) { From 281ce780a6c1ed6aa44d4b410469e95a0a3e5c85 Mon Sep 17 00:00:00 2001 From: Lukas Scharmer Date: Fri, 11 Apr 2025 12:20:11 +0200 Subject: [PATCH 035/125] Fix Chatroom dropdown style --- .../legacy/Modules/_component_chatroom.scss | 12 ++---------- templates/default/delos.css | 12 ++---------- 2 files changed, 4 insertions(+), 20 deletions(-) diff --git a/templates/default/070-components/legacy/Modules/_component_chatroom.scss b/templates/default/070-components/legacy/Modules/_component_chatroom.scss index 51c45cac7200..10f23c3f94f6 100755 --- a/templates/default/070-components/legacy/Modules/_component_chatroom.scss +++ b/templates/default/070-components/legacy/Modules/_component_chatroom.scss @@ -172,12 +172,6 @@ td.chatroom { white-space: nowrap; } - .dropdown-menu { - background-color: $il-main-dark-bg; - padding: 10px 0; - font-size: $il-font-size-small; - } - .ilChatroomDropdown { position: relative; @@ -208,10 +202,8 @@ td.chatroom { background-color: $il-highlight-bg; } - .dropdown-menu { - position: static; - float: none; - @include box-shadow(none); + .dropdown-menu > li > button.btn { + padding-left: 10px; } .dropdown-backdrop { diff --git a/templates/default/delos.css b/templates/default/delos.css index 2c6bca760c44..e647e9c0e0e9 100644 --- a/templates/default/delos.css +++ b/templates/default/delos.css @@ -12919,11 +12919,6 @@ td.chatroom { text-overflow: ellipsis; white-space: nowrap; } -.ilChatroomUser .dropdown-menu { - background-color: #f9f9f9; - padding: 10px 0; - font-size: 0.75rem; -} .ilChatroomUser .ilChatroomDropdown { position: relative; } @@ -12948,11 +12943,8 @@ td.chatroom { .ilChatroomUser .media:hover { background-color: #e2e8ef; } -.ilChatroomUser .dropdown-menu { - position: static; - float: none; - -webkit-box-shadow: none; - box-shadow: none; +.ilChatroomUser .dropdown-menu > li > button.btn { + padding-left: 10px; } .ilChatroomUser .dropdown-backdrop { position: static; From 95ada875ddd2d1b181beaafc89626eed200dfdbc Mon Sep 17 00:00:00 2001 From: Nils Haagen Date: Fri, 10 Jan 2025 14:49:51 +0100 Subject: [PATCH 036/125] Customizing: remove directory /Customizing --- Customizing/README.md | 58 ------------------- Customizing/global/plugins/.gitkeep | 0 components/ILIAS/App/tests/RootFolderTest.php | 1 - .../classes/class.ilFileUtils.php | 2 +- ...lFileSystemDirectoriesCreatedObjective.php | 2 +- .../Filesystem/src/Util/LegacyPathHelper.php | 2 +- .../Init/classes/class.ilInitialisation.php | 2 +- .../classes/Setup/class.ilSetupLanguage.php | 2 +- .../Language/classes/class.ilLanguage.php | 2 +- components/ILIAS/Mail/README.md | 2 +- .../ILIAS/Mail/classes/class.ilMimeMail.php | 4 +- .../class.ilOrgUnitGenericMultiInputGUI.php | 1 - .../ILIAS/StaticURL/tests/URIBuilderTest.php | 2 +- .../classes/class.ilImagePathResolver.php | 2 +- .../classes/class.ilTestHTMLGenerator.php | 2 +- .../ILIAS/Utilities/classes/class.ilUtil.php | 3 +- composer.json | 2 +- lang/Customizing/README.md | 10 ++++ 18 files changed, 25 insertions(+), 74 deletions(-) delete mode 100755 Customizing/README.md delete mode 100644 Customizing/global/plugins/.gitkeep create mode 100644 lang/Customizing/README.md diff --git a/Customizing/README.md b/Customizing/README.md deleted file mode 100755 index 315562dee557..000000000000 --- a/Customizing/README.md +++ /dev/null @@ -1,58 +0,0 @@ -# Customizing - - - -1. [Introduction](#introduction) -1. [System Language Changes](#system-language-changes) -1. [Skins and Styles](#skins-and-styles) -1. [Plugins](#plugins) - - - - -## Introduction - -This directory holds all customized files for this ILIAS installation. - -On the top level two directories may be created: `/Customizing/global` for -global changes and `/Customizing/clients` for changes that should be applied to -clients. - -The clients directory holds a subdirectory for each client: - -``` -/Customizing/clients/ -``` - -At the time being, only user agreements can be offered for clients! Customized -skins and languages are only supported globally. - - -## System Language Changes - -You may change terms used in the user interface of ILIAS. To do this, use the -same format as is used in the language files in directory `/lang`. Store the -values to be overwritten in files ending with `.lang.local` and put them into -the `/global/lang` directory. Client specific changes are not supported yet. - -``` -/global/lang/ilias_.lang.local -``` - -Example: - -``` -/global/lang/ilias_en.lang.local -``` - - -## Skins and Styles - -You find all information about how to create your own skin in the [Custom -Styles](/templates/Readme.md#custom-styles) documentation. - - -## Plugins - -Plugins are installed under `/global/plugins`. Each plugin should come with its -own documentation stating the exact target directory. diff --git a/Customizing/global/plugins/.gitkeep b/Customizing/global/plugins/.gitkeep deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/components/ILIAS/App/tests/RootFolderTest.php b/components/ILIAS/App/tests/RootFolderTest.php index 4430acd8fe16..30b1bd4eaaeb 100755 --- a/components/ILIAS/App/tests/RootFolderTest.php +++ b/components/ILIAS/App/tests/RootFolderTest.php @@ -60,7 +60,6 @@ final class RootFolderTest extends TestCase 'artifacts', 'cli', 'components', - 'Customizing', 'docs', 'extern', 'lang', diff --git a/components/ILIAS/FileServices/classes/class.ilFileUtils.php b/components/ILIAS/FileServices/classes/class.ilFileUtils.php index fe54b05e8dd0..4760da13e857 100755 --- a/components/ILIAS/FileServices/classes/class.ilFileUtils.php +++ b/components/ILIAS/FileServices/classes/class.ilFileUtils.php @@ -364,7 +364,7 @@ protected static function sanitateTargetPath(string $a_target): array str_starts_with($a_target, CLIENT_DATA_DIR . "/temp") => Location::TEMPORARY, str_starts_with($a_target, CLIENT_DATA_DIR) => Location::STORAGE, - str_starts_with($a_target, ILIAS_ABSOLUTE_PATH . '/Customizing') => Location::CUSTOMIZING, + str_starts_with($a_target, ILIAS_ABSOLUTE_PATH . '/public/Customizing') => Location::CUSTOMIZING, default => throw new InvalidArgumentException( "Can not move files to \"$a_target\" because path can not be mapped to web, storage or customizing location." ), diff --git a/components/ILIAS/Filesystem/classes/Setup/class.ilFileSystemDirectoriesCreatedObjective.php b/components/ILIAS/Filesystem/classes/Setup/class.ilFileSystemDirectoriesCreatedObjective.php index 1ca758d22bd4..58f93ddc6b6a 100755 --- a/components/ILIAS/Filesystem/classes/Setup/class.ilFileSystemDirectoriesCreatedObjective.php +++ b/components/ILIAS/Filesystem/classes/Setup/class.ilFileSystemDirectoriesCreatedObjective.php @@ -91,7 +91,7 @@ public function getPreconditions(Environment $environment): array ); $customizing_dir_objective = new ilFileSystemDirectoryCopiedRecursivelyObjective( $tmp_dir . DIRECTORY_SEPARATOR . "Customizing", - $root . "/Customizing", + $root . "/public/Customizing", false, true ); diff --git a/components/ILIAS/Filesystem/src/Util/LegacyPathHelper.php b/components/ILIAS/Filesystem/src/Util/LegacyPathHelper.php index bd0c57448117..9219d22ea416 100755 --- a/components/ILIAS/Filesystem/src/Util/LegacyPathHelper.php +++ b/components/ILIAS/Filesystem/src/Util/LegacyPathHelper.php @@ -220,7 +220,7 @@ private static function listPaths(): array $webRelativeWithLeadingDot = './' . ILIAS_WEB_DIR . '/' . CLIENT_ID; $webRelativeWithoutLeadingDot = ILIAS_WEB_DIR . '/' . CLIENT_ID; $storage = CLIENT_DATA_DIR; - $customizing = ILIAS_ABSOLUTE_PATH . '/Customizing'; + $customizing = ILIAS_ABSOLUTE_PATH . '/public/Customizing'; $customizingRelativeWithLeadingDot = './Customizing'; $libs = ILIAS_ABSOLUTE_PATH . '/vendor'; $libsRelativeWithLeadingDot = "./vendor"; diff --git a/components/ILIAS/Init/classes/class.ilInitialisation.php b/components/ILIAS/Init/classes/class.ilInitialisation.php index 39c16dd8cb93..708c96fd215b 100755 --- a/components/ILIAS/Init/classes/class.ilInitialisation.php +++ b/components/ILIAS/Init/classes/class.ilInitialisation.php @@ -263,7 +263,7 @@ public static function bootstrapFilesystems(): void * @var FilesystemFactory $delegatingFactory */ $delegatingFactory = $c['filesystem.factory']; - $customizingConfiguration = new \ILIAS\Filesystem\Provider\Configuration\LocalConfig(ILIAS_ABSOLUTE_PATH . '/' . 'Customizing'); + $customizingConfiguration = new \ILIAS\Filesystem\Provider\Configuration\LocalConfig(ILIAS_ABSOLUTE_PATH . '/public/' . 'Customizing'); return $delegatingFactory->getLocal($customizingConfiguration); }; diff --git a/components/ILIAS/Language/classes/Setup/class.ilSetupLanguage.php b/components/ILIAS/Language/classes/Setup/class.ilSetupLanguage.php index 5390dd07df12..c39b9bb7010c 100755 --- a/components/ILIAS/Language/classes/Setup/class.ilSetupLanguage.php +++ b/components/ILIAS/Language/classes/Setup/class.ilSetupLanguage.php @@ -54,7 +54,7 @@ public function __construct(string $a_lang_key) $this->lang_key = $a_lang_key ?: $this->lang_default; $il_absolute_path = realpath(__DIR__ . "/../../../../../"); $this->lang_path = $il_absolute_path . "/lang"; - $this->cust_lang_path = $il_absolute_path . "/Customizing/global/lang"; + $this->cust_lang_path = $il_absolute_path . "/lang/Customizing"; } /** diff --git a/components/ILIAS/Language/classes/class.ilLanguage.php b/components/ILIAS/Language/classes/class.ilLanguage.php index e41afc3c0e34..b8886555f4e4 100755 --- a/components/ILIAS/Language/classes/class.ilLanguage.php +++ b/components/ILIAS/Language/classes/class.ilLanguage.php @@ -82,7 +82,7 @@ public function __construct(string $a_lang_key) $this->usage_log_enabled = self::isUsageLogEnabled(); $this->lang_path = ILIAS_ABSOLUTE_PATH . "/lang"; - $this->cust_lang_path = ILIAS_ABSOLUTE_PATH . "/Customizing/global/lang"; + $this->cust_lang_path = ILIAS_ABSOLUTE_PATH . "/lang/Customizing"; $this->lang_default = $client_ini->readVariable("language", "default") ?? 'en'; $this->lang_user = $this->lang_default; diff --git a/components/ILIAS/Mail/README.md b/components/ILIAS/Mail/README.md index 970f9a19d68b..4789dd77125f 100755 --- a/components/ILIAS/Mail/README.md +++ b/components/ILIAS/Mail/README.md @@ -95,7 +95,7 @@ when no template can be determined. Per Skin, one HTML template can be defined and has to be stored in the following location: - ./Customizing/global/skin///components/ILIAS/Mail/tpl.html_mail_template.html. + ./public/Customizing/skin///components/ILIAS/Mail/tpl.html_mail_template.html. The HTML frame template concept consists of the HTML markup file itself and some optional attachments. diff --git a/components/ILIAS/Mail/classes/class.ilMimeMail.php b/components/ILIAS/Mail/classes/class.ilMimeMail.php index 68f6eaaca6a4..c236ca4c11df 100755 --- a/components/ILIAS/Mail/classes/class.ilMimeMail.php +++ b/components/ILIAS/Mail/classes/class.ilMimeMail.php @@ -288,7 +288,7 @@ protected function getHtmlEnvelope(string $skin, string $style): string foreach ($locations as $location) { $custom_path = $this->getPathToRootDirectory( - ) . '/public/Customizing/global/skin/' . $location . '/components/ILIAS/Mail/tpl.html_mail_template.html'; + ) . '/public/Customizing/skin/' . $location . '/components/ILIAS/Mail/tpl.html_mail_template.html'; if (is_file($custom_path)) { $bracket_path = $custom_path; break; @@ -313,7 +313,7 @@ protected function buildHtmlInlineImages(string $skin, string $style): void foreach ($locations as $location) { $custom_directory = $this->getPathToRootDirectory( - ) . '/public/Customizing/global/skin/' . $location . '/components/ILIAS/Mail/img'; + ) . '/public/Customizing/skin/' . $location . '/components/ILIAS/Mail/img'; if (is_dir($custom_directory) && is_readable($custom_directory)) { $this->gatherImagesFromDirectory($custom_directory, true); break; diff --git a/components/ILIAS/OrgUnit/classes/Positions/Authorities/class.ilOrgUnitGenericMultiInputGUI.php b/components/ILIAS/OrgUnit/classes/Positions/Authorities/class.ilOrgUnitGenericMultiInputGUI.php index 5ee336348db6..d0bd112a8a07 100755 --- a/components/ILIAS/OrgUnit/classes/Positions/Authorities/class.ilOrgUnitGenericMultiInputGUI.php +++ b/components/ILIAS/OrgUnit/classes/Positions/Authorities/class.ilOrgUnitGenericMultiInputGUI.php @@ -227,7 +227,6 @@ private function createInputPostVar(string $iterator_id, \ilFormPropertyGUI $inp public function render(int|string $iterator_id = 0, bool $clean_render = false): string { $first_label = true; - // $tpl = new \ilTemplate("tpl.multi_line_input.html", true, true, 'Customizing/global/plugins/Services/Repository/RepositoryObject/LiveVoting'); $tpl = new ilTemplate("tpl.prop_generic_multi_line.html", true, true, 'components/ILIAS/OrgUnit'); $class = 'multi_input_line'; diff --git a/components/ILIAS/StaticURL/tests/URIBuilderTest.php b/components/ILIAS/StaticURL/tests/URIBuilderTest.php index a851d36dd34f..b82c10fd9a62 100755 --- a/components/ILIAS/StaticURL/tests/URIBuilderTest.php +++ b/components/ILIAS/StaticURL/tests/URIBuilderTest.php @@ -45,7 +45,7 @@ public static function getILIAS_HTTP_Paths(): array ['http://test9.ilias.de/goto.php', 'http://test9.ilias.de'], ['http://test9.ilias.de/go/hello', 'http://test9.ilias.de'], ['http://test9.ilias.de/go/hello', 'http://test9.ilias.de'], - ['http://test9.ilias.de/Customizing/global/plugins/Services/index.php', 'http://test9.ilias.de'], + ['http://test9.ilias.de/Customizing/plugins/Services/index.php', 'http://test9.ilias.de'], ]; } diff --git a/components/ILIAS/Style/System/classes/class.ilImagePathResolver.php b/components/ILIAS/Style/System/classes/class.ilImagePathResolver.php index 34dfd99701a3..68cbe1f21523 100755 --- a/components/ILIAS/Style/System/classes/class.ilImagePathResolver.php +++ b/components/ILIAS/Style/System/classes/class.ilImagePathResolver.php @@ -39,7 +39,7 @@ public function resolveImagePath(string $image_path): string if (is_object($styleDefinition) && $current_skin != "default") { $image_dir = $styleDefinition->getImageDirectory($current_style); - $skin_img = "./Customizing/global/skin/" . + $skin_img = "./Customizing/skin/" . $current_skin . "/" . $current_style . "/" . $image_dir . "/" . $image_path; } diff --git a/components/ILIAS/Test/classes/class.ilTestHTMLGenerator.php b/components/ILIAS/Test/classes/class.ilTestHTMLGenerator.php index d646a11e96ae..2915ed47d0a5 100755 --- a/components/ILIAS/Test/classes/class.ilTestHTMLGenerator.php +++ b/components/ILIAS/Test/classes/class.ilTestHTMLGenerator.php @@ -153,7 +153,7 @@ private function getTemplatePath($a_filename, $module_path = 'components/ILIAS/T { $fname = ''; if (ilStyleDefinition::getCurrentSkin() !== 'default') { - $fname = './Customizing/global/skin/' . + $fname = './Customizing/skin/' . ilStyleDefinition::getCurrentSkin() . '/' . $module_path . basename($a_filename); } diff --git a/components/ILIAS/Utilities/classes/class.ilUtil.php b/components/ILIAS/Utilities/classes/class.ilUtil.php index 13eb8f703ead..6d2e061f4c0d 100755 --- a/components/ILIAS/Utilities/classes/class.ilUtil.php +++ b/components/ILIAS/Utilities/classes/class.ilUtil.php @@ -1,4 +1,5 @@ .lang.local +``` From 7361255e36074a8d055cf45a25f9b5f0ead454dd Mon Sep 17 00:00:00 2001 From: Nils Haagen Date: Thu, 27 Feb 2025 08:45:10 +0100 Subject: [PATCH 037/125] Customizing: languages with lang/customizing --- .../classes/Setup/class.ilSetupLanguage.php | 2 +- .../Language/classes/class.ilLanguage.php | 2 +- composer.json | 2 +- .../development/components-and-directories.md | 8 +- lang/{Customizing => customizing}/README.md | 0 lang/customizing/docstring_header.lang.local | 16 + lang/customizing/ilias_de.cate.lang.local | 2810 +++++++++++++++++ lang/customizing/ilias_de.lang.local | 19 + lang/customizing/ilias_en.cate.lang.local | 865 +++++ lang/customizing/ilias_en.lang.local | 19 + lang/ilias_ar.lang | 6 +- lang/ilias_bg.lang | 6 +- lang/ilias_da.lang | 6 +- lang/ilias_de.lang | 6 +- lang/ilias_el.lang | 6 +- lang/ilias_en.lang | 6 +- lang/ilias_es.lang | 6 +- lang/ilias_et.lang | 6 +- lang/ilias_fa.lang | 6 +- lang/ilias_fr.lang | 6 +- lang/ilias_hr.lang | 6 +- lang/ilias_hu.lang | 6 +- lang/ilias_it.lang | 6 +- lang/ilias_ja.lang | 6 +- lang/ilias_ka.lang | 6 +- lang/ilias_lt.lang | 6 +- lang/ilias_nl.lang | 6 +- lang/ilias_pl.lang | 6 +- lang/ilias_pt.lang | 6 +- lang/ilias_ro.lang | 6 +- lang/ilias_ru.lang | 6 +- lang/ilias_sk.lang | 6 +- lang/ilias_sl.lang | 6 +- lang/ilias_sq.lang | 6 +- lang/ilias_sr.lang | 6 +- lang/ilias_tr.lang | 6 +- lang/ilias_uk.lang | 6 +- lang/ilias_vi.lang | 6 +- lang/ilias_zh.lang | 6 +- 39 files changed, 3821 insertions(+), 96 deletions(-) rename lang/{Customizing => customizing}/README.md (100%) create mode 100644 lang/customizing/docstring_header.lang.local create mode 100644 lang/customizing/ilias_de.cate.lang.local create mode 100644 lang/customizing/ilias_de.lang.local create mode 100644 lang/customizing/ilias_en.cate.lang.local create mode 100644 lang/customizing/ilias_en.lang.local diff --git a/components/ILIAS/Language/classes/Setup/class.ilSetupLanguage.php b/components/ILIAS/Language/classes/Setup/class.ilSetupLanguage.php index c39b9bb7010c..9a8a76a2adf8 100755 --- a/components/ILIAS/Language/classes/Setup/class.ilSetupLanguage.php +++ b/components/ILIAS/Language/classes/Setup/class.ilSetupLanguage.php @@ -54,7 +54,7 @@ public function __construct(string $a_lang_key) $this->lang_key = $a_lang_key ?: $this->lang_default; $il_absolute_path = realpath(__DIR__ . "/../../../../../"); $this->lang_path = $il_absolute_path . "/lang"; - $this->cust_lang_path = $il_absolute_path . "/lang/Customizing"; + $this->cust_lang_path = $il_absolute_path . "/lang/customizing"; } /** diff --git a/components/ILIAS/Language/classes/class.ilLanguage.php b/components/ILIAS/Language/classes/class.ilLanguage.php index b8886555f4e4..2ab55856073a 100755 --- a/components/ILIAS/Language/classes/class.ilLanguage.php +++ b/components/ILIAS/Language/classes/class.ilLanguage.php @@ -82,7 +82,7 @@ public function __construct(string $a_lang_key) $this->usage_log_enabled = self::isUsageLogEnabled(); $this->lang_path = ILIAS_ABSOLUTE_PATH . "/lang"; - $this->cust_lang_path = ILIAS_ABSOLUTE_PATH . "/lang/Customizing"; + $this->cust_lang_path = ILIAS_ABSOLUTE_PATH . "/lang/customizing"; $this->lang_default = $client_ini->readVariable("language", "default") ?? 'en'; $this->lang_user = $this->lang_default; diff --git a/composer.json b/composer.json index 742cfbd30c5e..093f7cb5cd74 100755 --- a/composer.json +++ b/composer.json @@ -19,7 +19,7 @@ "@php cli/setup.php build --yes" ], "pre-install-cmd": [ - "mkdir -p public/Customizing/global/plugins" + "mkdir -p public/Customizing/global/plugins", "mkdir -p public/Customizing/skin" ], "post-install-cmd": [ diff --git a/docs/development/components-and-directories.md b/docs/development/components-and-directories.md index b64f7f517c7b..e63d089bf644 100755 --- a/docs/development/components-and-directories.md +++ b/docs/development/components-and-directories.md @@ -43,7 +43,7 @@ The root of the ILIAS repository contains the following directories and files: * **`docs`** contains documentation that is relevant for the complete system. Individual components may have **`docs`**-folders as well that contain information only about that component. -* **`lang`**: contains language file as is +* **`lang`**: contains language file as is; lang/customizing may contain language-modifications * **`components`** contains the code for ILIAS * **`scripts`**: contains scripts to be used during development and for CI * **`templates`**: contains style code and templates as is @@ -52,8 +52,6 @@ On productive installations and for release packages, these folders will be amen by some folders generated by a build-process: * **`artifacts`**: will contain generated artifacts from ILIAS -* **`Customizing`**: will contain language-modifications and additional skins, - but no plugins anymore. * **`node_modules`**: contains JavaScript-libraries as is * **`vendor`**: contains PHP-libraries as is * **`public`**: Contains files and folders that need to be exposed to the web, @@ -77,13 +75,11 @@ to look into high level concepts, processes and provide direction to other resou On the other hand, documentation about certain components should be close to the component in question, -**`lang`**, **`template`** and **`Customizing`** stay as is for the time being, as +**`lang`** and **`template`** and stay as is for the time being, as the system can only support a certain amount of change per timeframe. In the long run it seems advisable to move these folders as well. **`lang`** might be a candidate to be split up into single components as well. **`templates`** might be moved completely into the UI-framework once legacy UI components are removed completely. -**`Customizing`** will be a candidate for future treatment once `lang` and `template` -are reconsidered. **`public`** is introduced so installations can stop exposing each and every file in the ILIAS repository. This is bad for security and reliability, as the ILILAS diff --git a/lang/Customizing/README.md b/lang/customizing/README.md similarity index 100% rename from lang/Customizing/README.md rename to lang/customizing/README.md diff --git a/lang/customizing/docstring_header.lang.local b/lang/customizing/docstring_header.lang.local new file mode 100644 index 000000000000..56bb037bc622 --- /dev/null +++ b/lang/customizing/docstring_header.lang.local @@ -0,0 +1,16 @@ +/* Copyright (c) 1998-2024 ILIAS open source eLearning e.V., Extended GPL, see docs/LICENSE */ +/** +* ILIAS language file (All entries) +* +* @module language file custom +* @modulegroup language +* @author CaT +* @version $Id: ilias_*.lang.local +*/ +// The language file starts beyond the HTML-comment below. DO NOT modify this line! +// To edit your language file with a spreadsheet (i.e. Excel or StarCalc) remove all lines +// from the first line to the HTML-comment. After editing paste the lines in place again. +// NOTICE: Character coding of all ILIAS lang files is UTF-8! Please set your editor +// to the corresponding mode! +// Language file names refer to ISO 639, see: http://www.oasis-open.org/cover/iso639a.html + diff --git a/lang/customizing/ilias_de.cate.lang.local b/lang/customizing/ilias_de.cate.lang.local new file mode 100644 index 000000000000..0210bfc6562d --- /dev/null +++ b/lang/customizing/ilias_de.cate.lang.local @@ -0,0 +1,2810 @@ +/* Copyright (c) 1998-2024 ILIAS open source eLearning e.V., Extended GPL, see docs/LICENSE */ +/** +* ILIAS language file (All entries) +* +* @module language file custom german +* @modulegroup language +* @author CaT +* @version $Id: ilias_de.cate.lang.local +*/ +// The language file starts beyond the HTML-comment below. DO NOT modify this line! +// To edit your language file with a spreadsheet (i.e. Excel or StarCalc) remove all lines +// from the first line to the HTML-comment. After editing paste the lines in place again. +// NOTICE: Character coding of all ILIAS lang files is UTF-8! Please set your editor +// to the corresponding mode! +// Language file names refer to ISO 639, see: http://www.oasis-open.org/cover/iso639a.html + +acc#:#acc_form_document_content_changed#:#Der Inhalt der hochgeladenen Datei wurde durch das System bereinigt. Bitte prüfen Sie das Ergebnis und laden Sie im Zweifel eine neue Datei hoch. +acc#:#acc_form_document_new_info#:#Hier können Sie eine neue Datei von Ihrem lokalen Dateisystem wählen, um das Dokument zu ändern. Sie können eine einfache Text-Datei oder eine HTML-Datei hochladen. Es wird nicht der komplette HTML-Sprachumfang unterstützt. Bitte beachten Sie, dass HTML-Dateien beim Hochladen bereinigt werden, und nur der Inhalt des body-Elements übernommen wird. Der bestehende Inhalt des Dokuments wird ausgetauscht. +acc#:#acc_form_document_title_info#:#Tragen Sie hier einen Titel für das Dokument ein. +adm#:#adm_acc_ctrl_cpt_desc#:#Wenn aktiviert, erscheint der Link zur "Info Barrierefreiheit" im Footer. +adm#:#adm_accessibility_contacts_info#:#Kontaktpersonen zur Meldung von Problemen mit der Barrierefreiheit in der Fußzeile (komma-separierte Liste von Benutzerkonten) +adm#:#adm_awrn_support_contacts_info#:#Die Benutzer*innen, die technische Betreuung leisten, werden aufgelistet. Solche Benutzer*innen werden im Bereich "Allgemeine Einstellungen > Kontaktinformationen" der technischen Betreuung zugeordnet. +adm#:#adm_support_contacts_info#:#Technische Betreuer*innen werden in der Fußzeile verlinkt und - wenn aktiviert - in der „Wer ist online?“-Anzeige aufgelistet. Kommaseparierte Liste von Benutzerkonten. +administration#:#adm_adm_role_protect#:#Rolle "Administrator" schützen +administration#:#adm_adm_role_protect_info#:#Wenn aktiviert, ist es nur Angehörigen der Rolle "Administrator" erlaubt, Benutzer*innen dieser Rolle zuzuordnen oder sie von dieser zu entfernen. +administration#:#adm_captcha_anonymous_frm#:#Captcha für nicht angemeldete Benutzer*innen, die im Forum Beiträge schreiben wollen. Bitte beachten Sie, dass der Einsatz eines Captchas die Barrierefreiheit Ihrer Installation einschränkt. +administration#:#adm_captcha_anonymous_wiki#:#Captcha für nicht angemeldete Benutzer*innen, die im Wiki eine Seite bearbeiten wollen. Bitte beachten Sie, dass der Einsatz eines Captchas die Barrierefreiheit Ihrer Installation einschränkt. +administration#:#adm_db_benchmark_user_desc#:#Für diese*n Benutzer*in wird die Messung durchgeführt. Sie sollten nicht den/die gleichen Benutzer*in verwenden, der die Funktion aktiviert. +administration#:#adm_extending_ilias#:#cate erweitern +administration#:#adm_imprint_inactive#:#Das Impressum ist nicht aktiviert und somit nicht für Benutzer*innen erreichbar. +administration#:#adm_item_cmd_asynch_info#:#Aktionsmenüs, z. B. im Magazin, werden asynchron geladen. Dies erhöht die Performanz allgemein. In Einzelfällen kann es zu kurzen Verzögerungen beim Anzeigen des Pop-up-Menüs kommen. +administration#:#adm_rep_tree_limit_grp_crs#:#Alle Objekte auf Anzeige in Trainings und Gruppen beschränken +administration#:#adm_rep_tree_limit_grp_crs_info#:#Nur in Trainings und Gruppen werden alle Objekttypen in der Baumansicht angezeigt. Außerhalb zeigt die Baumansicht nur Container-Objekte. +administration#:#adm_rep_tree_only_cntr_info#:#Es werden nur Kategorien, Trainings und Gruppen aufgeführt. +administration#:#adm_show_comments_tagging_in_lists_tags#:#Einzelne Tags statt Anzahl auflisten +administration#:#adm_user_starting_point_info#:#Wählen Sie die Seite oder das Objekt, welche/s nach dem Login angezeigt wird. +administration#:#adm_user_starting_point_inherit_info#:#Es werden die Einstellungen übernommen, die von den Systemadministrator*innen für das ganze cate-System global aktiviert wurden. +administration#:#adm_user_starting_point_personal_info#:#Bei Aktivierung dürfen Benutzer*innen ihre Startseite selbst wählen. +administration#:#adm_user_starting_point_ref_id_info#:#Öffnen Sie das Objekt, das Sie als Persönliche Startseite festlegen wollen. Kopieren Sie aus der Browserzeile die Zahl hinter "ref_id=" und tragen Sie diese in das Eingabefeld ein. +administration#:#apache_auth_domains_description#:#Tragen Sie hier pro Zeile eine erlaubte Domain ein, zu der umgeleitet werden darf.
Ist cate unter einer eindeutigen Domain erreichbar, muss hierfür kein eigener Eintrag vorgenommen werden. Andernfalls tragen Sie bitte alle Domains ein.
Beispiel: example.com gestattet die Umleitung zu http://example.com und http://www.example.com sowie zu allen Seiten unterhalb der Domains. +administration#:#apache_enable_ldap#:#LDAP für Apache-Authentifizierung aktivieren +administration#:#apache_enable_local#:#Lokale Benutzerzuordnung für Apache-Authentifizierung aktivieren +administration#:#auth_by_user#:#Durch Benutzer +administration#:#auth_mode_determination_info#:#Hier können Sie festlegen, ob die Authentifizierungsmethode durch Benutzer*innen beim Login ausgewählt werden muss oder ob die Authentifizierungsdaten anhand einer vorgegebenen Reihenfolge überprüft werden sollen. +administration#:#cleaning#:#Bereinigen ... +administration#:#course_export#:#Sichtbar in der Trainingsteilnehmerverwaltung +administration#:#language_clear_local_changes_info#:#Setzt die Einträge dieser Sprache in der Datenbank auf die Standard-Einträge in der Datei lang/ilias_%s.lang zurück. Alle lokalen Änderungen oder Ergänzungen werden entfernt. +administration#:#language_former_file_description#:#Um Ihre lokalen Änderungen mit den Änderungen des letzten Updates zu vergleichen, kopieren Sie bitte die Original-Sprachdatei der vorher installierten Version in das oben angegebene Verzeichnis. Vor dem nächsten Update können Sie das mit der Option "Backup der Standard-Sprachdatei erzeugen" auf dem Reiter "Wartung" machen. +administration#:#language_note_translation#:#Die Seitenübersetzung wird für jede Sprache separat aktiviert. Zusätzlich muss der/die Benutzer*in die Rechte "Lesen" und "Schreiben" im Sprachordner haben. +administration#:#language_save_dist_info#:#Erzeugt ein Backup der Standard-Sprachdatei im externen Datenverzeichnis. Dies hilft nach einem Update, Konflikte von eigenen Änderungen mit aktualisierten Sprachvariablen zu finden. +administration#:#language_saved_dist#:#Das Backup der Standard-Sprachdatei wurde erzeugt. +administration#:#language_scope_merged_info#:#Exportiert die Standard-Sprachdatei aus dem System, in der alle lokalen Änderungen und Ergänzungen alphabetisch nach Modul und Sprachvariable eingemischt sind. Dies kann verwendet werden, um die Sprachdatei auf dem SVN-Server zu aktualisieren. +administration#:#prg_export#:#Sichtbar im Qualifizierungsprogramm +administration#:#purge_age_limit_desc#:#Wenn dieses Feld einen Wert enthält, werden nur Objekte, die vor mehr als der angegebenen Anzahl an Tagen gelöscht worden sind, aus dem System entfernt. +administration#:#purge_count_limit_desc#:#Wenn dieses Feld einen Wert enthält, wird höchstens die angegebene Anzahl an Objekten aus dem System entfernt. +administration#:#restoring#:#Wiederhergestellt +administration#:#restoring_missing_objs#:#Stelle verlorene Objekte wieder her +administration#:#user_criteria_desc#:#Eindeutiges Benutzermerkmal für den Import/Export von Testergebnissen. Das Merkmal wird benötigt, um eine*n identische*n Benutzer*in auf unterschiedlichen Systemen zu identifizieren. +administration#:#vc_information_not_determined#:#Es konnten keine Version-Control-Informationen ermittelt werden. +adn#:#administrative_notification_description#:#Bereitstellen systemweiter Ankündigungen in der Kopfzeile des Systems +adn#:#btn_reset_confirm#:#Möchten Sie diese Ankündigung für alle Benutzer*innen zurücksetzen? +adn#:#msg_dismissable_info#:#Benutzer*innen können Ankündigung schließen und sehen diese künftig nicht mehr. +adve#:#advanced_editing_tst_editing_desc#:#Aktiviert den Seiteneditor für Feedback- und Hinweistexte. +adve#:#adve_auto_url_linking_info#:#Das System durchsucht Textparagraphen nach URLs (z.B. "http://..") und verlinkt diese entsprechend automatisch. +adve#:#adve_grp_lm#:#cate-Lernmodule +adve#:#adve_grp_test#:#Test und Assessment +adve#:#adve_minutes_info#:#Zeitraum in Minuten bis die Seite wegen fehlender Aktivität wieder freigegeben und dann von anderen Benutzer*innen bearbeitet werden kann. +adve#:#adve_page_editor_settings#:#Seiteneditor +adve#:#char_selector_disabled_admin#:#Ω-Schaltfläche zur Aktivierung des Auswahlmenü für Sonderzeichen muss extra angeschaltet werden +adve#:#char_selector_disabled_info_admin#:#Das Auswahlmenü für Sonderzeichen (Unicode) ist für Tests und Fragenpools aktiviert, allerdings müssen Benutzer in den persönlichen Einstellungen entsprechende Einstellungen vornehmen oder der Test bzw. Fragenpool können im Reiter 'Einstellungen' so konfiguriert werden, dass das Auswahlmenü zur Verfügung steht. Test-Einstellungen setzen sich gegenüber Benutzer-Einstellungen durch. +adve#:#char_selector_disabled_info_test#:#Unabhängig von den Einstellungen der Benutzer*innen ist das Menü zu Auswahl der Sonderzeichen (Unicode) bei der Testdurchführung ausgeschaltet, Zeichen können nur über die Tastatur eingegeben werden. +adve#:#char_selector_enabled_admin#:#Ω-Schaltfläche zur Aktivierung des Auswahlmenü für Sonderzeichen wird standardmäßig angezeigt +adve#:#char_selector_enabled_info_admin#:#Das Auswahlmenü für Sonderzeichen (Unicode) ist aktiviert. Es enthält die Unicode Blöcke, die in dieser Einstellung ausgewählt werden. Benutzer*innen können aber individuelle Einstellungen in den persönlichen Einstellungen vornehmen oder Test können im Reiter "Einstellungen" so konfiguriert werden, dass das Auswahlmenü zur Verfügung steht. +adve#:#char_selector_enabled_info_test#:#Unabhängig von den Einstellungen der Benutzer*innen wird das Menü zu Auswahl der Sonderzeichen (Unicode) bei der Testdurchführung eingeblendet, Sonderzeichen können über das Menü eingegeben werden. +adve#:#char_selector_inactive_info_admin#:#Das Auswahlmenü für Sonderzeichen ist für die gesamte Plattform deaktiviert. Auch die Möglichkeit individuelle Einstellungen in den persönlichen Einstellungen oder im Reiter "Einstellungen" in Tests vorzunehmen ist ausgeblendet. +adve#:#char_selector_inherit_info_test#:#Je nach den Einstellungen in der Administration und den individuellen Einstellungen, die die Benutzer*innen in den persönlichen Einstellungen getroffen hat, wird das Auswahlmenü für Sonderzeichen (Unicode) im Testdurchlauf angezeigt oder auch nicht. +adve#:#char_selector_inherit_info_user#:#Es werden die Einstellungen übernommen, wie sie von den Systemadministrator*innen für das ganze cate-System global aktiviert wurden. +assessment#:#all_participants#:#Alle Teilnehmenden +assessment#:#ass_create_export_file_with_results#:#Erstelle Exportdatei (inkl. Ergebnisse der Teilnehmenden) +assessment#:#ass_mc_sel_lim_hint#:#Bitte wählen Sie maximal %s der %s Antworten! +assessment#:#ass_mc_sel_lim_setting_desc#:#Mit dieser Einstellung lässt sich die Anzahl der Antworten einschränken, die Teilnehmende auswählen können. +assessment#:#ass_process_lock_mode#:#Locking-Modus während der Einreichung von Lösungen durch Teilnehmende +assessment#:#ass_process_lock_mode_db_desc#:#Dieser Locking-Mechanismus erstellt Locks auf den entsprechenden Tabellen der Datenbank. Konkurrierende Prozesse für den/die selbe*n oder anderere Benutzer*innen im selben oder einem anderen Test für die selbe oder andere Fragen müssen warten, bis der andere Prozess den Lock wieder freigibt. +assessment#:#ass_process_lock_mode_file_desc#:#Dieser Locking-Mechanismus erstellt Locks auf leeren Dateien im Dateisystem. Konkurrierende Prozesse für den/die selbe*n Benutzer*in und den selben Test / die selbe Frage müssen warten, bis der andere Prozess den Lock wieder freigibt. +assessment#:#assessment_log_scoring_adjustment_activate#:#Verfügbare Fragentypen für den Nachkorrekturmodus +assessment#:#assessment_log_scoring_adjustment_desc#:#Gewählte Fragentypen stehen im Nachkorrekturmodus zur Verfügung. Diese Einstellung berücksichtigt nicht, ob die Frage im Nachkorrekturmodus bearbeitet werden kann. +assessment#:#assKprimChoice#:#Wahr-Falsch +assessment#:#assLongMenu#:#‘Long Menu’-Frage +assessment#:#autoparticipants_subtab#:#Teilnehmende +assessment#:#autosave_info#:#Die Antworten der Teilnehmenden auf die jeweils zuletzt geöffnete Frage wird von cate automatisch gespeichert. Diese automatisch gespeicherten Antworten gelten nicht als durch den Teilnehmenden autorisierte Antworten. Sie werden daher von cate bei der automatisierten Auswertung auch nicht berücksichtigt. Automatisch gespeicherte Antworten müssen immer manuell bewertet werden! Sie werden auch nicht in der Ergebnisansicht des jeweiligen Testteilnehmers angezeigt. Das automatische Speichern der Antworten ist nur für den Notfall gedacht, z. B. beim versehentlichen Schließen des Browserfensters! +assessment#:#back_to_objective_container#:#Zurück zum Training +assessment#:#cannot_edit_marks#:#Der Test wurde bereits von Teilnehmenden durchgeführt. Sie können die Bewertung nur ändern, wenn ein Datum für die Ergebnisausgabe eingestellt wurde, das aktuell noch in der Zukunft liegt. +assessment#:#confirm_delete_all_user_data#:#Sind Sie sicher, dass Sie die Testdaten aller Teilnehmenden des Tests entfernen wollen? +assessment#:#confirm_delete_single_user_data#:#Sind Sie sicher, dass Sie alle Testdaten der ausgewählten Teilnehmenden entfernen wollen? +assessment#:#delete_all_user_data#:#Testdaten aller Teilnehmenden entfernen +assessment#:#delete_all_user_data_confirmation#:#Wollen Sie wirklich die Testdaten aller Teilnehmenden löschen? +assessment#:#detailed_evaluation_missing_active_id#:#Sie müssen die detaillierte Statistik für eine(n) bestimmte(n) Teilnehmende(n) aufrufen! +assessment#:#ects_fx_threshold_info#:#Bitte geben Sie den Grenzwert an, ab dem durchgefallene Teilnehmende die ECTS-Note "FX" erhalten. +assessment#:#enable_examview_desc#:#Teilnehmende werden alle Fragen und die von ihnen gegebenen Antworten vor Abgabe des Tests präsentiert. +assessment#:#enter_anonymous_code#:#Zugangsschlüssel für anonymen Zugang +assessment#:#error_random_question_generation#:#Bei der Erzeugung von Zufallsfragen ist ein unbekannter Fehler aufgetreten. Bitte kontaktieren Sie die Systemadministrator*innen und geben Sie die folgende Information weiter: Das System konnte keine Aktivitäts-ID für die Benutzer-ID %s und die Test-ID %s erzeugen. +assessment#:#errortext_info#:#Bitte geben Sie einen Text ein. Um ein Wort als fehlerhaft zu markieren, setzen Sie bitte eine Raute (#) direkt vor das gewünschte Wort. Um eine Gruppe von Fehlerwörtern zu definieren, umklammern Sie die Wörter mit doppelten Klammern und lassen in diesem Fall das Rautezeichen weg. Beispiel: Dies ist ((ein Beispiel)) für mehrere falsche Wörter. Wichtig: bei einer Gruppe von Fehlerwörtern muss jedes einzelne ausgewählt werden, um die für die Gruppe vorgesehene Punktzahl zu erzielen. Wenn Sie auf die Schaltfläche "Text analysieren" klicken, werden die markierten Wörter für die weitere Bearbeitung extrahiert. +assessment#:#exam_id#:#cate-Prüfungsnummer: +assessment#:#exam_id_label#:#cate-Prüfungsnummer +assessment#:#examid_in_test_pass#:#cate-Prüfungsnummer anzeigen +assessment#:#examid_in_test_pass_desc#:#Im Test wird eine cate-Prüfungsnummer angezeigt. Für jeden Testdurchlauf wird eine eigene Nummer erzeugt. +assessment#:#examid_in_test_res#:#cate-Prüfungsnummer anzeigen +assessment#:#examid_in_test_res_desc#:#In den Testergebnissen wird die cate-Prüfungsnummer dargestellt. +assessment#:#feedback_checked#:#Zeige Rückmeldungen zu ausgewählten Antworten des/der Teilnehmenden. +assessment#:#filter_all_question_types#:#Alle Fragentypen +assessment#:#filter_show_question_types#:#Zeige folgende Fragentypen +assessment#:#finish_pass_for_all_users#:#Wollen Sie wirklich die Test Durchläufe für alle Teilnehmenden beenden? +assessment#:#finish_pass_for_all_users_in_processing_time#:#Sie können die Durchläufe aller Benutzer*innen nicht gemeinsam beenden, da für mindestens eine*n Benutzer*in die Bearbeitungszeit noch nicht vorbei ist. +assessment#:#finish_pass_for_user_confirmation#:#Wollen Sie den Test Durchlauf für den/die Teilnehmende(n) "%s" wirklich beenden? +assessment#:#finish_pass_for_user_in_processing_time#:#WARNUNG: die Bearbeitungszeit für diese*n Benutzer*in ist noch nicht vorbei! Sie sollten den Testlauf nur bei zwingendem Grund (z.B. Ausschluss vom Test) beenden. +assessment#:#finish_unfinished_passes_desc#:#Noch nicht beendete Testdurchläufe werden automatisch beendet – vorausgesetzt, es wurde für diese Tests ein Endzeitpunkt festgelegt oder Teilnehmende haben die maximale Bearbeitungsdauer überschritten. +assessment#:#fixed_participants_hint#:#Dieser Test ist nur für diese feste Gruppe von Teilnehmenden verfügbar. Wenn Sie den Test für beliebige Teilnehmende verfügbar machen wollen, müssen Sie die Auswahl im Kontrollkästchen für feste Teilnehmende in den Testeinstellungen ändern. +assessment#:#fixedparticipants_subtab#:#Ausgewählte Teilnehmende +assessment#:#kiosk_description#:#Die Prüfungsansicht zeigt den Test im Kiosk-Modus. Dabei werden alle Bildschirmelemente, die nicht zum Test gehören, ausgeblendet. Um Teilnehmende effektiv daran zu hindern, während des Tests andere Webseiten zu öffnen, setzen Sie bitte zusätzlich einen auf E-Klausuren spezialisierten Browser ein (z.B. den "Safe Exam Browser"). +assessment#:#kiosk_show_participant#:#Name des/der Teilnehmenden +assessment#:#kprim_answers_info#:#Der Multiple-Choice-Fragentyp "Vierfache Entscheidung richtig/falsch" (Typ K', genannt Kprim) zeichnet sich dadurch aus, dass auf eine Frage oder unvollständige Aussage vier Antworten oder Ergänzungen folgen. Für jede dieser vier Möglichkeiten muss jeweils entschieden werden, ob sie zutrifft (richtig/+) oder nicht zutrifft (falsch/-). Um die maximal erreichbare Punktezahl zu erhalten, müssen alle vier Antworten korrekt sein. +assessment#:#lacex_assTextSubset_StringResultExpression_d#:#Für die 2te Antwortoption wurde der Text „Natriumchlorid“ eingetragen +assessment#:#log_added_extratime#:#Es wurden zusätzliche %d Minuten Bearbeitungsdauer für die Teilnehmenden-ID %d hinzugefügt. +assessment#:#log_could_not_enter_test_due_to_simultaneous_users#:#Der Teilnehmer konnte den Test nicht starten, da die maximale Anzahl der gleichzeitiger Teilnehmer für dieses Training bereits erreicht ist. +assessment#:#log_manual_feedback#:#%s hat eine manuelle Bewertung für den/die Teilnehmende(n) %s und die Frage %s erstellt: %s. +assessment#:#log_selected_user_data_removed#:#Testdaten von Benutzer %s entfernen +assessment#:#log_user_answered_question#:#Ein*e Teilnehmende*r beantwortete eine Frage und erhielt %s Punkte. +assessment#:#log_user_entered_values#:#Der/die Teilnehmende hat Werte eingetragen. +assessment#:#log_user_not_entered_values#:#Der/die Teilnehmende hat keine Werte eingetragen. +assessment#:#log_user_solution_willingly_deleted#:#Der/die Teilnehmende hat seine Antwort entfernt. +assessment#:#log_wrong_test_password_entered#:#Der /die Teilnehmende hat ein falsches Testpasswort eingegeben. Eingabe: '%s' +assessment#:#longmenu_text#:#‘Long Menu’-Text +assessment#:#manscoring_done#:#Bereits bewertete Teilnehmende +assessment#:#manscoring_none#:#Nicht bewertete Teilnehmende +assessment#:#manscoring_not_allowed#:#Die manuelle Bewertung wurde für keinen Fragentyp aktiviert. Sie können daher diese Funktion nicht verwenden! +assessment#:#manscoring_questions_not_found#:#Dieser Testdurchlauf beinhaltet keine Fragentypen, die manuell bewertet werden können. +assessment#:#min_percentage_ne_0#:#Sie müssen einen minimalen Prozentsatz von 0 Prozent festlegen. Das Notenschema wurde nicht gespeichert. +assessment#:#no_user_or_group_selected#:#Bitte wählen Sie eine Zielgruppe aus, in der die Suche durchgeführt werden soll (Benutzer*innen und/oder Gruppen)! +assessment#:#option_label_custom#:#Durch Benutzer definierte Bezeichnungen +assessment#:#ordertext_info#:#Bitte geben Sie den Text in der Reihenfolge ein, in der er horizontal angeordnet werden soll. Die einzelnen Bestandteile werden durch Leerzeichen getrennt. Wenn Sie eine abweichende Trennung benötigen, verwenden Sie bitte den Trenner %s anstelle der Leerzeichen. +assessment#:#part_received_a_of_b_points#:#Der / die Teilnehmende hat %s von %s möglichen Punkten erreicht. +assessment#:#participants_invitation_description#:#Der Test kann nur von den Benutzer*innen durchgeführt werden, die im Reiter "Dashboard" hinzugefügt wurden. +assessment#:#participants_results_subtab#:#Alle Teilnehmenden +assessment#:#previous_question_rows#:#← Fragen %d - %d von %d +assessment#:#qpl_imagemap_preview_missing#:#Das System konnte keine temporäre Vorschaudatei mit den Imagemap-Regionen erzeugen. Statt dessen wird das Original-Bild angezeigt. Das bedeutet, dass entweder das ImageMagick-Werkzeug auf dem Webserver nicht korrekt konfiguriert ist oder dass Sie im temporären Verzeichnis nicht über Schreibrechte verfügen! Bitte kontaktieren Sie die Systemadministrator*innen. +assessment#:#qpl_import_non_ilias_files#:#Fehler: Die Importdatei enthält QTI-Dateien, die nicht von einem ILIAS-System erstellt wurden. Bitte kontaktieren Sie die Systemadministrator*innen, um einen Importfilter für Ihr QTI-Dateiformat zu bekommen. +assessment#:#qpl_import_verify_found_questions#:#Das System hat die folgenden Fragen in der Importdatei gefunden. Bitte wählen Sie die Fragen aus, die Sie importieren wollen. +assessment#:#qst_essay_wordcounter_enabled_info#:#Die eingegebenen Wörter werden gezählt. Die Anzahl der Wörter wird den Teilnehmenden unterhalb des Texteingabefeldes angezeigt. +assessment#:#qst_lifecycle#:#Lebenszyklus +assessment#:#qst_lifecycle_filter_all#:#Alle Lebenszyklen +assessment#:#question_marking_description#:#Teilnehmende erhalten die Möglichkeit, Fragen für sich zu markieren. Die Markierungen werden auch in der Übersicht "Bearbeitungsstand" angezeigt, sofern diese aktiviert ist. +assessment#:#question_type#:#Fragentyp +assessment#:#redirect_after_finishing_tst_desc#:#Teilnehmende werden nach Beenden des Tests automatisch zu einer definierten Webseite weitergeleitet. Dies geschieht nur, wenn der Test so konfiguriert wurde, dass die Teilnehmenden ihre Testergebnisse nach Beenden des Tests nicht einsehen können. +assessment#:#search_users#:#nach Benutzerkonto +assessment#:#select_one_user#:#Bitte wählen Sie mindestens eine*n Benutzer*in aus. +assessment#:#showinfo_desc#:#Den Benutzer*innen werden auf dem "Info"-Reiter alle Testeigenschaften angezeigt, z.B. Reihenfolge, Bewertung oder Ergebnisausgabe. +assessment#:#sign_submission_info#:#Das Signatur-Plugin muss installiert und aktiviert sein, damit Teilnehmende aufgefordert werden, ihre Testabgabe zu signieren. +assessment#:#test_has_datasets_warning_page_view#:#Der Test enthält bereits Datensätze von Teilnehmenden. Sie können die Fragen erst wieder bearbeiten, wenn Sie alle Datensätze löschen. +assessment#:#trainer#:#Referent +assessment#:#tst_access_code_created#:#Damit Sie dauerhaften Zugriff auf Ihre Testergebnisse haben und einen unterbrochenen Test wieder aufnehmen können, wurde für Sie ein persönlicher Zugangsschlüssel erzeugt. Bitte notieren Sie sich den nachfolgenden Code, um später den Test fortführen zu können. +assessment#:#tst_activation_online_info#:#Nur wenn der Test online geschaltet ist, können Benutzer*innen am Test teilnehmen. +assessment#:#tst_add_quest_cont_edit_mode#:#Editor für Rückmeldungen und Lösungshinweise +assessment#:#tst_add_quest_cont_edit_mode_IPE#:#Unformatierter Text für Fragen und Antworten und cate-Seiteneditor für Rückmeldungen und Lösungshinweise +assessment#:#tst_add_quest_cont_edit_mode_IPE_info#:#Bietet keine Formatierung von Text in Fragen und Antworten, erlaubt aber Gestaltung der Rückmeldungen und Lösungshinweise mit dem Seiteneditor und Wiederverwendung bei Fragen in cate-Lernmodulen. +assessment#:#tst_add_quest_cont_edit_mode_RTE_info#:#Erlaubt formatierten Text für Fragen, Antworten, Rückmeldungen und Lösungshinweise. Rückmeldungen und Lösungshinweise werden aber beim Einbinden von Fragen in cate-Lernmodule nicht übernommen. +assessment#:#tst_all_user_data_deleted#:#Die Daten aller Teilnehmenden wurden gelöscht! +assessment#:#tst_allowed_users#:#Anzahl gleichzeitiger Teilnehmender begrenzen +assessment#:#tst_allowed_users_desc#:#Das System prüft die Anzahl der gleichzeitigen Teilnehmenden des Tests. Wenn über die maximal erlaubte Anzahl hinaus weitere Benutzer*innen versuchen, den Test zu starten, werden sie am Zugriff gehindert. +assessment#:#tst_allowed_users_time_gap#:#Inaktivitätszeit der Teilnehmenden +assessment#:#tst_allowed_users_time_gap_desc#:#Teilnehmende die im Ablauf der angegeben Sekunden keinen Klick im Test ausführen, werden als "inaktiv" eingestuft und aus dem Test entfernt. +assessment#:#tst_answer_fixation_handling#:#Antworten der Teilnehmenden +assessment#:#tst_answer_fixation_none_desc#:#Solange ein Testdurchlauf nicht beendet ist, können Teilnehmende ihre Antworten beliebig verändern. +assessment#:#tst_answer_fixation_on_followup_question_desc#:#Nach dem Anzeigen der Folgefrage können die Teilnehmenden die Antwort auf die vorherige Frage nicht mehr verändern. +assessment#:#tst_answer_fixation_on_instant_feedback_desc#:#Wenn die Rückmeldung zu einer Frage gezeigt wird, können die Teilnehmenden ihre Antworten nicht mehr verändern. +assessment#:#tst_answer_fixation_on_instantfb_or_followupqst_desc#:#Teilnehmende können Antworten nicht mehr verändern, nachdem die Rückmeldung zur Frage oder die Folgefrage gezeigt wurde. +assessment#:#tst_attached_xls_file#:#Sie finden die Testergebnisse für diese*n Teilnehmer*in in der angehängten Excel-Datei. +assessment#:#tst_block_passes_after_passed_info#:#Nachdem ein*e Teilnehmer*in den Test bestanden hat, werden mit dieser Option keine weiteren Testdurchläufe erlaubt. +assessment#:#tst_change_workingtime#:#Zeitverlängerung für Teilnehmende erstellen +assessment#:#tst_confirm_submit_answers#:#Bitte bestätigen Sie, dass Sie den Test beenden und die gegebenen Antworten abschicken möchten. Nach dem Abschicken gibt es keine Möglichkeit mehr, Antworten einzugeben oder zu korrigieren. +assessment#:#tst_count_correct_solutions_desc#:#Teilnehmende erhalten entweder die maximale Punktzahl für vollständige und richtige Antworten oder 0 Punkte in allen anderen Fällen. Dies gilt auch für Fragen, welche Punkte für Teilantworten definieren. +assessment#:#tst_defaults_apply_not_possible#:#Das System konnte die ausgewählten Standardeinstellungen nicht auf diesen Test anwenden! Eventuell enthält dieser Test bereits Teilnehmerdatensätze, die verhindern, dass bestimmte Standardeinstellungen übernommen werden können. +assessment#:#tst_ending_time_desc#:#Zeitpunkt, ab dem Teilnehmer keine Antworten mehr abgeben können. Wichtig: Benutzen Sie diese Option nicht für E-Klausuren/Fernklausuren. Verwenden Sie stattdessen die Funktion „Bearbeitungsdauer begrenzen“, siehe unten. Nur dann wird der Test serverseitig beendet und die letzte Eingabe jedes Teilnehmers als autorisierte Antwort automatisch gespeichert. +assessment#:#tst_eval_total_finished#:#Gesamtzahl aller beendeten Tests (Benutzer, die die maximale Anzahl Testdurchläufe absolviert haben) +assessment#:#tst_exp_sc_short_desc#:#Im Reiter "Statistik" kann eine Export-Option "MS Excel" ausgewählt werden. Sie erzeugt ein zusätzliches Datenblatt für eine Item-Statistik außerhalb des Systems. Diese Option funktioniert nur für reine Single Choice-Tests. +assessment#:#tst_extratime_added#:#Die Bearbeitungszeit des/der Teilnehmer*in wurde um %s Minuten verlängert. +assessment#:#tst_extratime_info#:#Falls die Bearbeitungszeit eines Teilnehmers / einer Teilnehmerin mehrmals verlängert wird, geben Sie hier bitte die Summe aller Zeitverlängerungen für diese Person an. +assessment#:#tst_filter_lifecycle_enabled#:#Filter „Lebenszyklus“ verwenden +assessment#:#tst_finish_notification_desc#:#Pro Teilnehmer*in, der/die einen Test beendet, erhält der/die Besitzer*in des Tests eine Mail mit folgenden Informationen. +assessment#:#tst_hide_pagecontents_desc#:#Inhalte, die über den Button "Seite bearbeiten" vor und hinter dem eigentlichen Fragentext platziert wurden, werden in den Ergebnisansichten und der Druckausgabe nicht angezeigt. +assessment#:#tst_highscore_anon_description#:#Die Platzierungen anderer Teilnehmenden werden ohne Angabe der Namen angezeigt. Dies geschieht ohnehin bei anonymisierten Tests. +assessment#:#tst_highscore_description#:#Im Reiter "Ergebnisse" wird Teilnehmenden eine Ansicht "Platzierung" angezeigt. Teilnehmenden wird nach dem Anklicken eine Tabelle über das Abschneiden der verschiedenen Teilnehmenden im Test angezeigt. Sie müssen die Option "Teilnehmende sehen Testergebnisse" aktivieren, um diese Funktion zu nutzen. +assessment#:#tst_highscore_own_table_description#:#Teilnehmenden wird eine Tabelle mit ihrem Rang innerhalb aller Platzierungen angezeigt. +assessment#:#tst_highscore_top_table_description#:#Teilnehmenden wird eine Tabelle mit den besten Platzierungen angezeigt. +assessment#:#tst_import_verify_found_questions#:#Das System hat die folgenden Fragen in der Importdatei gefunden. Bitte wählen Sie die Fragen aus, die Sie mit diesem Test importieren wollen. +assessment#:#tst_inp_all_quest_points_equal_per_pool_desc#:#Wenn aktiviert, werden nur Fragenpools zur Auswahl angeboten, deren Fragen die gleiche Punktzahl haben. Dieser Test wird dann die gleiche maximale Punktezahl für alle Teilnehmenden haben, wodurch die Testergebnisse besser miteinander vergleichbar sind. Diese Vorgehensweise wird empfohlen. +assessment#:#tst_insert_questions_and_results#:#Dieser Test wurde bereits von %s Benutzer*innen durchgeführt. Das Hinzufügen von Fragen wird dazu führen, dass alle bestehenden Testergebnisse dieses Tests gelöscht werden! Sind Sie sicher, dass Sie die folgende*n Frage*n hinzufügen wollen? +assessment#:#tst_instant_feedback_answer_generic_desc#:#Ist die Antwort vollständig richtig, so zeigt das System beim Anklicken der "Rückmeldung anfordern"-Schaltfläche eine hinterlegte Rückmeldung an. Andernfalls wird eine andere Rückmeldung angezeigt. Beide Versionen müssen im Reiter "Rückmeldung" der Frage hinterlegt werden. +assessment#:#tst_instant_feedback_answer_specific_desc#:#Bei Anklicken der "Rückmeldung anfordern"-Schaltfläche zeigt das System zu jeder abgegebenen Antwort die jeweils hinterlegte Rückmeldung an. Nicht alle Fragentypen unterstützen diese Art von Rückmeldungen. Die Rückmeldungen müssen im Reiter "Rückmeldung" der Frage hinterlegt werden. +assessment#:#tst_instant_feedback_desc#:#Sofern Fragen mit Rückmeldungen versehen sind, stehen diese den Teilnehmenden während des Tests zur Verfügung. +assessment#:#tst_instant_feedback_results_desc#:#Klicken Teilnehmende beim Beantworten einer Frage auf die Schaltfläche "Rückmeldung anfordern" zeigt das System an, wie viele Punkte für die gegebene Antwort erreichen wurden. +assessment#:#tst_instant_feedback_solution_desc#:#Bei Anklicken der "Rückmeldung anfordern"-Schaltfläche zeigt das System die bestmögliche Lösung der Frage an. +assessment#:#tst_instant_feedback_trigger_manual#:#Teilnehmende können die Rückmeldung selbst auslösen +assessment#:#tst_instant_feedback_trigger_manual_desc#:#Die Rückmeldung steht Teilnehmenden zur Verfügung, wird aber erst gezeigt, wenn der/die Teilnehmende diese auslöst. +assessment#:#tst_introduction_desc#:#Zeigt einen Einleitungstext auf dem "Info"-Reiter des Tests an. Der Text ist bereits vor Beginn des Tests zugänglich. +assessment#:#tst_invited_nobody#:#Es wurden keine Benutzer*innen, Gruppen oder Rollen als feste Teilnehmende hinzugefügt. +assessment#:#tst_invited_selected_users#:#Die ausgewählten Benutzer*innen wurden als feste Teilnehmende hinzugefügt. +assessment#:#tst_man_scoring_by_part#:#Bewertung nach Teilnehmenden +assessment#:#tst_max_allowed_users_heading#:#Die maximale Anzahl von gleichzeitiger Teilnehmende für diesen Test wurde erreicht +assessment#:#tst_max_allowed_users_message#:#Die maximale Anzahl gleichzeitiger Teilnehmender für diesen Test wurde erreicht. Bitte versuchen Sie etwas später wieder, den Test zu starten oder fortzusetzen. Wenn aktive Teilnehmende für mehr als %s Sekunden inaktiv sind, besteht für Sie die Möglichkeit, an diesem Test teilzunehmen. Wir danken Ihnen für Ihr Verständnis. +assessment#:#tst_msg_cannot_modify_dynamic_question_set_conf_due_to_part#:#Konfiguration für fortlaufende Fragenauswahl kann nicht geändert werden, da bereits Teilnahmeergebnisse vorliegen. +assessment#:#tst_msg_cannot_modify_random_question_set_conf_due_to_part#:#Die Konfiguration für die zufällige Fragenauswahl kann nicht geändert werden, da bereits Teilnahmeergebnisse vorliegen. +assessment#:#tst_msg_rand_quest_set_pass_not_buildable#:#Mit der aktuellen Auswahl an Fragenpools und der Fragenanzahl kann kein Test mit zufälliger Fragenauswahl erzeugt werden.
+assessment#:#tst_no_evaluation_data#:#Es liegen (noch) keine Teilnahmeergebnisse vor. +assessment#:#tst_nr_of_tries_desc#:#Maximale Anzahl der Testdurchläufe, die Teilnehmende absolvieren können. +assessment#:#tst_old_style_rnd_quest_set_broken#:#Dieser Test mit zufälliger Fragenauswahl befindet sich in einem irreparablen Zustand, da angeschlossene Fragenpools gelöscht wurden. Aus diesem Grund können Teilnehmende diesen Test nicht länger absolvieren. +assessment#:#tst_participant#:#Teilnehmende +assessment#:#tst_participant_status#:#Teilnahmestatus +assessment#:#tst_participating_users#:#Teilnehmende +assessment#:#tst_pass_best_pass_desc#:#Es wird der Testdurchlauf bewertet, bei dem der/die Teilnehmende die höchste Punktezahl erreicht hat. Diese Einstellungen greift nur, wenn mehrere Testdurchläufe durchgeführt werden können. +assessment#:#tst_pass_deletion_allowed#:#Durchläufe, die nicht zur Bewertung verwendet werden, können gelöscht werden. +assessment#:#tst_pass_deletion_not_allowed#:#Das Löschen von Durchläufen ist nicht möglich. +assessment#:#tst_pass_last_pass_desc#:#Es wird immer der letzte Testdurchlauf eines/einer Teilnehmer*in bewertet. +assessment#:#tst_pass_overview_for_participant#:#Testdurchläufe für %s +assessment#:#tst_pass_overview_header_lo_initial_all_objectives#:#Einstiegstestergebnisse
zu den Lernzielen im Training %s +assessment#:#tst_pass_overview_header_lo_initial_per_objective#:#Einstiegstestergebnisse
zum Lernziel %s im Training %s +assessment#:#tst_pass_overview_header_lo_qualifying_all_objectives#:#Qualifizierende Testergebnisse
zu den Lernzielen im Training %s +assessment#:#tst_pass_overview_header_lo_qualifying_per_objective#:#Qualifizierende Testergebnisse
zum Lernziel %s im Training %s +assessment#:#tst_password_details#:#Wird ein Testpasswort definiert, müssen Teilnehmende dieses eingeben, um den Test starten oder fortsetzen zu können. Dies betrifft auch laufende Testdurchläufe. +assessment#:#tst_postpone_off_desc#:#Auch wenn Teilnehmende Antworten verwerfen oder Fragen überblättern, verbleiben die Fragen an ihrer Position im Test. Diese Einstellung wirkt sich nicht auf den Modus "Wiedervorlage" aus. +assessment#:#tst_postpone_on_desc#:#Fragen, deren Antworten die Teilnehmenden verwerfen oder überblättern, präsentiert das System am Ende des Test noch einmal. Diese Einstellung wirkt sich nicht auf den Modus "Wiedervorlage" aus. +assessment#:#tst_question_set_type_dynamic_desc#:#Allen Teilnehmenden werden nach und nach alle Fragen aus einem definierten Fragenpool gestellt. Falsch beantwortete Fragen legt das System erneut vor. Auch Fragen bereits laufender Tests können hinzugefügt oder geändert werden. +assessment#:#tst_question_set_type_fixed_desc#:#Allen Teilnehmende werden die gleichen Fragen gestellt. +assessment#:#tst_question_set_type_random_desc#:#Jedem/jeder Teilnehmer*in werden unterschiedliche Fragen gestellt. Die Auswahl der Fragen erfolgt zufällig aus einem oder mehreren Fragenpools. +assessment#:#tst_question_type#:#Fragentyp +assessment#:#tst_remove_questions_and_results#:#Dieser Test wurde bereits von %s Benutzer*innen bearbeitet. Das Entfernen von Fragen wird alle bestehenden Ergebnisse zu diesem Test löschen. Sind Sie sicher, dass Sie die folgende*n Frage*n entfernen wollen? +assessment#:#tst_results_access_always_desc#:#Teilnehmende können ihre Ergebnisse schon während eines Testdurchlaufs über den "Ergebnisse"-Reiter einsehen. Zu dem werden sie direkt nach Abschluss des Testdurchlaufs dort hin geleitet. +assessment#:#tst_results_access_date_desc#:#Erst ab dem gewählten Datum können Teilnehmende Ihre Ergebnisse im "Ergebnis"-Reiter einsehen. +assessment#:#tst_results_access_enabled#:#Teilnehmende sehen Testergebnisse +assessment#:#tst_results_access_enabled_desc#:#Teilnehmende erhalten Zugriff auf Ihre Testergebnisse über einen Reiter "Ergebnisse". +assessment#:#tst_results_access_finished_desc#:#Teilnehmende sehen ihre Ergebnisse direkt nach Abschluss eines Testdurchlaufs. Sie können ihre Ergebnisse danach jederzeit im "Ergebnisse"-Reiter einsehen. +assessment#:#tst_results_access_passed_desc#:#Teilnehmende sehen ihre Ergebnisse nachdem sie den Test bestanden haben. Sie können ihre Ergebnisse dann jederzeit im "Ergebnisse"-Reiter einsehen. +assessment#:#tst_results_grading_opt_show_mark_desc#:#Die resultierende Note wird in der Übersicht der Testergebnisse angezeigt. Teilnehmende können die Testergebnisse über den Reiter "Ergebnisse" einsehen. +assessment#:#tst_results_grading_opt_show_status_desc#:#Der Status "Bestanden" / "Nicht bestanden" wird in der Übersicht der Testergebnisse angezeigt. Teilnehmende können die Testergebnisse über den Reiter "Ergebnisse" einsehen. +assessment#:#tst_score_cut_question_desc#:#Bei der Vergabe negativer Punkte für einzelne Antwortoptionen können Teilnehmende mit der Beantwortung einer Frage Minuspunkte erzielen. Mit dieser Einstellung werden die erreichten Minuspunkte pro Frage auf 0 Punkte gesetzt. +assessment#:#tst_score_mcmr_use_scoring_system_desc#:#Eine zusätzliche Option "Keine der obigen" erlaubt es, leere Antworten zu speichern. Die nicht ausgewählten Optionen werden so bewertet, wie in der Frage definiert ist. Diese Einstellung ist nur noch für bestehende Tests verfügbar und wird in einer folgenden Version nicht mehr unterstützt. +assessment#:#tst_score_mcmr_zero_points_when_unanswered_desc#:#Antworten ohne ausgewählte Option werden nicht gespeichert. Die Teilnehmende erhalten 0 Punkte auf diese Fragen. +assessment#:#tst_selected_user_data_deleted#:#Die Testdaten der ausgewählten Benutzer*innen wurden erfolgreich gelöscht. +assessment#:#tst_setting_enable_obligations_info#:#Nur wenn alle verpflichtenden Fragen beantwortet wurden, kann ein Test abgegeben werden. Autoren definieren verpflichtende Fragen in der 'Listenansicht'. Für Teilnehmende sollte die Option "Fragenliste und Bearbeitungstand anzeigen" aktiviert sein. +assessment#:#tst_setting_offer_hints_info#:#Teilnehmende können Lösungshinweise anfordern, um eine Frage zu beantworten. Pro gegebenem Lösungshinweis verringern sich die Punkte für die richtige Antwort. +assessment#:#tst_show_cancel_description#:#Zeigt während der Durchführung des Tests eine Schaltfläche an, mit der der Test unterbrochen werden kann. Achtung: Das Unterbrechen des Tests hält nicht die unter "Maximale Bearbeitungsdauer" festgelegte Bearbeitungszeit an. +assessment#:#tst_show_pass_details#:#Tabelle mit detaillierten Testergebnissen pro Durchlauf zum gewählten Zeitpunkt anzeigen +assessment#:#tst_show_pass_details_desc#:#Zum oben gewählten Zeitpunkt wird die Bekanntgabe des Ergebnisses um eine weitere Tabelle ergänzt. In dieser Tabelle werden für jeden Durchlauf die Titel der Fragen und die erreichten Punkte angezeigt. Andernfalls erscheint diese Tabelle nur nach dem letzten erlaubten Testdurchlauf (einzustellen im Unterreiter "Allgemeine Einstellungen", Option "Anzahl von Testdurchläufen begrenzen") oder nach dem Ende des Tests (einzustellen im Unterreiter "Allgemeine Einstellungen", Abschnitt "Ende"). Der Inhalt der Tabelle kann im Abschnitt "Details Testergebnisse" weiter ergänzt werden. +assessment#:#tst_show_solution_answers_only_desc#:#Wenn "Druckausgabe der Ergebnisse (nur Antworten)" ausgewählt ist, werden Inhalte, die Sie über den "Inhalt bearbeiten"-Reiter der Fragen vor und hinter dem eigentlichen Fragentext platzieren können, in einem Ausdruck nicht angezeigt. +assessment#:#tst_show_solution_compare#:#Zeige bestmögliche Lösung in "Tabelle mit detaillierten Testergebnissen" +assessment#:#tst_show_solution_compare_desc#:#Teilnehmende wird als Teil der "Tabelle mit detaillierten Testergebnissen" eine Übersicht präsentiert, welche ihre eigenen Antworten und die bestmögliche Lösung gegenüberstellt.
Diese Übersicht wird nicht im Unterreiter "Bewertete Antworten" des "Ergebnisse"-Reiters angezeigt, auch wenn diese Einstellung hier vorgenommen wird. +assessment#:#tst_show_solution_details_desc#:#Teilnehmende bekommen zusätzlich zur "Tabelle mit detaillierten Testergebnissen" auf einer neuen Seite für jede einzelne Frage angezeigt, welche Antworten sie gegeben haben, ob diese Antworten richtig waren und wie viele Punkte sie mit diesen Antworten erreicht haben. +assessment#:#tst_show_solution_feedback_desc#:#Falls Rückmeldungen zu den gegebenen Antworten bei der Frage hinterlegt worden sind, werden diese angezeigt. Sie müssen die Option "Bewertete Teilnehmerantworten" und/oder "Druckbare Liste der Antworten" aktivieren, um diese Funktion zu nutzen. +assessment#:#tst_show_solution_printview_desc#:#Teilnehmende wird eine Übersicht mit ihren Antworten zu den einzelnen Testfragen angezeigt. Diese Übersicht wird nach Beendigung innerhalb des "Ergebnisse"-Reiters in einem Unterreiter "Bewertete Antworten" angeboten. +assessment#:#tst_show_solution_signature_desc#:#Es wird im Ausdruck ein Platzhalter für die Unterschrift des/der Testteilnehmer*in angezeigt. Sie müssen, um diese Funktion zu nutzen, zusätzlich die Option "Tabelle mit detaillierten Testergebnissen" aktivieren. +assessment#:#tst_show_solution_suggested_desc#:#Falls den Fragen im Test Inhalte zur Wiederholung des Stoffs zugeordnet wurden, werden diese in der "Tabelle mit detaillierten Testergebnissen" angezeigt. Teilnehmende können so etwaige Wissenslücken schließen. Sie müssen, um diese Funktion zu nutzen, zusätzlich die Option "Tabelle mit detaillierten Testergebnissen" aktivieren. +assessment#:#tst_show_summary_description#:#Teilnehmende können sich links neben den Testfragen eine Fragenliste anzeigen lassen. Mit der Schaltfläche "Bearbeitungsstand" rufen die Teilnehmende eine Übersicht auf, die zeigt, welche Fragen sie jeweils bereits bearbeitet oder markiert haben. Das Verhalten der Übersicht "Bearbeitungsstand" können Sie noch weiter konfigurieren: +assessment#:#tst_shuffle_questions_description#:#Die Reihenfolge der Fragen wird pro Teilnehmer*in und pro Testdurchlauf neu gemischt. +assessment#:#tst_skill_triggerings_num_req_answers_not_reached_warn#:#Mindestens eine im Test adressierte Kompetenz ist nicht ausreichend vielen Fragen zugeordnet. Für diese Kompetenzen werden keine Kompetenzeinträge für die Teilnehmende erfasst.Die Mindestanzahl für zugewiesene Fragen: %s +assessment#:#tst_starting_time_desc#:#Zeitpunkt, ab dem der Test begonnen werden kann. Das Klicken der Schaltfläche "Test starten" ist möglich, und Teilnehmende können Fragen beantworten. +assessment#:#tst_stat_result_rank_participant#:#Rang der Teilnehmenden +assessment#:#tst_stat_result_total_participants#:#Gesamtzahl der Teilnehmenden +assessment#:#tst_tbl_invited_users#:#Ausgewählte Teilnehmende +assessment#:#tst_tbl_participants#:#Teilnehmende +assessment#:#tst_use_previous_answers_description#:#Zeigt Teilnehmende die Antworten aus dem vorherigen Testdurchlauf an. Die Option muss vom den Teilnehmende vor Beginn des Tests auf dem Reiter "Info" per Checkbox aktiviert werden. +assessment#:#tst_user_finished_test#:#Ein*e Teilnehmer*in hat den Test beendet (%s). +assessment#:#use_ects_fx#:#Verwenden der ECTS-Note "FX" +assessment#:#user_has_finished_a_test#:#Ein*e Teilnehmer*in hat einen Test beendet. +assessment#:#user_not_invited#:#Sie sind kein*e Teilnehmer*in der Prüfung. +assessment#:#with_solutions_participants#:#Teilnehmende mit Antworten +assessment#:#without_solutions_participants#:#Teilnehmende ohne Antworten +auth#:#auth_account_code_info#:#Um Ihr Benutzerkonto zu reaktivieren, können Sie einen Benutzerkonten-Code benutzen. +auth#:#auth_account_code_used#:#Ihr cate-Benutzerkonto wurde re-aktiviert. Bitte loggen Sie sich zur Sicherheit erneut ein. +auth#:#auth_account_migration#:#Neues Benutzerkonto +auth#:#auth_allow_local_info#:#Wenn aktiviert, ist die lokale Authentifizierung gegen die Datenbank mit Anmeldename/Passwort auch für jene Benutzerkonten möglich, deren Authentifizierungsmodus SAML ist. +auth#:#auth_err_login_attempts_deactivation#:#Das Benutzerkonto wurde wegen zu vieler falscher Login-Versuche deaktiviert. +auth#:#auth_info_add#:#Wählen Sie diese Einstellung, falls Sie sich noch nie für cate registriert haben. In diesem Fall wird ein neues Benutzerkonto angelegt. +auth#:#auth_info_migrate#:#Wenn Sie bereits ein Benutzerkonto besitzen, geben Sie bitte den Anmeldenamen und das Passwort ein, um Ihre persönlichen Daten (Mails, Testergebnisse ...) zu übernehmen. +auth#:#auth_oidc#:#OpenID Connect +auth#:#auth_oidc_login_element_info#:#Bei cate anmelden über OpenID Connect +auth#:#auth_oidc_mapping_table#:#Zuordnung von Benutzerdaten zu OpenID-Connect-Attributen +auth#:#auth_oidc_role_mapping_table#:#Zuordnung von Rollen zu OpenID-Connect-Attributen +auth#:#auth_oidc_settings_default_role_info#:#Bitte wählen Sie eine globale Rolle für neu anzulegende Benutzer*innen. +auth#:#auth_oidc_settings_login_option_enforce_info#:#Eine Anmeldung beim OpenID-Connect-Server ist in jedem Fall notwendig – auch wenn bereits eine gültige Sitzung vorliegt. +auth#:#auth_oidc_settings_logout_scope_global_info#:#Wenn aktiviert, wird beim Abmelden sowohl die OpenID-Connect-Sitzung als auch die cate-Sitzung beendet. +auth#:#auth_oidc_settings_logout_scope_local#:#nur bei cate abmelden +auth#:#auth_oidc_settings_logout_scope_local_info#:#Wenn aktiviert, wird beim Abmelden nur die cate-Sitzung beendet. +auth#:#auth_oidc_settings_title#:#OpenID Connect Authentifizierung konfigurieren +auth#:#auth_oidc_settings_user_sync_info#:#Wenn aktiviert, wird für Benutzer*innen, die sich erfolgreich gegen OpenIDConnect authentifiziert haben, aber kein cate-Benutzerkonto besitzen, automatisch ein neues Benutzerkonto erzeugt. +auth#:#auth_saml_login_form_info#:#Falls aktiviert und es mindestens einen aktiven IDP gibt, wird auf der Anmeldeseite eine Schaltfläche angezeigt, der bei Klick einen SAML-Request initiiert. +auth#:#auth_saml_migration_info#:#Aktivieren Sie diese Einstellung, um neuen Benutzer*innen die Möglichkeit zu bieten, eventuell vorhandene cate Benutzerkonten auf SAML-Authentifizierung umzustellen. +auth#:#auth_saml_sync_info#:#Wenn aktiviert, wird automatisch ein cate-Benutzerkonto für Personen angelegt, wenn sich diese erfolgreich gegen SAML authentifiziert haben, bisher aber noch nicht über einen cate-Benutzerkonto verfügen. Des Weiteren werden bei Aktivierung bereits vorhandene Benutzerkonten aktualisiert. +auth#:#auth_saml_uid_claim_info#:#Definieren Sie hier das Attribut, anhand dessen das System bei der Authentifizierung ermitteln kann, ob ein Benutzerkonto bereits existiert, oder ob es sich um ein bereits vorhandenes Benutzerkonto handelt. +auth#:#auth_saml_username_claim_info#:#Definieren Sie hier das Attribut, anhand dessen das System den Anzeigenamen/Anmeldenamen generieren soll. +auth#:#err_auth_saml_failed#:#Die Authentifizierung ist fehlgeschlagen. Bitte kontaktieren Sie die Systemadministrator*innen. +auth#:#err_auth_saml_no_ilias_user#:#Die Authentifizierung ist fehlgeschlagen. Bitte kontaktieren Sie die Systemadministrator*innen. +auth#:#login_page_switch_ipe#:#Seiteneditor verwenden +awrn#:#awrn_hide_from_awareness_info#:#Die „Wer ist online?“-Anzeige erscheint oben im Kopf der Anwendung und listet ausgewählte Benutzer auf (z.B. Kontakte oder Mitglieder Ihrer Trainings). +blog#:#blog_allow_html_info#:#Benutzer*innen können HTML oder Javascript in Ihren Blog-Einträgen verwenden. Dies kann zu Sicherheitsproblemen führen. +blog#:#blog_contribute_other_roles#:#Neben den eingetragenen Blog-Autor*innen können auch Benutzer*innen mit einer der folgenden Rollen Einträge hinzufügen: %s. +blog#:#blog_enable_approval_info#:#Alle Beiträge müssen von Benutzer*innen mit dem Recht "Einstellungen bearbeiten" freigeschaltet werden, bevor sie für andere Benutzer*innen sichtbar werden. +blog#:#blog_number_users_notes_or_comments#:#Anzahl der Benutzer*innen, die zu diesem Beitrag Notizen oder Kommentare verfasst haben. +blog#:#blog_posting_edit_approval_info#:#Der Beitrag muss vor der Veröffentlichung durch die Referent*innen freigeschaltet werden. +cert#:#certificate_migration_confirm_start#:#Ihre Zertifikate bleiben seit ILIAS 5.4 immer in Ihrer Hand. Auch wenn Trainings, Tests oder Lernmodule gelöscht werden, können Sie weiterhin auf alle erworbenen Zertifikate zugreifen. Um diese neue Funktion zu nutzen, müssen Sie Ihre alten Zertifikate einmalig migrieren. +cert#:#error_creating_certificate_pdf#:#Das Zertifikat konnte nicht erstellt werden. Bitte lassen Sie den Zertifikatsserver durch die Systemadministrator*innen prüfen. +certificate#:#cert_cron_task_desc#:#Aufgabe dieses Jobs ist die Abarbeitung eingereihter Lernerfolge zur Datenverarbeitung für und Generierung von persistenten Zertifikaten für Benutzer*innen an Lernobjekten. +certificate#:#certificate_learning_progress_must_be_active#:#Nur Objekte mit aktivem Lernfortschritt dürfen ausgewählt werden. Bei folgenden Objekten ist der Lernfortschritt nicht aktiv: %s +certificate#:#certificate_ph_birthday#:#Geburtstag des/der Teilnehmenden +certificate#:#certificate_ph_city#:#Stadt der Adresse des/der Teilnehmenden +certificate#:#certificate_ph_country#:#Land der Adresse des/der Teilnehmenden +certificate#:#certificate_ph_department#:#Abteilung des/der Teilnehmenden +certificate#:#certificate_ph_firstname#:#Vorname des/der Teilnehmenden +certificate#:#certificate_ph_fullname#:#Name des/der Teilnehmenden (Titel, Vorname und Nachname) +certificate#:#certificate_ph_institution#:#Institution des/der Teilnehmenden +certificate#:#certificate_ph_lastaccess#:#Datum und Uhrzeit des letzten Zugriffs des/der Teilnehmenden +certificate#:#certificate_ph_lastname#:#Nachname des/der Teilnehmenden +certificate#:#certificate_ph_matriculation#:#Matrikelnummer des Benutzerkontos +certificate#:#certificate_ph_resultpercent#:#Erreichte Gesamtprozentzahl des/der Teilnehmenden +certificate#:#certificate_ph_resultpoints#:#Erreichte Punkte des/der Teilnehmenden +certificate#:#certificate_ph_street#:#Straße der Adresse des/der Teilnehmenden +certificate#:#certificate_ph_title#:#Titel des/der Teilnehmenden +certificate#:#certificate_ph_zipcode#:#Postleitzahl der Adresse des/der Teilnehmenden +certificate#:#certificate_text_info#:#Bitte geben Sie hier den Text des Zertifikats ein. Falls der WYSIWYG-Edtior in der cate-Administration deaktiviert wurde, können Sie hier dennoch gültiges XHTML zur Formatierung nutzen. +certificate#:#certificate_usage#:#Bitte beachten Sie, dass die Verwendung und Erstellung von Zertifikaten nur möglich ist, wenn Sie den Java-Server verwenden. Der Java-Server wird in der Hauptseite der Administration in der Kategorie Web-Services konfiguriert und ist unter anderem für die Generierung von PDF-Dateien erforderlich. +certificate#:#certificate_var_user_institution#:#cate +certificate#:#certificate_visibility_introduction#:#Den Teilnehmende wird in der Ergebnisansicht des Tests das Zertifikat zum Herunterladen angeboten. +certificate#:#certificate_visibility_passed#:#Nur sichtbar, wenn der/die Teilnehmende den Test bestanden hat +certificate#:#certificate_visibility_passed_exercise#:#Nur sichtbar, wenn der/die Teilnehmende die Übung bestanden hat +certificate#:#persistent_certificate_mode_instant_info#:#Diese Option wird für Systeme mit geringer bis zu mittelgroßer Benutzerinteraktion empfohlen. Für Systeme, die zu hoher Last während der Zertifikatserstellung neigen, wird die Option "Cron-Job" empfohlen. +cmps#:#cmps_ilias_max_version#:#Maximale Kern-Version +cmps#:#cmps_ilias_min_version#:#Minimale Kern-Version +cmps#:#cmps_needs_matching_ilias_version#:#Dieses Plugin kann nicht mit der aktuellen Version dieser cate-Installation verwendet werden. +cmps#:#cmps_needs_newer_ilias_version#:#Dieses Plugin kann nur mit einer neueren Version verwendet werden. Bitte aktualisieren Sie Ihre Version. +cmps#:#cmps_needs_newer_plugin_version#:#Diese Version benötigt eine neuere Plugin-Version. Bitte aktualisieren Sie das Plugin. +cmps#:#cmps_plugin_uninstalled#:#Alle Sprach- und Datenbankeinträge, die sich auf das Plugin beziehen, wurden gelöscht und das Plugin deaktiviert. Sie können jetzt das Verzeichnis und den Quellcode des Plugins aus dem 'Customizing'-Verzeichnis entfernen, um das Plugin endgültig zu deinstallieren. +cmps#:#cmps_provider_provider#:#Konfiguration von Trainingsanbieter +cmps#:#cmps_provider_tags#:#Konfiguration von Tags +cmps#:#cmps_provider_trainer#:#Konfiguration von Trainingspersonal +cmps#:#provider_provider#:#Trainingsanbieter -> Trainingsanbieter +cmps#:#provider_tags#:#Trainingsanbieter -> Tags +cmps#:#provider_trainer#:#Trainingsanbieter -> Trainingspersonal +cmps#:#venues_tags#:#Veranstaltungsorte -> Tags +cmps#:#venues_tags_search#:#Veranstaltungsorte -> Tags für Trainingssuche +cmps#:#venues_venues#:#Veranstaltungsorte -> Veranstaltungsorte +cntr#:#cntr_container_only_on_their_own#:#Kategorien, Trainings, Gruppen, Ordner und Qualifizierungsprogramme können nur einzeln kopiert werden. Bitte wählen Sie nur ein solches Objekt aus. +cntr#:#cntr_old_editor_warning#:#Dieser Editor wird aus technischen Gründen in einer der nächsten Versionen nicht mehr weiter unterstützt. Er kann noch für die Bearbeitung dieser Seite genutzt werden. Wir empfehlen aber, auf die Nutzung des Standard-Seiteneditors umzusteigen, wenn dies möglich ist. +cntr#:#cntr_ordering#:#Sortieren +cntr#:#container_import_zip_file_invalid#:#Die hochgeladene Datei ist kein gültiger Export. Um Verzeichnisstrukturen hochzuladen, benutzen Sie bitte ein Datei-Objekt. +common#:#accept_usr_agreement_intro#:#Es liegen neue Nutzungsbedingungen vor. Sie müssen sie akzeptieren, bevor Sie mit der Nutzung von cate fortfahren können. Lesen Sie das folgende Dokument sorgfältig durch und geben Sie unten auf der Seite Ihre Zustimmung oder Ablehnung. +common#:#access_free_granted#:#Unbeschränkten Zugriff für die ausgewählten Benutzer*innen aktivieren. +common#:#access_restricted#:#Unbeschränkten Zugriff für die ausgewählten Benutzer*innen deaktivieren. +common#:#account_expires_body#:#Ihr Benutzerkonto %s auf der cate-Instanz %s läuft am %s ab. Nach diesem Datum wird der Zugang zu cate mit diesem Konto nicht mehr möglich sein. Um Ihre persönlichen Dokumente und Zertifikate zu sichern, laden Sie diese bitte rechtzeitig herunter. +common#:#account_expires_subject#:#Ihr cate-Benutzerkonto läuft bald aus! +common#:#add_user#:#Lokal verwaltetes Benutzerkonto hinzufügen +common#:#administrate_users_headline#:#Lokal verwaltete Benutzerkonten dieser Kategorie +common#:#administrator#:#Systemadministrator +common#:#advanced_editing_rep_page_editing_desc#:#Diese Funktion ermöglicht das Hinzufügen von Text und Medien zu einer Kategorie, einem Ordner und zu den Inhaltsseiten von Trainings und Gruppen. Wenn die Funktion deaktiviert wird, werden bereits existierende Texte/Medien nicht mehr angezeigt. +common#:#all_users#:#Alle Benutzerkonten +common#:#allow_assign_users#:#Benutzerzuweisung für lokale Administration erlauben +common#:#assessment_log_manual_scoring_desc#:#Wenn die manuelle Bewertung für einen Fragentyp aktiviert ist, können alle Fragen dieses Fragentyps vom Testautor manuell bewertet werden. Seien Sie bitte vorsichtig mit diesen Einstellungen, da das nachträgliche Ändern von Fragenergebnissen eventuell zu rechtlichen Problemen führen kann! +common#:#assf_allowed_questiontypes#:#Verfügbare Fragentypen +common#:#assf_allowed_questiontypes_desc#:#Alle ausgewählten Fragentypen werden für diese Installation zur Verfügung stehen. Wenn Sie die Erzeugung von bestimmten Fragentypen verhindern wollen, müssen Sie die Auswahl bei diesen Fragentypen entfernen. +common#:#assigned_members#:#Zugeordnete Teilnehmende +common#:#auth_create_users#:#Lege noch nicht eingetragene Benutzer*innen automatisch an. +common#:#auth_local#:#cate Auth +common#:#auth_new_account_mail_desc#:#Mail für neue Benutzerkonten +common#:#auth_remark_non_local_auth#:#Bei allen Authentifizierungsmethoden, die nicht über die lokale Datenbank erfolgen, sind Anmeldename und -passwort nicht mehr änderbar. +common#:#auth_soap_auth_desc#:#Diese Einstellung betrifft nur die SOAP-basierte Benutzer-Authentifizierung, nicht aber das cate-SOAP-Interface. +common#:#auth_soap_create_users_desc#:#Erzeugt automatisch ein cate-Benutzerkonto für Personen, die sich erfolgreich gegen SOAP authentifiziert haben, bisher aber noch nicht über einen cate-Account verfügten. +common#:#auth_soap_user_default_role_desc#:#Diese Rolle erhalten gegen SOAP authentifizierte Benutzer*innen. +common#:#authenticate_ilias#:#Direkt über die Datenbank anmelden +common#:#back_to_course#:#Zurück zum Training +common#:#back_to_crs_content#:#Zurück zum Inhalt des Trainings +common#:#bold_action#:#Fett gedruckt einfügen - Klicken Sie um fett gedruckten Text einzufügen. +common#:#bulletlist_action#:#Punktierte Liste einfügen - Klicken Sie um eine ungeordnete liste einzufügen. +common#:#cant_deactivate_if_users_assigned#:#Sie können einen Style nicht deaktivieren, wenn ihm noch Benutzer*innen zugeordnet sind. +common#:#certificate_file_already_exists_error#:#Die Zertikatsdatei existiert bereits im Dateisystem. +common#:#certificate_file_input_output_error#:#Die Zertikatsdatei wurde im Dateisystem gefunden, konnte aber aufgrund von Fehlern nicht gelöscht werden. Bitte kontaktieren Sie die Systemadministrator*innen. +common#:#changeable#:#Kann im eigenen Benutzerprofil geändert werden +common#:#chat_users_active#:#Aktive Benutzerkonten +common#:#check_link_desc#:#Wenn eingeschaltet, werden alle cate-Lernmodule auf ungültige externe Links überprüft. +common#:#check_user_accounts#:#cate-Benutzerkonten überprüfen +common#:#check_user_accounts_desc#:#Wenn eingeschaltet, werden alle Benutzer*innen, deren Zugang zeitlich begrenzt ist, zwei Wochen vor Ablauf darüber informiert. Außerdem werden alle Benutzer*innen gelöscht, die ihren Zugang nach einer Neuanmeldung mit Mail-Bestätigungslink nicht fristgerecht aktiviert haben. +common#:#chg_ilias_password#:#Passwort ändern +common#:#chown_warning#:#Achtung! Das Ändern des Besitzers /der Besitzerin eines Objektes kann dazu führen, dass diese Person alle Zugriffsrechte an dem Objekt verliert. +common#:#cont_iim_content_popups_info#:#Content-Popups werden angezeigt, wenn Benutzer*innen auf die interaktiven Teile des zugrundeliegenden Basis-Bilds klicken. Auf dieser Seite definieren Sie nur die Pop-ups. Ihr Inhalt wird auf der Hauptseite bearbeitet. +common#:#cont_iim_overlay_info#:#Ein Overlay-Bild wird angezeigt, wenn Benutzer*innen mit der Maus über den definierten Bereich des zugrundeliegenden Bildes fahren. Das jeweilige Overlay-Bild weisen Sie nach dem Hochladen im Register "Auslöser" dem zugehörigen Auslösebereich zu. +common#:#course#:#Training +common#:#courses#:#Trainings +common#:#cron_forum_notification_crob_desc#:#Wenn aktiviert, sendet das System täglich Benachrichtigungen an die Benutzer*innen, die bei ausgewählten Foren oder Foren-Themen über neue und geänderte Beiträge benachrichtigt werden wollen. Bitte beachten Sie: Wenn Sie diese Form der Foren-Benachrichtigungen aktivieren, werden keine direkten Benachrichtigungen mehr verschickt (Administration / Foren / Foren-Benachrichtigungen versenden). +common#:#cron_forum_notification_desc#:#Wenn aktiviert, sendet das System Mails an die Benutzer*innen, die bei ausgewählten Foren-Themen über neue Beiträge benachrichtigt werden wollen. +common#:#cron_lucene_index_info#:#Wenn eingeschaltet, wird der Lucene-Suchindex aktualisiert. Bitte konfigurieren Sie vorher den Lucene-Server unter "Administration > Suche". +common#:#cron_users_without_login_del_role_whitelist#:#Berücksichtigte Rollen +common#:#cron_users_without_login_del_role_whitelist_info#:#Nur Benutzerkonten mit einer der ausgewählten globalen Rollen werden gelöscht. Hat ein*e Benutzer*in eine der nicht ausgewählten Rollen inne, bleibt das cate-Benutzerkonto weiter bestehen. +common#:#crs#:#Training +common#:#crs_add#:#Training anlegen +common#:#crs_added#:#Training angelegt +common#:#crs_cancel_waiting_list#:#Sind Sie sicher, dass Sie sich aus der Warteliste des Trainings "%s" austragen möchten? +common#:#crs_copy_threads_info#:#Bitte wählen Sie aus, welche Trainingsmaterialien kopiert, verknüpft oder aber bei dem Kopiervorgang ausgelassen werden sollen. +common#:#crs_edit#:#Einstellungen des Trainings +common#:#crs_new#:#Neues Training anlegen +common#:#crs_removed_from_waiting_list#:#Sie wurden aus der Warteliste des Trainings "%s" ausgetragen. +common#:#crs_subscribers_assigned#:#Ein*e neue*r Benutzer*in wurde aufgenommen. +common#:#crs_title#:#Trainingstitel +common#:#crs_unsubscribe#:#Trainingsmitgliedschaft beenden +common#:#crs_wizard_page#:#Training kopieren (Schritt 2/2) +common#:#crsr#:#Trainingslink +common#:#crsr_add#:#Trainingslink anlegen +common#:#crsr_edit_info#:#Bitte wählen Sie das Training aus, für den Sie einen Link erstellen möchten. +common#:#crsr_new#:#Neuen Trainingslink anlegen +common#:#crsr_settings#:#Einstellungen des Trainingslinks +common#:#current_ip_alert#:#Warnung: Wird hier eine falsche IP eingetragen, wird der Zugriff auf das System für diese*n Benutzer*in verwehrt. +common#:#db_need_hotfix#:#Hotfix vorhanden. Bitte öffnen Sie das >Setup! +common#:#delete_inactivated_user_accounts#:#Inaktive cate-Benutzerkonten löschen +common#:#delete_inactivated_user_accounts_desc#:#cate-Benutzerkonten werden %s Tage nach ihrer Deaktivierung gelöscht. +common#:#delete_inactivated_user_accounts_include_roles_desc#:#Benutzer*innen, die mindestens eine der ausgewählten globalen Rollen inne haben, werden überprüft und gegebenenfalls gelöscht. +common#:#delete_inactivated_user_accounts_period_desc#:#Das cate-Benutzerkonto wird gelöscht, wenn seit dessen Inaktivierung diese Anzahl an Tagen verstrichen ist. +common#:#delete_inactive_user_accounts#:#Benutzerkonten mit lange zurückliegendem Login löschen +common#:#delete_inactive_user_accounts_desc#:#cate-Benutzerkonten werden abhängig vom Zeitpunkt des letzten Logins gelöscht. +common#:#delete_inactive_user_accounts_include_roles_desc#:#Benutzer*innen, die mindestens eine der ausgewählten globalen Rollen inne haben, werden bei der Überprüfung berücksichtigt und gegebenenfalls gelöscht. +common#:#delete_inactive_user_accounts_period_desc#:#cate-Benutzerkonto wird gelöscht, wenn seit der letzten Anmeldung diese Anzahl an Tagen verstrichen ist. +common#:#deleted_user#:#Der/die Benutzer*in wurde gelöscht. +common#:#deleted_users#:#Die Benutzer*innen wurden gelöscht. +common#:#deletion_notification#:#%s hat sich von Termin "%s" abgemeldet. +common#:#disable_ext_lang_maint#:#Erweiterte Sprachenverwaltung deaktivieren +common#:#download_with_uploaded_filename_info#:#Wählen Sie diese Option ausschließlich für die Rückwärtskompatibilität mit älteren Versionen aus: Wenn diese Option aktiviert ist, erhalten heruntergeladene Dateien den Namen, der beim Hochladen in das System verwendet worden ist. Wenn diese Option nicht ausgewählt ist, erhalten heruntergeladene Dateien den Titel des Dateiobjekts als Namen. Diese Option hat keine Auswirkung auf WebDAV. Bei WebDAV erhalten heruntergeladene Dateien IMMER den Titel des Dateiobjekts als Namen. +common#:#enable_course_group_notifications#:#Tägliche Mail über Neuigkeiten aus Gruppen und Trainings +common#:#enable_course_group_notifications_desc#:#Bei Aktivierung können Teilnehmende eine Zusammenfassung der News abonnieren. +common#:#enable_download_folder#:#Herunterladen-Aktion für Ordner aktivieren +common#:#enable_download_folder_info#:#Aktiviert die Option „Herunterladen“ im Aktionen-Dropdown von Ordnern. +common#:#enable_multi_download#:#Mehrere Objekte herunterladen aktivieren +common#:#enable_multi_download_info#:#Wenn aktiviert, können mehrere Ordner bzw. Dateien gleichzeitig ausgewählt werden, um sie dann als Zip-Archiv herunterzuladen. +common#:#enable_password_assistance#:#Login-Unterstützung aktivieren +common#:#enable_search_engine#:#Öffentlichen Bereich für Suchmaschinen (z.B. Google) freigeben.
Bitte beachten Sie, dass für diese Einstellung das Apache-Modul "rewrite" benötigt wird, und dass .htaccess-Konfigurationen genutzt werden müssen. +common#:#entered_notification#:#%s ist dem Termin "%s" beigetreten. +common#:#err_auth_ldap_no_ilias_user#:#Die Anmeldung ist fehlgeschlagen! Die LDAP-Authentifizierung war erfolgreich, aber es existiert kein entsprechendes Benutzerkonto in cate. Bitte kontaktieren Sie die Systemadministrator*innen. +common#:#err_inactive#:#Dieses cate-Benutzerkonto ist nicht aktiv bzw. noch nicht aktiviert worden. Bitte kontaktieren Sie die Systemadministrator*innen für weitere Unterstützung. +common#:#err_inactive_login_attempts#:#Ihr cate-Benutzerkonto wurde wegen falscher Login-Versuche deaktiviert. Bitte kontaktieren Sie die Systemadministrator*innen für weitere Unterstützung. +common#:#err_role_not_assignable#:#Der Rolle können an dieser Position keine Benutzer*innen zugeordnet werden. +common#:#err_valid_login_account_creation_disabled#:#Die Authentifizierung war erfolgreich, jedoch ist die Erstellung neuer Benutzerkonten nicht aktiviert. Bitte wenden Sie Sich an die Systemadministrator*innen. +common#:#event_ass_materials_prop#:#Materialien zum Termin +common#:#exc_members_already_assigned#:#Die ausgewählten Benutzer*innen sind bereits Mitglieder dieser Übungseinheit. +common#:#exc_members_assigned#:#Die Benutzer*innen wurden der Übung zugeordnet. +common#:#exc_members_comments_saved#:#Die Kommentare zu den Übungen der ausgewählten Benutzer*innen wurden gespeichert. +common#:#eyeclosed#:#Geschlossenes Auge: Klicken Sie, um den Inhalt des Eingabefelds zu verbergen. +common#:#eyeopened#:#Offenes Auge: Klicken Sie, um den Inhalt der Eingabe anzuzeigen. +common#:#file_not_found_sec#:#Diese Datei wurde in cate nicht gefunden oder wurde aus Sicherheitsgründen gesperrt. +common#:#file_system_clean_temp_dir_cron_info#:#Dieser Cron-Job räumt das temp-Verzeichnis von cate auf und löscht Dateien, die älter als 10 Tage sind. Damit wird eine Anhäufung ungenutzter Dateien und ein entsprechend erhöhter Speicherplatzverbrauch durch das temp-Verzeichnis verhindert. +common#:#filter_users_with_access#:#Nur Benutzerkonten mit Zugriff +common#:#filter_users_with_disk_usage#:#Nur Benutzerkonten, die Speicherplatz belegen +common#:#filter_users_without_access#:#Nur Benutzerkonten ohne Zugriff +common#:#filter_users_without_disk_usage#:#Nur Benutzerkonten, die keinen Speicherplatz belegen +common#:#forums_disable_forum_notification#:#Benachrichtigung für gesamtes Forum beenden +common#:#forums_enable_forum_notification#:#Benachrichtigung für gesamtes Forum starten +common#:#gender_n#:#Keine Anrede gewünscht +common#:#global_user#:#Global verwaltete Benutzerkonten +common#:#group_password_registration_msg#:#Wenn Ihnen die Gruppenadministrator*innen das Gruppenpasswort mitgeteilt hat, können Sie zur Gruppe beitreten. +common#:#groupings_assigned_obj_crs#:#Zugeordnete Trainings +common#:#grp_err_administrator_required#:#Gruppenmitglied wurde nicht entfernt, es wird mindestens ein*e Gruppenadministrator*in pro Gruppe benötigt. +common#:#grpr_new#:#Neuen Gruppenlink anlegen +common#:#header_action#:#Überschrift einfügen - Klicken Sie um eine Überschrift einzufügen. +common#:#i2passwd#:#cate-Passwort +common#:#italic_action#:#Kursiv einfügen - Klicken Sie um kursiven Text einzufügen. +common#:#ignore_required_fields_info#:#Falls aktiviert, werden Pflichtangaben beim Absenden dieses Formulars nicht mehr überprüft (sofern möglich). Auswirkung dessen ist, dass der/die Benutzer*in nach der nächsten Anmeldung sein Profil vervollständigen muss. +common#:#il_astpl_loc_initial_desc#:#Einstellungsvorlage für Einstiegstests lernzielorientierter Trainings +common#:#il_astpl_loc_qualified_desc#:#Einstellungsvorlage für Qualifizierende Tests lernzielorientierter Trainings +common#:#il_crs_admin#:#Trainingsadministrator +common#:#il_crs_member#:#Trainingsmitglied +common#:#il_crs_non_member#:#Kein Trainingsmitglied +common#:#il_crs_tutor#:#Referent +common#:#ilias_version#:#Kern-Version +common#:#import_lm#:#cate-Lernmodul importieren +common#:#import_users#:#Benutzerkonten importieren +common#:#imprint#:#Impressum | Nutzungsbedingungen und Datenschutzhinweise | Kontakt +common#:#info_activate_sure#:#Sind Sie sicher, dass Sie die folgenden Benutzer*innen als aktiv bestätigen wollen? +common#:#info_assign_sure#:#Sind Sie sicher, dass Sie den/die folgenden Benutzer*in aufnehmen möchten? +common#:#info_change_user_view#:#Rechte des Benutzers anzeigen +common#:#info_deactivate_sure#:#Sind Sie sicher, dass Sie die folgende*n Benutzer*in deaktivieren wollen? +common#:#info_delete_sure#:#Sind Sie sicher, dass folgende Objekte gelöscht werden sollen: +common#:#info_err_user_not_exist#:#Eine(n) Benutzer-ID existiert nicht +common#:#info_is_member#:#Der/die Benutzer*in ist Mitglied. +common#:#info_is_not_member#:#Der/die Benutzer*in ist kein Mitglied. +common#:#info_remove_sure#:#Sind Sie sicher, dass folgende Objekte entfernt werden sollen: +common#:#lang_refresh_confirm_info#:#Das System hat geänderte Sprachvariablen gefunden. Die Aktualisierung einer Sprache lädt alle Daten aus ihrer Standard-Sprachdatei und eventuell aus einer Custom-Sprachdatei in die Datenbank. Ihre Änderungen werden durch das Laden der Standard-Sprachdatei nicht überschrieben. Eine Custom-Sprachdatei überschreibt nur Änderungen, die älter sind als ihr eigenes Speicherdatum. +common#:#lang_uninstall_changes_confirm#:#Möchten Sie wirklich alle lokalen Änderungen an den ausgewählten Sprachen löschen und diese auf den Standard der aktuellen Sprachdatei-Version zurücksetzen? +common#:#link_action#:#Link einfügen - Klicken Sie um einen Link einzufügen. +common#:#link_check_subject#:#[cate] Weblink überprüfen +common#:#links_dynamic_info#:#Dynamische Parameter können dem Weblink hinzugefügt werden, z. B. der Anmeldename oder die ID des Benutzerkontos. +common#:#links_session_id#:#cate-Session-ID +common#:#links_user_id#:#cate-Benutzer-ID +common#:#links_user_name#:#Anmeldename +common#:#lm#:#Lernmodul cate +common#:#lm_add#:#cate-Lernmodul anlegen +common#:#lm_added#:#cate-Lernmodul angelegt +common#:#lm_new#:#Neues cate-Lernmodul anlegen +common#:#login_to_ilias#:#Am System anmelden +common#:#login_to_ilias_via_cas#:#Bei diesem System über zentrales Authentifizierungssystem anmelden +common#:#login_to_ilias_via_saml#:#Bei diesem System via SAML-Authentifizierung anmelden +common#:#login_to_ilias_via_shibboleth#:#Bei diesem System anmelden über +common#:#lti_outcome_info#:#Sendet den Lernfortschrittstatus von LTI-Benutzer*innen an LTI-Tool-Consumer. +common#:#mail_at_the_ilias_installation#:#Auf der cate-Installation %2$s haben Sie %1$s neue Mail(s) erhalten +common#:#mail_multiple_recipients_found#:#Geben Sie eine genauere Mail-Adresse ein, da das System mehrere Empfänger*innen gefunden hat. +common#:#mail_no_recipient_found#:#Geben Sie bitte eine andere Mail-Adresse an. Das System konnte keinen zugehörige*n Empfänger*in finden. +common#:#mails_at_the_ilias_installation#:#Auf der cate-Installation %2$s haben Sie %1$s neue Mail(s) erhalten +common#:#member_status#:#Hinweis zum Training: +common#:#mem_cron_min_members#:#Training/Gruppe: Prüfung der minimalen Teilnehmerzahl +common#:#mem_cron_min_members_info#:#Die Administrator*innen des Objekts werden benachrichtigt, sofern die minimale Anzahl nicht erreicht wird. +common#:#mem_max_users#:#Maximale Teilnehmerzahl: +common#:#mem_min_users#:#Minimale Teilnehmerzahl +common#:#msg_bt_download_started#:#Ein ZIP-Archiv mit allen Download-Dateien wird jetzt im Hintergrund erstellt. Den Status Ihrer Hintergrundprozesse sehen Sie oben rechts in der Nachrichtenzentrale. Dort können Sie das ZIP-Archiv auch herunterladen. +common#:#msg_copy_clipboard#:#Wählen Sie nun den gewünschten Ort, wohin die ausgewählten Objekte kopiert werden sollen. Klicken Sie abschließend auf die "Einfügen"-Schaltfläche. +common#:#msg_copy_clipboard_container#:#Wählen Sie nun den gewünschten Ort, an den die die kopierten Objekte eingefügt werden sollen. Klicken Sie abschließend auf die "Weiter"-Schaltfläche. +common#:#msg_copy_clipboard_source#:#Wählen Sie nun das Training oder die Gruppe aus, dessen Inhalte kopiert werden sollen. Klicken Sie anschließend auf den Weiter-Button. +common#:#msg_cut_clipboard#:#Wählen Sie nun den gewünschten Ort, an dem die ausgewählten Objekte eingefügt werden sollen. Klicken Sie abschließend die "Einfügen"-Schaltfläche. +common#:#msg_is_last_role#:#Sie haben den folgenden Benutzer*innen ihre letzte Zuweisung zu einer globalen Rolle genommen. +common#:#msg_last_role_for_registration#:#Es muss mindestens eine Rolle im Registrierformular für neue Benutzer*innen verfügbar sein. Diese Rolle ist momentan als einzige Rolle verfügbar. +common#:#msg_link_clipboard_p#:#Wählen Sie nun den gewünschten Ort, in den die ausgewählten Objekte verknüpft werden sollen. Klicken Sie abschließend auf die "Einfügen"-Schaltfläche. +common#:#msg_link_clipboard_s#:#Wählen Sie nun den gewünschten Ort, in den das ausgewählte Objekt verknüpft werden sollen. Klicken Sie abschließend auf die "Einfügen"-Schaltfläche. +common#:#msg_min_one_role#:#Jede*r Benutzer*in muss mindestens einer globalen Rolle zugewiesen sein! +common#:#msg_no_language_selected#:#Die Angabe einer Übersetzungssprache fehlt! Sie müssen für alle Übersetzungen eine Sprache bestimmen. +common#:#msg_no_perm_assign_role_to_user#:#Sie haben keine Berechtigung, die Rollenzuweisung des/der Benutzer*in zu ändern. +common#:#msg_no_perm_assign_user_to_role#:#Sie haben keine Berechtigung, um die Benutzerzuweisung zu ändern. +common#:#msg_not_available_for_anon#:#Die von Ihnen gewählte Seite steht nur angemeldeten Benutzer*innen zur Verfügung. +common#:#msg_obj_no_link#:#Das Verknüpfen von Containerobjekten wie Kategorien, Trainings, Gruppen und Ordnern ist aus technischen Gründen leider nicht möglich. Verknüpfen Sie stattdessen die einzelnen Objekte der Container zum gewünschten Ort oder verwenden die Objekttypen Kategorienlink, Trainingslink bzw. Gruppenlink. +common#:#msg_sysrole_not_editable#:#Die Rechteeinstellungen der Systemrolle können nicht geändert werden. Die Systemrolle erlaubt den zugeordneten Benutzer*innen uneingeschränkten Zugriff auf alle Objekte und Funktionen. +common#:#msg_user_last_role1#:#Die folgenden Benutzer*innen sind nur dieser einen Rolle zugewiesen: +common#:#msg_user_last_role2#:#Bitte löschen Sie die Benutzer*innen oder weisen Sie ihnen einer anderen Rolle zu. +common#:#my_courses#:#Meine Trainings +common#:#my_courses_groups#:#Meine Trainings und Gruppen +common#:#nc_contact_requests_number_p#:#Sie haben %s Kontaktanfragen. +common#:#nc_contact_requests_number_s#:#Sie haben eine Kontaktanfrage. +common#:#no_agreement_description#:#Aktuell wird in dieser Installation keine Nutzungsvereinbarung angeboten. Bitte kontaktieren Sie Ihre*n Systemadministrator*in für weitere Informationen. +common#:#no_gallery_users_available#:#Aktuell befinden sich keine Benutzer*innen in der Galerie. +common#:#no_global_role_left#:#Jede*r Benutzer*in muss mindestens einer globalen Rolle zugeordnet sein. +common#:#no_mkisofs_configured#:#Sie müssen das mkisofs-Tool im Setup konfigurieren, um den ISO-Export ausführen zu können. +common#:#no_roles_user_can_be_assigned_to#:#Sie haben keinen Zugriff auf globale Rollen, deswegen können Sie keine lokalen Benutzer*innen anlegen. +common#:#no_users_selected#:#Bitte wählen Sie mindestens eine*n Benutzer*in aus. +common#:#numberedlist_action#:#Nummerierte Liste List - Klicken Sie um eine nummerierte Liste einzufügen. +common#:#obj_adm_desc#:#Beinhaltet alle Verwaltungstools für Ihre cate-Installation. +common#:#obj_adve_desc#:#Administrationseinstellungen für den Seiteneditor und TinyMCE. +common#:#obj_auth_desc#:#Konfigurieren Sie hier die Art der Benutzer-Authentifizierung (Lokal, LDAP, CAS, ...) sowie die Neuanmeldungen. +common#:#obj_crs#:#Training +common#:#obj_crs_duplicate#:#Training kopieren +common#:#obj_crsr#:#Trainingslink +common#:#obj_crss#:#Training +common#:#obj_crss_desc#:#Allgemeine Einstellungen für Trainings +common#:#obj_crsv#:#Trainingszertifikat +common#:#obj_extt_desc#:#Konfigurieren Sie hier externe Software und Dienste, welche von diesem System unterstützt werden +common#:#obj_lm#:#Lernmodul cate +common#:#obj_logs_desc#:#Enthält globale Einstellungen für die Protokollierung +common#:#obj_objf_desc#:#Objekttypen und -rechte (nur für Experten!) +common#:#obj_pecrs#:#Training +common#:#obj_perl#:#Materialienliste +common#:#obj_peusr#:#Benutzerkonto +common#:#obj_prg#:#Qualifizierungsprogramm +common#:#obj_prg_duplicate#:#Qualifizierungsprogramm kopieren +common#:#obj_prg_select#:#-- Bitte wählen Sie ein Qualifizierungsprogramm -- +common#:#obj_prgr#:#Link zum Qualifizierungsprogramm +common#:#obj_prgrs#:#Links zu Qualifizierungsprogrammen +common#:#obj_prgs#:#Qualifizierungsprogramme +common#:#obj_prgs_desc#:#Qualifizierungsprogramm Administration +common#:#obj_rcrs#:#ECS-Training +common#:#obj_root#:#Verwalten und Organisieren - Einstiegsseite +common#:#obj_sess#:#Termin +common#:#obj_sess_duplicate#:#Termin kopieren +common#:#obj_tool_setting_calendar#:#Kalender +common#:#obj_tool_setting_calendar_info#:#Der Kalender ist aktiviert und der Block "Kalender" wird im Reiter "Inhalt" angezeigt. +common#:#obj_tool_setting_custom_metadata_info#:#Wenn aktiviert, können benutzerdefinierte Metadaten konfiguriert werden. +common#:#obj_user#:#Benutzerkonto +common#:#obj_usr#:#Benutzerkonto +common#:#obj_usrf#:#cate-Benutzerkonten +common#:#obj_usrf_desc#:#Verwaltung der cate-Benutzerkonten +common#:#obj_xbkm#:#Buchungsmodalitäten +common#:#objs_crs#:#Trainings +common#:#objs_crsr#:#Trainingslinks +common#:#objs_lm#:#cate-Lernmodule +common#:#objs_prg#:#Qualifizierungsprogramme +common#:#objs_prgr#:#Links zu Qualifizierungsprogrammen +common#:#objs_rcrs#:#ECS-Training +common#:#objs_sess#:#Termine +common#:#on_waiting_list#:#Sie sind auf einen Wartelistenplatz gebucht. +common#:#password_assistance_info#:#Wenn die Login-Unterstützung aktiviert ist, erscheinen zwei Lins mit der Bezeichnung "Passwort vergessen?" bzw. "Anmeldename vergessen?" auf der Login-Seite. Benutzer*innen können diese Funktion verwenden, um sich ein neues Passwort zu erstellen, oder um ihren Anmeldenamen zu ermitteln. +common#:#password_change_on_first_login_demand#:#Ihr Passwort muss geändert werden, bevor Sie das System nutzen können. +common#:#pdfg_read#:#Lesezugriff auf PDF-Erstellung +common#:#pdfg_visible#:#PDF-Erstellung ist sichtbar. +common#:#preview_for#:#Vorschau für: +common#:#preview_learner_info#:#Wenn aktiviert, wird Trainings- und Gruppenadministratoren die Möglichkeit angeboten, das Training oder die Gruppe aus Sicht eines fiktiven Trainings- bzw. Gruppenmitglieds zu betrachten. +common#:#prg_copy_threads_info#:#Bitte wählen Sie aus, welche Elemente des Qualifizierungsprogramms kopiert, verknüpft oder aber bei dem Kopiervorgang ausgelassen werden sollen. +common#:#prg_wizard_page#:#Qualifizierungsprogramm kopieren (Schritt 2/2) +common#:#prgr_add#:#Link zu Qualifizierungsprogramm anlegen +common#:#prgr_edit_info#:#Bitte wählen Sie das Qualifizierungsprogramm aus, für das Sie einen Link erstellen möchten. +common#:#prgr_new#:#Neuen Link zu einem Qualifizierungsprogramm anlegen +common#:#prgr_settings#:#Einstellungen des Links zum Qualifizierungsprogramm +common#:#profile_changed#:#Ihre Profildaten wurden geändert +common#:#proxy_not_connectable#:#Das System kann keine Verbindung zum Proxy aufbauen. +common#:#proxy_status_info#:#Um einen Proxy in diesem System zu verwenden (z.B. für Webfeeds und die Überprüfung von Weblinks), aktivieren Sie bitte dieses Häkchen. +common#:#ps_password_lowercase_chars_num_info#:#Tragen Sie hier die Anzahl der Kleinbuchstaben ein, die im Passwort eines Benutzerkontos enthalten sein müssen. Ist der Wert 0 eingetragen, sind Kleinbuchstaben im Passwort nicht verpflichtend. +common#:#ps_password_must_not_contain_loginame_info#:#cate verhindert, dass der Anmeldename als Teil des Passworts genutzt wird. +common#:#ps_password_uppercase_chars_num_info#:#Tragen Sie hier die Anzahl der Großbuchstaben ein, die im Passwort eines Benutzerkontos enthalten sein müssen. Ist der Wert 0 eingetragen, sind Großbuchstaben im Passwort nicht verpflichtend. +common#:#reached_session_limit#:#Die maximale Anzahl an Benutzer*innen, die parallel eingeloggt sein dürfen, ist erreicht. Bitte versuchen Sie es später noch einmal. +common#:#readcount_anonymous_users#:#Lesezugriffe anonymer Benutzer +common#:#readcount_users#:#Lesezugriffe registrierter Benutzer +common#:#referral_comment#:#Woher kennen Sie cate? +common#:#reg_account_confirmation_successful#:#Das cate-Benutzerkonto wurde bestätigt und aktiviert. +common#:#reg_mail_body_2_confirmation#:#Der Link wird nur für %s Stunden gültig sein, danach müssen Sie sich erneut registrieren. +common#:#reg_mail_body_3_confirmation#:#Falls Sie diese Mail unerwartet erhalten haben, ist es möglich, dass eine andere Person Ihre Mail-Adresse versehentlich oder vorsätzlich angegeben hat. In diesem Fall kontaktieren Sie bitte die Systemadministrator*innen. +common#:#reg_mail_body_forgot_password_info#:#Um ein neues Passwort für diesen Benutzer-Seite. +common#:#reg_mail_body_salutation#:#Guten Tag, +common#:#reg_mail_body_text1#:#Willkommen auf Ihrer eLearning-Plattform! +common#:#reg_mail_subject#:#Ihre Zugangsdaten +common#:#reg_mail_subject_confirmation#:#Ihr Bestätigungslink +common#:#register_notification#:#%s hat die Teilnahme an dem Termin" %s" beantragt. +common#:#registered_user#:#registriertes Benutzerkonto +common#:#registered_users#:#registrierte Benutzerkonten +common#:#registration#:#Neues cate-Benutzerkonto registrieren +common#:#renderer_supported_repo_types#:#Unterstützte Objekte +common#:#repository#:#Verwalten und Organisieren +common#:#role_mailto#:#Mail an alle zugewiesenen Benutzerkonten +common#:#role_protect_permissions_desc#:#Die eingestellten Objektrechte für diese Rolle werden durch Systemoperationen nicht mehr verändert. Außerdem können nur höherstehende Administrator*innen die Rechte anpassen. +common#:#sahs_export_file#:#aus dem System exportierte SCORM-Archiv-Datei +common#:#saml_log_in#:#Login +common#:#saml_login_form_info_txt#:#Um sich über SAML anzumelden, klicken Sie bitte die "Anmelden"-Schaltfläche. +common#:#saml_login_form_txt#:#An diesem System anmelden über SAML +common#:#scorm_login_as_learner_id#:#SCORM 2004: Setzt den Anmeldenamen als cmi.learner_id +common#:#scorm_login_as_learner_id_info#:#Wenn aktiviert, wird der Benutzer-ID für die cmi.learner_id gesetzt. +common#:#scorm_without_session_info#:#Dies sichert die Speicherung von SCORM-2004-Lernstandsdaten auch bei abgelaufener cate-Session. Bei SCORM 1.2 ist die Speicherung ohne Session immer aktiviert. +common#:#search_active#:#Aktive Benutzerkonten +common#:#search_inactive#:#Inaktive Benutzerkonten +common#:#sess_notification_option_inherit_info#:#Nutze die Einstellungen des übergeordneten Objekts (bspw. Einstellungen von Training oder Gruppe) für Mitglieder dieser Sitzung. +common#:#session_mail_subject_deletion#:#Abmeldung von Benutzer*in %s von Termin "%s" +common#:#session_mail_subject_entered#:#Beitritt von Benutzer/in %s zu Termin "%s" +common#:#session_mail_subject_registered#:#Registrierung von Benutzer/in %s für Termin "%s" +common#:#session_max_idle_after_first_request_info#:#Wenn ein*e Benutzer*in nach seiner/ihrer ersten Anfrage für diesen Zeitraum inaktiv ist, kann seine/ihre Session gelöscht werden, sofern eine andere Session für einen andere*n Benutzer*in erstellt werden soll und das maximale Session-Limit erreicht wurde. +common#:#session_max_idle_info#:#Wenn ein*e Benutzer*in für diesen Zeitraum inaktiv ist, ist seine/ihre Session ausgelaufen. +common#:#session_min_idle_info#:#Wenn ein*e Benutzer*in für mindestens diesen Zeitraum inaktiv ist, kann seine/ihre Session gelöscht werden, sofern eine andere Session für einen andere*n Benutzer*in erstellt werden soll und das maximale Session Limit erreicht wurde. +common#:#session_reminder_lead_time_info#:#Hier können Sie festlegen, wann das System Sie vor dem Ablauf Ihrer Sitzung warnen soll. Sie erhalten dann einen Hinweis und können einfach per Mausklick die Sitzung verlängern. Geben Sie einen Wert in Minuten ein. Empfohlen sind 5 Minuten.
Der aktuelle Wert für die Dauer einer Sitzung in diesem System beträgt %s. +common#:#shib_general_wayf_login_instructions#:#Falls Sie keiner der angegebenen Organisationen angehören und Zugang zu einem Training auf diesem Server benötigen, wenden Sie sich bitte an den %s +common#:#short_inst_name_info#:#Dieser Titel erscheint im Browser-Tab. Wird hier nichts eingetragen, erscheint "cate". +common#:#show_users_online#:#Aktive Benutzerkonten anzeigen +common#:#show_who_is_online#:#Zeige, wer online ist! +common#:#simultaneous_login_detected#:#Der Zugang zum System wird verweigert, da sich bereits ein*e Benutzer*in mit diesen Zugangsdaten in einer Sitzung befindet. +common#:#skmg_cont_profiles_info#:#In dieser Ansicht können Sie die Kompetenzprofile mit Kompetenzeinträgen auswählen, die im Zusammenhang mit dem derzeit geöffneten Objekt (Training/Gruppe) stehen. Um zu der globalen Ansicht mit allen Ihnen zugewiesenen Kompetenzprofilen und sämtlichen Kompetenzeinträgen zu gelangen, klicken Sie auf den unten stehenden Link. +common#:#soap_user_administration_desc#:#Wenn eingeschaltet, kann das System über die SOAP-Schnittstelle verwaltet werden. +common#:#soap_wsdl_path_info#:#Hier können Sie den Pfad zur WSDL-Datei angeben, die von dem System für den Web-Service genutzt werden soll. Falls Sie dieses Feld leer lassen, wird folgender Pfad als Standard verwendet:%s +common#:#sort_inherit_prefix#:#Durch Training/Gruppe bestimmt +common#:#sorting_info_inherit#:#Wird die Sortierung des übergeordneten Trainings bzw. der Gruppe geändert, ändert sich auch diese Sortierung. +common#:#startpage#:#Anmeldeseite +common#:#sure_delete_selected_users#:#Sind Sie sicher, dass die ausgewählten Benutzer*innen gelöscht werden sollen? +common#:#time_limit_add_time_limit_for_selected#:#Bitte geben Sie einen Zeitraum für die ausgewählten Benutzer*innen ein. +common#:#time_limit_no_users_selected#:#Sie haben keine Benutzer*innen ausgewählt. +common#:#translation#:#Übersetzung +common#:#tutors#:#Referenten +common#:#txt_registered#:#Sie haben sich erfolgreich in bei cate registriert. Klicken Sie bitte auf die untenstehende Schaltfläche, um in cate zu gelangen. +common#:#txt_registered_passw_gen#:#Sie haben sich erfolgreich registriert. Sie werden in Kürze eine E-Mail mit Ihrem Passwort erhalten. +common#:#txt_submitted#:#Sie haben sich erfolgreich bei cate registriert. Ihr Benutzerkonto muss noch von den Systemadministrator*innen freigegeben werden. Wir bitten um Ihre Geduld. +common#:#ums_create_new_account#:#Neues Benutzerkonto anlegen +common#:#ums_explanation#:#Ihre externe Benutzerkennung konnte keinem cate-Account zugeordnet werden. Aber das System hat einen Account mit Ihrer Mail-Adresse entdeckt. Sollte dies Ihre Benutzerkennung sein, loggen Sie sich bitte mit Ihrem cate-Passwort ein. +common#:#ums_explanation_2#:#Sollte keines dieser Benutzerkonten Ihnen gehören, klicken Sie bitte auf "Neues Benutzerkonto anlegen". +common#:#ums_explanation_3#:#Ihre externe Benutzerkennung konnte keinem cate-Benutzerkonto zugeordnet werden. Aber das System hat mehrere Benutzerkonten mit Ihrer E-Mail-Adresse entdeckt. Sollte eines dieser Benutzerkonten Ihnen gehören, loggen Sie sich bitte mit Ihrem cate-Passwort ein. +common#:#ums_explanation_4#:#Sollte keine dieser Benutzerkennungen Ihnen gehören, klicken Sie bitte auf "Neues Benutzerkonto anlegen". +common#:#underline_action#:#Unterstrichen einfügen - Klicken Sie um unterstrichenen Text einzufügen. +common#:#update_orgunits#:#Benutzerdatenfeld "Organisationseinheiten" aktualisieren +common#:#update_orgunits_desc#:#Wenn eingeschaltet, werden bei allen Benutzer*innen das Feld "Organisationseinheiten" aktualisiert und so allfällige Fehler behoben. +common#:#user_activated#:#Der/die Benutzer*in wurde bestätigt. +common#:#user_added#:#Benutzerkonto angelegt +common#:#user_cant_receive_mail#:#%1$s – Benutzer*in hat keine Berechtigung, das Mailsystem zu benutzen. +common#:#user_deactivated#:#Die ausgewählten Benutzer*innen wurden deaktiviert. +common#:#user_deleted#:#Benutzerkonto gelöscht +common#:#user_never_logged_in#:#cate-Benutzerkonten ohne Anmeldung löschen +common#:#user_never_logged_in_info#:#Benutzerkonten werden gelöscht, wenn sie sich noch nie im System angemeldet haben. +common#:#user_new_account_mail_desc#:#Diese Mail wird an Benutzer*innen gesendet, die sich selbst registriert haben. Wurde das Benutzerkonto von Der Systemadministration angelegt, verschickt cate nur dann eine Benachrichtigung, wenn beim Anlegen des Benutzerkontos die Option "Benutzer per Mail über Änderungen informieren" aktiviert wurde. +common#:#user_not_found#:#Der/die Benutzer*in wurde nicht gefunden. +common#:#user_not_found_to_delete#:#Ein*e Benutzer*in, der/die gelöscht werden sollte, konnte nicht gefunden werden. +common#:#user_select_course_group#:#Training/Gruppe auswählen +common#:#users#:#Benutzerkonten +common#:#users_not_imported#:#Die folgenden Benutzer*innen existieren nicht. Daher können deren Mails nicht importiert werden. +common#:#users_online#:#Aktive Benutzerkonten +common#:#usr_account_inactive#:#Inaktives Benutzerkonto +common#:#usr_active_only#:#Nur aktive Benutzerkonten +common#:#usr_add#:#Neues Benutzerkonto +common#:#usr_edit#:#Benutzerkonto bearbeiten +common#:#usr_filter_coursemember#:#Mitglied eines Trainings +common#:#usr_filter_lastlogin#:#Letztes Login eines Benutzerkontos +common#:#usr_has_status_on_course_no_cancel#:#Sie können diese Buchung nicht mehr stornieren, da bereits eine Teilnahme erfasst wurde. Sobald Sie "Meine Buchungen" neu laden, wird die Buchung daher nicht mehr angezeigt. +common#:#usr_inactive_only#:#Nur nicht-aktive Benutzerkonten +common#:#usr_limited_access_only#:#Nur Benutzerkonten mit Zugangsbefristung +common#:#usr_new#:#Neues Benutzerkonto +common#:#usr_settings_explanation_profile#:#Bestimmen Sie in der folgenden Tabelle, welche Felder für eine*n Benutzer*in sichtbar und welche änderbar sind. Ist ein Datenfeld "Sichtbar", werden die Daten angezeigt, können aber nicht geändert werden. Ist ein Datenfeld zusätzlich "Änderbar" können Benutzer*innen die Daten nachträglich ändern. Bei der Einstellung "Erforderliche Angabe" ist die Eingabe verpflichtend. Unabhängig von diesen Einstellungen können Systemadministrator*innen alle Daten in der Benutzeradministration ändern. +common#:#usr_without_courses#:#Benutzer ohne jede Trainingsmitgliedschaft +common#:#usrf_profile_link#:#Link zum cate-Benutzerkonto +common#:#usrimport_cant_delete#:#Kann „Delete“ Aktion nicht ausführen. Kein passendes Benutzerkonto in der Datenbank vorhanden. +common#:#usrimport_cant_insert#:#Kann „Insert“ Aktion nicht ausführen. Benutzerkonto ist bereits in der Datenbank vorhanden. +common#:#usrimport_cant_update#:#Kann „Update“ Aktion nicht ausführen. Kein passendes Benutzerkonto in der Datenbank vorhanden. +common#:#usrimport_with_specified_role_not_permitted#:#Sie haben keine Berechtigung zum Importieren von Benutzer*innen mit der angegebenen Rolle. +common#:#webdav_pwd_instruction#:#Um das Magazin als Webordner außerhalb der aktuellen Sitzung als Webordner zu öffnen, empfehlen wir ein lokales Passwort anzulegen.
Dieses Passwort wird nur für die Webordner-Funktionalitäten benötigt, die Anmeldung erfolgt weiterhin mit Ihrem gewohnten Passwort. +common#:#withdraw_consent_description#:#Widerrufen Sie hier die Zustimmung zu den Nutzungsvereinbarungen. +common#:#withdraw_consent_description_external#:#Bitte kehren Sie zu Ihrer Herkunftsinstallation zurück, und loggen Sie sich erneut ein, um den Widerrufsvorgang abzuschließen. +common#:#withdraw_consent_info_external#:#Bitte benachrichtigen Sie die zuständigen Administrator*innen Ihres Autorisierungssystem und teilen Sie Ihre Absicht mit. +common#:#withdraw_consent_info_internal#:#Wenn Sie hier bestätigen, wird Ihr Benutzerkonto gelöscht. +common#:#withdrawal_complete_deleted#:#Der Widerrufsvorgang ist abgeschlossen. Das Benutzerkonto wurde gelöscht. +common#:#withdrawal_complete_redirect#:#Der Widerrufsvorgang wurde abgeschlossen. Zur Löschung des Benutzerkontos nehmen Sie bitte Kontakt zu Ihrer Organisation auf. +common#:#withdrawal_mail_text#:#Guten Tag,[BR][BR]hiermit widerrufe ich mein Einverständnis zur Nutzungsvereinbarung Ihrer cate-Instanz. Bitte leiten Sie die entsprechenden Maßnahmen ein.[BR][BR]Name: %1$s[BR]Anmeldename: %2$s[BR]Externes Konto: %3$s[BR][BR]Mit freundlichen Grüßen[BR]%1$s +common#:#withdrawal_sure_account_deletion#:#Sind Sie sicher, dass Sie Ihr Einverständnis zu den Nutzungsvereinbarungen widerrufen möchten? Ihr cate-Benutzerkonto wird infolgedessen unwiderruflich gelöscht. +common#:#withdrawal_sure_account_deletion_no_consent_yet#:#Sind Sie sicher, dass Sie Ihr Einverständnis zu den Nutzungsvereinbarungen nicht erteilen möchten? Ihr cate-Benutzerkonto wird infolgedessen unwiderruflich gelöscht. +common#:#zip_test_failed#:#Der ZIP-Test ist fehlgeschlagen. Bitte kontaktieren Sie die Systemadministrator*innen. +cont#:#cont_page_type_cont#:#Magazinseite (Training, Gruppe, Kategorie, ...) +cont#:#cont_page_type_cstr#:#Startseite lernzielorientiertes Training +cont#:#cont_really_deassign_skills#:#Wollen Sie wirklich alle Kompetenzzuweisungen des Benutzers / der Benutzerin zurücksetzen? +contact#:#contact_awrn_ap_contacts_info#:#Alle bestätigten Kontakte des Benutzers / der Benutzerin werden aufgelistet. +content#:#choose_public_mode#:#Zugriffsrecht für Personen ohne Benutzerkonto +content#:#cont_anonymous_user_missing_perm#:#Nicht angemeldete Benutzer*innen haben aktuell kein Zugriffsrecht auf dieses Lernmodul. +content#:#cont_assign_to_parent#:#Dem übergeordneten Knoten zuordnen +content#:#cont_auto_last_visited_info#:#Dem/der Benutzer*in wird beim erneuten Aufrufen des SCORM-Lernmoduls das zuletzt besuchte SCO oder Asset angezeigt. +content#:#cont_check_values_info#:#Das Testwerkzeug prüft die vom SCO geschickten Werte auf Standard-Kompatibilität.
Der SCORM-Standard ist sehr genau, was die zu speichernden Daten angeht. Nicht jedes SCORM-Lernmodul ist in seiner Datenausgabe so präzise wie der Standard es eigentlich erfordert. Daher kann das Überprüfen der Werte deaktiviert werden, wenn Sie etwa nur prüfen wollen, ob das Lernmodul im System lauffähig ist und nicht, ob es genau dem SCORM-Standard entspricht.
+content#:#cont_comments_info#:#SCORM 2004-Lernmodule erlauben Benutzer*innen, im Lernmodul Kommentare zu verfassen. Diese Option aktiviert das Eingeben und Speichern der Kommentare (comments). +content#:#cont_could_not_determine_resource_size#:#Das System konnte die Abmessungen nicht automatisch ermitteln. +content#:#cont_credit_mode#:#Bewertung / Steuerung der Lernaktivitäten +content#:#cont_debug_deactivate#:#Es wird ein Testwerkzeug angezeigt. Es liefert im Präsentationsmodus des SCORM-Lernmoduls Daten, anhand welcher überprüft werden kann, wie das Lernmodul mit dem System interagiert. Um das Testwerkzeug aufzurufen, muss der linke Navigationsbaum angezeigt werden. +content#:#cont_debug_deactivate12#:#Es wird ein Testwerkzeug angezeigt. Es liefert im Präsentationsmodus des SCORM-Lernmoduls Daten, anhand welcher überprüft werden kann, wie das Lernmodul mit dem System interagiert. +content#:#cont_debug_deactivated#:#Hinweis: Das Werkzeug zum Überprüfen des Lernmoduls auf SCORM-Konformität ist global für alle Lernmodule deaktiviert (Administration » Magazin und Objekte » Lernmodule). +content#:#cont_downloads_desc#:#Der Reiter "Download" wird in der Präsentationsansicht angezeigt. Dort können Benutzer*innen freigegebene Exportdateien herunterladen, zum Beispiel für Offline-Nutzung oder Import. +content#:#cont_downloads_public_desc#:#Erlaubt das Herunterladen auch für nichtangemeldete Benutzer*innen (Öffentlicher Bereich). +content#:#cont_ed_insert_mcrs#:#Meine Trainings einfügen +content#:#cont_edit_mob#:#Medienobjekt bearbeiten +content#:#cont_got_lock_release#:#Diese Seite wurde für Ihre Bearbeitung gesperrt bis %1. Andere Benutzer*innen können in dieser Zeit keine Änderungen an der Seite vornehmen. Bitte geben Sie die Seite nach der Bearbeitung wieder frei. +content#:#cont_html_export_ids_info#:#Ermöglicht die Verwaltung eigener IDs für cate-Lernmodule. Diese IDs werden zur Benennung von HTML-Seiten verwendet, die beim HTML-Export erzeugt werden. +content#:#cont_insert_my_courses#:#Meine Trainings einfügen +content#:#cont_layout_fullscreen_desc#:#Inhalte im Hauptframe. FAQ-, Glossar- und Medienlinks öffnen ein neues Fenster. Das Hauptmenü ist deaktiviert. +content#:#cont_layout_presentation_desc#:#Inhalte im Hauptframe. FAQ-, Glossar- und Medienlinks öffnen ein neues Fenster. Das Hauptmenü ist deaktiviert. +content#:#cont_link_to_internal#:#Link innerhalb des Systems +content#:#cont_lm_comments_desc#:#Erlaubt es Benutzer*innen, öffentliche Kommentare auf allen Lernmodulseiten hinzuzufügen. +content#:#cont_lm_starting_point#:#Startseite für cate-Lernmodule +content#:#cont_lpe_saml_login_form#:#SAML-Login-Maske +content#:#cont_lpe_user_agreement_link#:#Link zur Nutzungsvereinbarung +content#:#cont_media#:#Bilder/Audio/Video +content#:#cont_mycourses_sortorder_info#:#Dies ist die Default-Einstellung. Jeder Benutzer kann eine eigene Sortierung wählen, die für alle "Meine Trainings"-Elemente sämtlicher Portfolios gilt. +content#:#cont_no_subdir_in_zip#:#Das ZIP-Kommando konnte nicht ausgeführt werden, oder die Importdatei ist fehlerhaft. Sie enthält keinen Unterordner '%s'. +content#:#cont_not_saved_edit_lock_expired#:#Entschuldigung, Ihre Änderungen konnten nicht gespeichert werden. Die Seite wurde zwischenzeitlich von einem / einer anderen Benutzer*in zur Bearbeitung gesperrt. Sie können diesen Dialog schließen und dann den Inhalt in Ihre Zwischenablage kopieren. +content#:#cont_notify_on_blocked_users_info#:#Sie werden benachrichtigt, sobald Benutzer*innen gesperrt werden, weil Sie die maximale Anzahl an Antwortversuchen überschritten haben. +content#:#cont_offline_mode_allow_info#:#Erlaubt die Nutzung des Lernmoduls ohne Internet-Anbindung im SCORM-Offline-Player. Dazu wird das Lernmodul über das ▼-Menü heruntergeladen und mit einem Add-on des Browsers Firefox dargestellt. Nach dem Bearbeiten des Lernmoduls müssen Benutzer*innen über die Option "Offline-Modus" ihre Lernstandsdaten in das System importieren. +content#:#cont_online_info#:#Nur wenn das SCORM-Lernmodul online geschaltet ist, können Benutzer*innen auf das Lernmodul zugreifen. Wenn nicht ist das SCORM-Lernmodul nur für Personen mit Bearbeitungsrechten verfügbar. +content#:#cont_open_iframe#:#Öffnet im selben Fenster (iFrame) unterhalb des Hauptmenüs +content#:#cont_open_normal#:#Öffnet in einem neuen Tab oder ersatzweise in einem neuem Fenster ohne Hauptmenü +content#:#cont_open_window#:#Öffnet zwingend in einem neuen Fenster ohne Hauptmenü +content#:#cont_permission_object_desc#:#Falls ein Berechtigungsobjekt ausgewählt wird, wird der Block nur Benutzer*innen mit dem gewählten Recht am Berechtigungsobjekt angezeigt. +content#:#cont_question_type#:#Fragentyp +content#:#cont_restrict_forw_nav_info#:#Benutzer*innen können eine nachfolgende Seite erst dann aufrufen, wenn sie zuvor alle vorherigen Testfragen korrekt beantwortet haben. +content#:#cont_saved_map_data#:#Imagemap gespeichert. +content#:#cont_sc_auto_continue_info#:#Leitet Benutzer*innen automatisch nach der letzten Aktivität in das nächste SCO weiter. Diese Funktion wird nicht von allen SCORM 1.2 Lernmodulen unterstützt. +content#:#cont_sc_auto_review_completed#:#nicht speichern ab Status "vollständig bearbeitet" +content#:#cont_sc_auto_review_completed_and_passed#:#nicht speichern ab Status "vollständig bearbeitet" und "bestanden" +content#:#cont_sc_auto_review_completed_not_failed_or_passed#:#nicht speichern ab Status "vollständig bearbeitet" (sofern nicht "nicht bestanden") oder "bestanden" +content#:#cont_sc_auto_review_completed_or_passed#:#nicht speichern ab Status "vollständig bearbeitet" oder "bestanden" +content#:#cont_sc_auto_review_info_2004#:#Wenn Benutzer*innen für ein Kapitel / SCO einen auszuwählenden Status in einer Bearbeitungssitzung erreicht haben, wird dieser festgeschrieben. Benutzer*innen können den Status auch in späteren Bearbeitungssitzungen nicht mehr ändern.
Im seltenen Fall, dass das Lernmodul "Sequencing & Navigation" gemäß SCORM 2004 nutzt, sollte die Option "immer (empfohlen)" gewählt werden. +content#:#cont_sc_auto_review_passed#:#nicht speichern ab Status "bestanden" +content#:#cont_sc_auto_review_passed_or_failed#:#nicht speichern ab Status "bestanden" oder "nicht bestanden" +content#:#cont_sc_id_setting_info#:#Für den Fall, dass eine numerische ID für student_id (SCORM 1.2) bzw. learner_id (SCORM 2004) beim Lernmodul zu Problemen führt, nutzen Sie die Option „Anmeldename“. Der Zusatz „Ref-ID“ bzw. „Obj-ID“ kann für Lernmodule sinnvoll sein, die sich mit einem externen Server verbinden. +content#:#cont_sc_id_setting_user_id#:#cate-UserId (Standard) +content#:#cont_sc_id_setting_user_id_plus_obj_id#:#cate-UserId zuzüglich ObjId des Lernmoduls +content#:#cont_sc_id_setting_user_id_plus_ref_id#:#cate-UserId zuzüglich RefId des Lernmoduls +content#:#cont_sc_id_setting_user_login#:#Anmeldename +content#:#cont_sc_id_setting_user_login_plus_obj_id#:#Anmeldename zuzüglich Obj-ID des Lernmoduls +content#:#cont_sc_id_setting_user_login_plus_ref_id#:#Anmeldename zuzüglich RefId des Lernmoduls +content#:#cont_sc_usession#:#Automatische Abmeldung verhindern +content#:#cont_sc_usession_info#:#Es werden regelmäßig Anfragen an das System gesendet, damit der/die Benutzer*in in der Plattform weiter eingeloggt bleibt. Das System würde sonst die Bearbeitung des SCORM-Lernmoduls nicht als Aktivität werten und die Sitzung beenden. Dadurch gingen Bearbeitungsdaten verloren. +content#:#cont_second#:#Zweite Antwort +content#:#cont_select_other_qpool#:#Wählen Sie einen anderen Pool aus! +content#:#cont_sequencing_info#:#Aktiviert die Vorgaben des Lernmoduls zur interaktiven Steuerung der Navigationsmöglichkeiten von Benutzer*innen innerhalb des Lernmoduls in Abhängigkeit von Ereignissen oder Ergebnissen.
Prüfen Sie zunächst, ob Ihr Lernmodul solche Angaben zu "Sequencing & Navigation" überhaupt enthält. Dies ist nur selten der Fall. +content#:#cont_snippet_from_another_installation#:#Inhaltsbaustein stammt von einem anderem System. +content#:#cont_third_and_more#:#Dritte oder später +content#:#cont_time_from_lms#:#Das System bestimmt die Bearbeitungszeiten +content#:#cont_time_from_lms_info#:#Um häufig auftretende Schwierigkeiten bei der Zeiterfassung durch das SCORM-Lernmodul vorzubeugen, kann die Zeiterfassung durch das System selbst vorgenommen werden. Die strikten Vorgaben des SCORM-Standards werden hierbei eingehalten. +content#:#cont_to_focus_return_crs#:#Zurück zum Training +content#:#cont_tracking_byuser#:#Nach Benutzerkonten +content#:#cont_transl_master_language_not_allowed#:#Um eine Übersetzung zu importieren, müssen Sie zumindest eine zusätzliche Sprache unter "Einstellungen > Mehrsprachigkeit" aktivieren. +content#:#cont_tries_reset_on_visit_info#:#Benutzer*innen haben bei jedem Aufruf einer Seite mit einer Testfrage die maximale Anzahl an Antwortversuchen. Die Testfragen müssen jedes Mal beantwortet werden. +content#:#cont_tries_store_info#:#Die Zahl der Antwortversuche wird festgehalten und gespeichert. Korrekt beantwortete Fragen müssen nicht mehr beantwortet werden. Benutzer*innen können Fragen nach Erreichen der maximalen Versuche nicht erneut beantworten. +content#:#cont_update_my_courses#:#Meine Trainings bearbeiten +content#:#cont_upload_dir_info#:#Server-Verzeichnis, von dem große SCORM- und HTML-Pakete kopiert werden können, statt sie direkt hochzuladen. Nur Systemadministrator*innen sehen eine Auswahl von Dateien aus diesem Verzeichnis. Bitte geben Sie einen vollständigen Serverpfad ohne Slash am Ende ein. +content#:#cont_url_info#:#URL einer Mediendatei oder Youtube-URL +content#:#cont_user_blocked#:#Gesperrte*r Benutzer*in ohne weitere Antwortversuche im Lernmodul "%s". +content#:#cont_user_blocked2#:#Ein*e Benutzer*in hat die maximale Anzahl an Antwortversuchen für eine Frage im Lernmodul überschritten. Diese*r Benutzer*in kann nur dann weitere Seiten aufrufen, wenn Sie die Sperre des/der Benutzer*in aufheben. +content#:#cont_user_search_did_not_match#:#Es wurde kein*e Benutzer*in gefunden. +content#:#cont_wiki_link_dialog#:#Link zu einer Wiki-Seite (Dialog) +content#:#content_no_edit_lock#:#Die Seite wird aktuell durch eine*n andere*n Benutzer*in bearbeitet. +content#:#glo_online_info#:#Nur wenn das Glossar online geschaltet ist, können Benutzer*innen das Glossar sehen und benutzen. +content#:#glo_term_must_belong_to_glo#:#Die Aktion kann nur für Begriffe ausgeführt werden, welche innerhalb dieses Glossars definiert wurden. +content#:#lm_import#:#cate-Lernmodul importieren +content#:#mob_upload_dir_info#:#Server-Verzeichnis, von dem mehrere Dateien gleichzeitig in einen Medienpool eingefügt werden können. Nur Systemadministrator*innen sehen die Dateien in diesem Verzeichnis. Bitte geben Sie einen vollständigen Pfad ohne abschließenden Slash an. +content#:#msg_page_no_public_access#:#Die aufgerufene Seite ist für den öffentlichen Bereich nicht freigegeben. Bitte melden Sie sich zuerst an, um Zugang zu dieser Seite zu erhalten. +content#:#offline_mode_users_info#:#Benutzer*innen können manuell auf dem Offline-Modus herausgenommen werden und danach auch wieder das Lernmodul online benutzen. Dies ergibt Sinn, wenn z.B. der Laptop mit den Lernmodulen gestohlen wurde. +content#:#sahs_insert_pg_from_clip#:#Seiten aus cate-Lernmodul importieren +content#:#sahs_insert_st_from_clip#:#Kapitel aus cate-Lernmodul importieren +content#:#sahs_insert_st_from_clip_inside_chap#:#Kapitel aus cate-Lernmodul importieren (innerhalb eines Kapitels) +content#:#seq_endsession#:#Die aktuelle Trainingssitzung wurde beendet. +content#:#send_recommendation#:#Training empfehlen +copa#:#copa_activation_online_info#:#Nur wenn die Inhaltsseite online geschaltet ist, können Benutzer*innen auf die Inhaltsseite zugreifen. Wenn nicht, ist die Inhaltsseite nur für Administrator*innen verfügbar. +copg#:#copg_allow_html_info#:#Benutzer*innen können HTML oder Javascript in Seiteninhalten verwenden. Dies kann zu Sicherheitsproblemen führen. Sie sollten diese Funktion nur für Komponenten aktivieren, die von vertrauenswürdigen Benutzer*innen verwendet werden. Die Möglichkeit, HTML in dieser Art einzubinden, wird möglicherweise in einer zukünftigen Version komplett entfallen. +copg_pgcp_coin#:#copg_pgcp_coin_prg_ref_id#:#Qualifizierungsprogramm +copg_pgcp_cosi#:#copg_pgcp_cosi_prg_ref_id#:#Qualifizierungsprogramm +copg_pgcp_coin#:#copg_pgcp_coin_no_valid_object_selected#:#Es ist kein gültiges Qualifizierungsprogramm gewählt +copg_pgcp_cosi#:#copg_pgcp_cosi_no_valid_object_selected#:#Es ist kein gültiges Qualifizierungsprogramm gewählt +copg_pgcp_coin#:#copg_pgcp_coin_prg_deleted#:#Es ist kein gültiges Qualifizierungsprogramm gewählt +copg_pgcp_cosi#:#copg_pgcp_cosi_prg_deleted#:#Es ist kein gültiges Qualifizierungsprogramm gewählt +copg_pgcp_cotgs#:#copg_pgcp_cotgs_cmd_insert#:#Tag-Suche einfügen +cron#:#cro_job_rc_job_manual_reset#:#Der Cron-Job wurde von den Systemadministrator*innen reaktiviert. +cron#:#cro_job_rc_job_no_result#:#Vom Cron-Job wurde kein sauberes Resultat übermittelt. +cron_crnhk_acwaiting#:#cron_crnhk_acwaiting_conflict_resolved#:#Die Warteliste wurde wieder zur Absage freigegeben. +cron_crnhk_acwaiting#:#cron_crnhk_acwaiting_crs_ref_id#:#Ref-ID des Trainings +cron_crnhk_acwaiting#:#cron_crnhk_acwaiting_crs_title#:#Trainingstitel +cron_crnhk_acwaiting#:#cron_crnhk_acwaiting_no_id_found#:#Es wurde keine ID gefunden, die zu einem Log-Eintrag passt. +cron_crnhk_ccjs#:#cron_crnhk_ccjs_all_jobs_deleted#:#Alle Überwachungen von Cron-Jobs wurden entfernt. +cron_crnhk_ccjs#:#cron_crnhk_ccjs_jobs_under_surveillance#:#Überwachte Cron-Jobs +cron_crnhk_ccjs#:#cron_crnhk_ccjs_title#:#Überwachung Cron-Jobs +cron_crnhk_ccjs#:#cron_crnhk_ccjs_wrong_input_warning#:#Es ist ein Fehler aufgetreten. Bitte achten Sie darauf, dass in jeder Zeile ein Cron-Job ausgewählt ist und die Toleranz einen Wert von mindestens 1 enthält. Jeder Cron-Job darf nur einmal überwacht werden. +cron_crnhk_datachanges#:#cron_crnhk_datachanges_course_ref_id#:#Training Ref-ID +cron_crnhk_datachanges#:#cron_crnhk_datachanges_course_title#:#Titel des Trainings +cron_crnhk_datachanges#:#cron_crnhk_datachanges_crs_id#:#Trainings-ID +cron_crnhk_datachanges#:#cron_crnhk_datachanges_delete_courses#:#Trainings löschen +cron_crnhk_datachanges#:#cron_crnhk_datachanges_error_certificate_not_activated#:#Für dieses Training sind Zertifikate nicht aktiviert. +cron_crnhk_datachanges#:#cron_crnhk_datachanges_error_course_not_found_for_title#:#Es wurde kein Training zu dem angegebenen Titel gefunden. +cron_crnhk_datachanges#:#cron_crnhk_datachanges_error_double_deleted_courses#:#Training kann nicht gelöscht werden, da ein doppelter Eintrag besteht. +cron_crnhk_datachanges#:#cron_crnhk_datachanges_error_not_passed#:#Der/die Benutzer*in %s hat das Training noch nicht abgeschlossen. +cron_crnhk_datachanges#:#cron_crnhk_datachanges_error_not_passed_member#:#Der/die Benutzer*in ist kein Trainingssmitglied oder hat das Training noch nicht abgeschlossen. +cron_crnhk_datachanges#:#cron_crnhk_datachanges_error_only_xwbr_xcmb#:#Es werden nur Ref-IDs von Online-Seminaren oder Teilnahmelisten akzeptiert. +cron_crnhk_datachanges#:#cron_crnhk_datachanges_error_ref_id_equals_null#:#Die Ref-ID des Trainings muss größer 0 sein. +cron_crnhk_datachanges#:#cron_crnhk_datachanges_error_same_courses#:#Eine Übertragung der Teilnahmen ist nicht möglich. Die Trainings mit folgenden Ref-IDs sind von beiden Benutzer*innen gebucht:%s. +cron_crnhk_datachanges#:#cron_crnhk_datachanges_error_unknown_crs#:#Ein Training mit dieser Ref-ID ist nicht im System. +cron_crnhk_datachanges#:#cron_crnhk_datachanges_error_unknown_user#:#Benutzerkonto '%s' nicht bekannt. +cron_crnhk_datachanges#:#cron_crnhk_datachanges_error_user_has_open_courses#:#Eine Übertragung der Teilnahmen ist nicht möglich. Für den/die Benutzer*in %s bestehen noch offene Trainings mit folgenden Ref-IDs: %s +cron_crnhk_datachanges#:#cron_crnhk_datachanges_failure_cant_delete_crs#:#Konnte Training mit der Ref-ID %s nicht löschen. +cron_crnhk_datachanges#:#cron_crnhk_datachanges_failure_cant_delete_crs_with_user#:#Konnte Training mit der Ref-ID %s für User mit der ID %s nicht löschen. +cron_crnhk_datachanges#:#cron_crnhk_datachanges_form_udf_bwv_id#:#gutberaten-ID +cron_crnhk_datachanges#:#cron_crnhk_datachanges_info_deactivate_user#:#Benutzerkonto %s wurde deaktiviert. +cron_crnhk_datachanges#:#cron_crnhk_datachanges_info_idd_send#:#Für das Benutzerkonto %s wurden bereits IDD-Zeiten gemeldet! BWV-ID: %sBuchungs-ID: %s +cron_crnhk_datachanges#:#cron_crnhk_datachanges_info_no_members_found#:#Auf dem Training mit der Ref-ID %s wurden keine Teilnehmenden gefunden. +cron_crnhk_datachanges#:#cron_crnhk_datachanges_merge_info_text#:#Bitte beachten Sie, dass der/die Benutzer*in nach der Zusammenlegung der Teilnahmen nicht mehr auf das Training zugreifen kann und die Weiterbildungszeiten, sofern nicht schon geschehen, nicht mehr an das externe System gemeldet werden. +cron_crnhk_datachanges#:#cron_crnhk_datachanges_no_user_found#:#Es wurde kein*e Benutzer*in gefunden, auf den/die ein Anmeldename "%s" aus der Teilnahmeliste passt. +cron_crnhk_datachanges#:#cron_crnhk_datachanges_remove_course#:#Training aus der Historisierung löschen +cron_crnhk_datachanges#:#cron_crnhk_datachanges_remove_course_from_history#:#Gelöschtes Training aus Historisierung entfernen +cron_crnhk_datachanges#:#cron_crnhk_datachanges_remove_user_from_course#:#Benutzer aus Training entfernen +cron_crnhk_datachanges#:#cron_crnhk_datachanges_reopen_course_member_online_seminar#:#Teilnahmeliste / Online-Seminar öffnen +cron_crnhk_datachanges#:#cron_crnhk_datachanges_sig_list_repaced#:#Die Unterschriftenliste wurde erfolgreich ausgetauscht. +cron_crnhk_datachanges#:#cron_crnhk_datachanges_status_set_failed#:#Der Status wurde erfolgreich auf "nicht teilgenommen" gesetzt. +cron_crnhk_datachanges#:#cron_crnhk_datachanges_success_delete_course_from_history#:#Das Training wurde erfolgreich aus der Historisierung entfernt. +cron_crnhk_datachanges#:#cron_crnhk_datachanges_success_removed_user_from_course#:#Der/die Teilnehmer*in wurde erfolgreich aus dem Training entfernt. +cron_crnhk_datachanges#:#cron_crnhk_datachanges_update_course_certificate#:#Zertifikate aktualisieren (ganzes Training) +cron_crnhk_datachanges#:#cron_crnhk_datachanges_update_course_certificates#:#Zertifikate aktualisieren (ganzes Training) +cron_crnhk_datachanges#:#cron_crnhk_datachanges_update_user_certificate#:#Zertifikate aktualisieren (einzelne Benutzerkonten) +cron_crnhk_datachanges#:#cron_crnhk_datachanges_user_to_activate#:#Benutzerkonto (Aktiv) +cron_crnhk_datachanges#:#cron_crnhk_datachanges_user_to_activate_info#:#Benutzerkonto, das nach dem Übertrag aktiv sein soll +cron_crnhk_datachanges#:#cron_crnhk_datachanges_user_to_deactivate#:#Benutzerkonto (Inaktivierung) +cron_crnhk_datachanges#:#cron_crnhk_datachanges_user_to_deactivate_info#:#Benutzerkonto, das nach dem Übertrag inaktiv sein soll +cron_crnhk_datachanges#:#cron_crnhk_datachanges_xcmb_ref_id#:#Ref-ID der Teilnahmeliste +cron_crnhk_devk_uoi#:#cron_crnhk_devk_uoi_devk_usr_prop_idd#:#Feld-Id für Weiterbildungszeit +cron_crnhk_dvag_uoi#:#cron_crnhk_dvag_uoi_udf_c_idd_trainings#:#VB darf dezentrale Trainings mit Zeiten anlegen und veranstalten +cron_crnhk_dvag_uoi#:#cron_crnhk_dvag_uoi_udf_current_year_idd#:#Status aktuelles Jahr +cron_crnhk_dvag_uoi#:#cron_crnhk_dvag_uoi_udf_idd_requires#:#Informationen zur Pflichtigkeit des VB +cron_crnhk_dvag_uoi#:#cron_crnhk_dvag_uoi_udf_p_1_year_idd#:#Status nächstes Jahr +cron_crnhk_funk_uoi#:#cron_crnhk_funk_uoi_xuoi_prop_idd_relevant#:#Relevant +cron_crnhk_gdag_uoi#:#cron_crnhk_gdag_uoi_udf_idd_betroffen_ab#:#betroffen ab +cron_crnhk_gdag_uoi#:#cron_crnhk_gdag_uoi_udf_idd_betroffen_bis#:#betroffen bis +cron_crnhk_lvm_uoi#:#cron_crnhk_lvm_uoi_udf_current_year_idd#:#Status aktuelles Jahr +cron_crnhk_lvm_uoi#:#cron_crnhk_lvm_uoi_udf_m_1_year_idd#:#Status -1 Jahre +cron_crnhk_lvm_uoi#:#cron_crnhk_lvm_uoi_udf_m_2_year_idd#:#Status -2 Jahre +cron_crnhk_lvm_uoi#:#cron_crnhk_lvm_uoi_udf_m_3_year_idd#:#Status -3 Jahre +cron_crnhk_lvm_uoi#:#cron_crnhk_lvm_uoi_udf_m_4_year_idd#:#Status -4 Jahre +cron_crnhk_lvm_uoi#:#cron_crnhk_lvm_uoi_udf_m_5_year_idd#:#Status -5 Jahre +cron_crnhk_lvm_uoi#:#cron_crnhk_lvm_uoi_udf_p_1_year_idd#:#Status nächstes Jahr +cron_crnhk_part_import#:#cron_crnhk_part_import_approval_declined#:#Genehmigung abgelehnt +cron_crnhk_part_import#:#cron_crnhk_part_import_course_data_info#:#Spaltendefinition Trainingstabelle +cron_crnhk_part_import#:#cron_crnhk_part_import_crs_idd_col_title#:#Spalte gebuchte Zeit +cron_crnhk_part_import#:#cron_crnhk_part_import_email#:#E-Mail +cron_crnhk_part_import#:#cron_crnhk_part_import_ext_crs_id#:#Trainings-ID (extern) +cron_crnhk_part_import#:#cron_crnhk_part_import_extern_user_id_field#:#cate-Benutzer-ID +cron_crnhk_part_import#:#cron_crnhk_part_import_extern_user_id_field_info#:#Das ausgewählte Feld sollte die Semantik des Benutzerdatenfeldes in der Teilnahmetabelle tragen. +cron_crnhk_part_import#:#cron_crnhk_part_import_field_email#:#E-Mail +cron_crnhk_part_import#:#cron_crnhk_part_import_field_to_identify_saved#:#Die Einstellung für das Benutzerdatenfeld wurde erfolgreich gespeichert. +cron_crnhk_part_import#:#cron_crnhk_part_import_idd_col_title#:#Spalte Zeit +cron_crnhk_part_import#:#cron_crnhk_part_import_idd_default_achieved#:#Standardeintrag erworbene Zeit +cron_crnhk_part_import#:#cron_crnhk_part_import_idd_default_booked#:#Standardeintrag gebuchte Zeit +cron_crnhk_part_import#:#cron_crnhk_part_import_import_file_config#:#Definition der Spalten bei zwei Tabellenblättern +cron_crnhk_part_import#:#cron_crnhk_part_import_invalid_field_to_identify_user#:#Bitte wählen Sie ein Benutzerdatenfeld aus. +cron_crnhk_part_import#:#cron_crnhk_part_import_invalid_input_idd_default_achived#:#Ungültige eingabe bei den Zeiten Standardeinstellungen. Bitte nur Zahlen oder nichts eingeben. +cron_crnhk_part_import#:#cron_crnhk_part_import_invalid_input_idd_default_booked#:#Ungültige eingabe bei den Zeiten Standardeinstellungen. Bitte nur Zahlen oder nichts eingeben. +cron_crnhk_part_import#:#cron_crnhk_part_import_job_description#:#Importiert Teilnahmen, die sich auf zwei Tabellenblättern getrennt befinden. +cron_crnhk_part_import#:#cron_crnhk_part_import_partricipation_idd_col_title#:#Spalte erworbene Zeit +cron_crnhk_part_import#:#cron_crnhk_part_import_show_user_mapping#:#Übersetzung Benutzerkonto +cron_crnhk_part_import#:#cron_crnhk_part_import_single_sheet_job_description#:#Importiert Teilnahmen, die sich alle auf einem Tabellenblatt befinden. +cron_crnhk_part_import#:#cron_crnhk_part_import_status_ilias#:#Status des Systems +cron_crnhk_part_import#:#cron_crnhk_part_import_token#:#Token +cron_crnhk_part_import#:#cron_crnhk_part_import_usernames_info#:#Diese Benutzerkonten sind berechtigt, das Plugin zu konfigurieren. +cron_crnhk_part_import#:#cron_crnhk_part_import_waiting_cancelled#:#von der Warteliste storniert worden +cron_crnhk_scheduledevents#:#cron_crnhk_scheduledevents_table_col_issuer_ref#:#Origin-Ref-ID +cron_crnhk_sv_uoi#:#cron_crnhk_sv_uoi_udf_prop_idd#:#Weiterbildungszeit +cron_crnhk_venues#:#cron_crnhk_venues_description#:#Übersicht aller Veranstaltungsorte +cron_crnhk_venues#:#cron_crnhk_venues_email_not_valid#:#Die eingegebene E-Mail-Adresse ist nicht valide. +cron_crnhk_WBDCommunicator#:#cron_crnhk_WBDCommunicator_communicator_description#:#Meldet die Weiterbildungszeit an einen externen Dienstleister. +cron_crnhk_WBDCommunicator#:#cron_crnhk_WBDCommunicator_idd_is_zero#:#Versuch eine Teilnahme mit 0 Punkten zu melden. +cron_crnhk_WBDCommunicator#:#cron_crnhk_WBDCommunicator_learning_time#:#Weiterbildungszeit +cron_crnhk_workreminder#:#cron_crnhk_workreminder_min_member_description#:#Versendet Reminder: Mindestteilnehmerzahl nicht erreicht +cron_crnhk_workreminder#:#cron_crnhk_workreminder_min_member_title#:#Reminder: Mindestteilnehmerzahl +cron_crnhk_workreminder#:#cron_crnhk_workreminder_xcmb_not_finalized_description#:#Versendet Reminder: Teilnahmestatus nicht gesetzt für Teilnahmelisten +cron_crnhk_workreminder#:#cron_crnhk_workreminder_xcmb_not_finalized_title#:#Reminder: Status Teilnahmeliste +cron_crnhk_workreminder#:#cron_crnhk_workreminder_xwbr_not_finalized_description#:#Versendet Reminder: Teilnahmestatus nicht gesetzt für Online-Seminare +cron_crnhk_workreminder#:#cron_crnhk_workreminder_xwbr_not_finalized_title#:#Reminder: Status Online-Seminar +cron_crnhk_xccr#:#cron_crnhk_xccr_recipients_saved#:#Die Empfänger*innen wurden erfolgreich gespeichert. +cron_crnhk_xccr#:#cron_crnhk_xccr_target_ref_id#:#Ref-ID des Trainings +cron_crnhk_xccr#:#cron_crnhk_xccr_title#:#Trainingstitel +cron_crnhk_xcmbbelowcrs#:#cron_crnhk_xcmbbelowcrs_job_title#:#Beziehungen zwischen Teilnahmelisten und Trainings erfassen +cron_crnhk_xcmbbelowcrs#:#cron_crnhk_xcmbbelowcrs_job_description#:#Speichert, unter welchem Training eine Teilnahmeliste abgelegt wurde. +cron_crnhk_xuch#:#cron_crnhk_xuch_confirm#:#Sind Sie sich sicher, dass Sie alle Trainings neu historisieren wollen? +cron_crnhk_xuch#:#cron_crnhk_xuch_crs_re_historized#:#Trainings wurden erfolgreich neu historisiert. +cron_crnhk_xuch#:#cron_crnhk_xuch_re_historize_courses#:#Trainings neu historisieren +cron_crnhk_xuch#:#cron_crnhk_xuch_rehistorizeCourses#:#Trainings neu historisieren +cron_crnhk_xuch#:#cron_crnhk_xuch_title#:#Hier können Sie alle Trainings erneut historisieren. +crs#:#activation_times_not_valid#:#Die Zeitdauer für "Verfügbarkeit" ist nicht gültig. +crs#:#crs_accept_subscriber#:#Aufnahme in Training "%s" +crs#:#crs_accept_subscriber_body#:#Sie sind in das Training "%s" aufgenommen worden. +crs#:#crs_activation_limited_visibility_info#:#Außerhalb des angegebenen Zeitraums wird der Trainingstitel angezeigt, die Inhalte aber nicht. +crs#:#crs_activation_online_info#:#Nur wenn das Training online geschaltet ist, können Benutzer*innen es buchen und gebuchte Teilnehmer*innen darauf zugreifen. Wenn nicht, ist es nur für seine Administrator*innen oder andere Benutzer*innen mit dem Recht „Einstellungen bearbeiten“ daran verfügbar. +crs#:#crs_add_remove_from_desktop_info#:#Objekte innerhalb des Trainings können den Favoriten hinzugefügt werden. +crs#:#crs_added#:#Ein neues Training wurde hinzugefügt +crs#:#crs_added_member#:#Aufnahme in Training "%s" +crs#:#crs_added_member_body#:#Sie sind in das Training "%s" aufgenommen worden. +crs#:#crs_admin#:#Trainingsadministrator +crs#:#crs_administrators#:#Trainingsadministratoren +crs#:#crs_admission_link_failure_availability#:#Kein Beitritt möglich. Der Training ist online. +crs#:#crs_admission_link_failure_offline#:#Kein Beitritt möglich. Der Training ist offline. +crs#:#crs_admission_link_failure_registration_period#:#Kein Beitritt möglich. Die Anmeldung zum Training liegt ausserhalb des Beitrittszeitraumes. +crs#:#crs_admission_link_success_registration#:#Erfolgreich dem Training "%s" beigetreten. +crs#:#crs_agreement_required#:#Sie können diesem Training nur beitreten, wenn Sie der Nutzungsvereinbarung zustimmen. +crs#:#crs_at_least_one_admin#:#Diesem Training muss mindestens ein Administrator zugeordnet sein. +crs#:#crs_auto_notification_info#:#Mail-Benachrichtigungen werden automatisch an jene Mitglieder versendet, die von einem Tutor oder Administrator in das Training aufgenommen wurden. +crs#:#crs_awrn_current_course#:#Aktuelles Training +crs#:#crs_awrn_current_course_info#:#Innerhalb eines Trainings werden alle Mitglieder des Trainings aufgelistet. +crs#:#crs_awrn_support_contacts#:#Trainingsbetreuung +crs#:#crs_awrn_support_contacts_info#:#Benutzer, die das Training betreuen, werden aufgelistet. Die jeweiligen Benutzer werden im Reiter Mitglieder des Trainings für die Trainingsbetreuung eingetragen. +crs#:#crs_blocked_member#:#Status in Training "%s" +crs#:#crs_blocked_member_body#:#Ihre Mitgliedschaft im Training "%s" wurde gesperrt. +crs#:#crs_breadcrumb_crs_only#:#Brotkrumenpfad beginnt mit Training +crs#:#crs_cancel_subscription#:#Austritt aus Training "%s" +crs#:#crs_cancel_subscription_body#:#die Teilnehmerin/der Teilnehmer %s ist aus dem Training "%s" ausgetreten. +crs#:#crs_cancel_subscription_body2#:#Eventuell sind Teilnehmende in die Warteliste dieses Trainings eingetragen. Um die Liste der Teilnehmenden anzuzeigen, rufen Sie bitte folgenden Link auf: +crs#:#crs_cancellation_end#:#Spätester Trainingsaustritt +crs#:#crs_cancellation_end_info#:#Mitglieder können nur bis zum gesetzten Datum selbstständig die Trainingsmitgliedschaft beenden. +crs#:#crs_cancellation_end_rbac_info#:#Das Stornierungsende wurde am %s erreicht. Ein Austritt aus dem Training ist jetzt nicht mehr möglich. +crs#:#crs_cdf_edit_member#:#Trainingsspezifische Benutzerdaten bearbeiten +crs#:#crs_cdf_tbl_last_edit#:#Aktualisiert (Trainingsspezifische Daten) +crs#:#crs_content#:#Trainingsinhalt +crs#:#crs_copy#:#Training kopieren +crs#:#crs_count_members#:#Anzahl der Mitglieder +crs#:#crs_course_status_of_users#:#Bestehen des Trainings +crs#:#crs_custom_user_fields#:#Trainingsspezifische Benutzerdaten +crs#:#crs_details#:#Trainingsdetails +crs#:#crs_dismiss_member#:#Mitgliedschaft im Training "%s" beendet +crs#:#crs_dismiss_member_body#:#Ihre Mitgliedschaft im Training "%s" ist beendet worden. +crs#:#crs_enable_map#:#Karte zum Training aktivieren +crs#:#crs_export#:#Trainingsxport +crs#:#crs_groupings#:#Trainingsgruppierungen +crs#:#crs_grp_already_assigned#:#Da Sie bereits Mitglied in einem der Trainings sind, können Sie nicht einem weiteren Training aus der Liste beitreten! +crs#:#crs_grp_assign_crs#:#Training zuordnen +crs#:#crs_grp_assignments#:#Zuordnung von Trainingsmitgliedern zu Gruppen +crs#:#crs_grp_info_reg#:#Die folgendas Trainings unterliegen einer Mitgliedschaftsbeschränkung. Sie können nur einem dieser Trainings beitreten: +crs#:#crs_grp_matriculation_required#:#Zur Aufnahme in diese Trainingsgruppierung ist eine eindeutige Matrikelnummer notwendig.
Bitte tragen Sie diese in den Einstellungen des Persönlichen Profils ein. +crs#:#crs_grp_no_courses_assigned#:#Keine zugeordneten Trainings. +crs#:#crs_grp_table_assigned_courses#:#Zugeordnete Trainings +crs#:#crs_header_archives#:#Trainingsarchive +crs#:#crs_header_delete_members#:#Sie möchten folgende Mitglieder aus dem Training austragen? +crs#:#crs_import#:#Training importieren +crs#:#crs_info_agree#:#Ich bin damit einverstanden, dass die oben angegebenen Daten von Trainingsadministratoren eingesehen werden können. +crs#:#crs_info_agreement#:#Die folgenden Daten können von Trainingsadministratoren eingesehen werden: +crs#:#crs_info_reg_direct#:#Sie können diesem Training direkt beitreten. +crs#:#crs_info_reg_password#:#Wenn Sie das Trainingspasswort von einem Trainingsadministrator erhalten haben, können Sie in dieses Training beitreten. +crs#:#crs_info_settings#:#Trainingsinfo +crs#:#crs_info_start#:#Bitte bearbeiten Sie zunächst alle unten aufgeführten Materialien.
Wenn Sie alle Objekte bearbeitet haben, werden weitere Trainingsinhalte für Sie freigeschaltet. +crs#:#crs_intro_course_group_notification_for#:#dies ist die Zusammenfassung der Nachrichten aus Ihren Trainings und Gruppen, für die die automatische Benachrichtigung aktiviert wurde. +crs#:#crs_intro_course_group_notification_index#:#Es gibt Nachrichten aus folgendas Trainings und Gruppen für den Zeitraum von %1$s bis %2$s: +crs#:#crs_lim_assigned#:#Bereits Mitglied in Training "%s". +crs#:#crs_link_hide_next_sessions#:#Zukünftige Termine ausblenden +crs#:#crs_link_hide_prev_sessions#:#Vergangene Termine ausblenden +crs#:#crs_link_show_all_next_sessions#:#Alle zukünftigen Termine anzeigen +crs#:#crs_link_show_all_prev_sessions#:#Alle vergangenen Termine anzeigen +crs#:#crs_loc_confirm_delete_tst#:#Sind Sie sicher, dass die Zuordnung der Tests zum lernzielorientierten Training gelöscht werden soll? +crs#:#crs_loc_form_assign_initial_info#:#Einen der bereits im Training vorliegenden Tests als Einstiegstest auswählen +crs#:#crs_loc_settings_err_qstart#:#Die Option "Abschlusstest als Startobjekt" wurde deaktiviert, da sie nur für Trainings ohne Einstiegstest verwendet werden kann. +crs#:#crs_loc_settings_reset_enable_info#:#Trainingsmitglieder können die eigenen Testergebnisse löschen, um das Training von neuem zu beginnen. Diese Einstellung sollte nur in der Entwicklungsphase des Trainings genutzt werden, um dessen Ablauf leichter zu überprüfen. +crs#:#crs_loc_settings_tbl#:#Einstellungen zum lernziel-orientierten Training +crs#:#crs_loc_type_initial_all_info#:#Anhand der Ergebnisse des Einstiegstests empfiehlt das System Lerninhalte für die noch nicht erreichten Lernziele. Ein Qualifizierender Test prüft zum Abschluss die Erreichung aller Lernziele. +crs#:#crs_loc_type_qualified_info#:#Das Training startet mit einem Test, der individuell prüft, ob die Trainingsmitglieder die Lernziele bereits beherrschen. Beim Bestehen des Tests, brauchen weder weitere Lerninhalte noch Tests bearbeitet werden. Für alle nicht erreichten Lernziele empfiehlt cate Lerninhalte. Die Erreichung dieser Lernziele wird in einem weiteren Testdurchlauf abgeprüft. +crs#:#crs_mail_all#:#Für alle Teilnehmenden +crs#:#crs_mail_all_info#:#Teilnehmende und Referent*innen können die Funktion "Mail an Teilnehmer*innen" im Reiter "Mitglieder" nutzen. +crs#:#crs_mail_context_automatic_info#:#Weitere, automatische Mails im Kontext des Trainings (Austritt, Absage, Storno, etc.) +crs#:#crs_mail_context_automatic_title#:#Automatische Mail an Trainingsteilnehmer +crs#:#crs_mail_context_invitation_info#:#Einladungsmail für die Mitglieder eines Trainings. +crs#:#crs_mail_context_invitation_title#:#Einladungsmail an Trainingsteilnehmer +crs#:#crs_mail_context_member_info#:#Für die Kontakt-E-Mails auf der Info-Seite eines Trainings +crs#:#crs_mail_context_member_title#:#Training: Info-Seite +crs#:#crs_mail_context_tutor_info#:#Freitext-Mails aus den Mitglieder- und Lernfortschrittsansichten in Trainings +crs#:#crs_mail_context_tutor_title#:#Training: Mail an Mitglieder +crs#:#crs_mail_permanent_link#:#Wählen Sie den folgenden Link, um auf das Trainingsinhalt zuzugreifen: +crs#:#crs_mail_tutors_only#:#Nur für Trainingsadministratoren und Referenten +crs#:#crs_mail_tutors_only_info#:#Nur Administrator*innen und Referent*innen können die Funktion "Mail an Teilnehmende" im Reiter "Mitglieder" nutzen. +crs#:#crs_mail_type#:#Mail an Teilnehmende +crs#:#crs_map_location#:#Ort auf Karte zum Training +crs#:#crs_mem_tbl_header#:#Trainingsteilnehmer +crs#:#crs_member#:#Teilnehmer +crs#:#crs_member_administration#:#Teilnahmeverwaltung +crs#:#crs_members#:#Teilnehmende +crs#:#crs_members_deleted#:#Das/die Mitglied(er) wurde(n) aus dem Training ausgetragen +crs#:#crs_members_map#:#Karte Trainingsmitglieder +crs#:#crs_members_print_title#:#Trainingsmitglieder +crs#:#crs_min_one_admin#:#Diesem Training muss mindestens ein Administrator zugeordnet bleiben. +crs#:#crs_new_subscription#:#Beitritt zum Training "%s" +crs#:#crs_new_subscription_body#:#%1$s ist dem Training %2$s beigetreten. +crs#:#crs_new_subscription_request#:#Aufnahmeantrag für Training "%s" +crs#:#crs_new_subscription_request_body#:#%1$s hat einen Aufnahmeantrag für das Training "%2$s" gestellt. +crs#:#crs_new_subscription_request_body2#:#Um den Benutzer zum Training zuzulassen oder den Antrag abzuweisen, müssen Sie die Mitgliederverwaltung des Trainings aufrufen. Wählen Sie dazu bitte folgenden Link: +crs#:#crs_news#:#Mail zum Training +crs#:#crs_no_objective_lms_found#:#Dieses Training enthält keine Lerninhalte, die dem Lernziel zugeordnet werden könnten. +crs#:#crs_no_subscribers_selected#:#Sie haben keine Benutzer*innen ausgewählt. +crs#:#crs_no_users_added#:#Es wurden keine Benutzer*innen hinzugefügt. +crs#:#crs_no_users_selected#:#Sie haben keine Benutzer*innen ausgewählt. +crs#:#crs_notification_explanation_admin#:#Sie erhalten diese Mail, da für Sie als Trainingsbetreuung die Benachrichtigungen aktiviert sind. +crs#:#crs_notification_salutation#:#Liebe Trainingsteilnehmerin, lieber Trainingsteilnehmer, +crs#:#crs_number_users_added#:#Die folgende Anzahl von Benutzern wurden dem Training hinzugefügt: +crs#:#crs_obj_initial_req_info#:#Trainingsteilnehmern, die diese Prozentzahl der Punkte erreicht haben, werden keine Trainingsmaterialien zur weiteren Bearbeitung empfohlen. +crs#:#crs_objective_random_warn#:#Für diesen Test ist eine zufällige Anordnung der Fragen festgelegt, deshalb kann er nicht für Lernziele verwendet werden. +crs#:#crs_objective_result_details#:#⬅︎ Details anzeigen +crs#:#crs_objective_status_configure#:#Checkliste Training +crs#:#crs_objective_status_materials_info#:#Das Training hat momentan keinen Inhalt. Fügen Sie Lerninhalte hinzu, die Lernzielen zugeordnet werden können. +crs#:#crs_objective_status_settings#:#Trainingsinstellungen vornehmen +crs#:#crs_objective_wiz_final_limit_info#:#Bitte tragen Sie nun die Punktzahl ein, die ein Trainingsteilnehmer benötigt, um das Lernziel zu bestehen. +crs#:#crs_objective_wiz_self_info#:#Legen Sie nun die Fragen des Einstiegstests fest. Der Einstiegstest dient der Überprüfung, ob und welche Vorkenntnisse bei das Trainingsteilnehmern vorhanden sind. +crs#:#crs_objectives_reset_sure#:#Sind Sie sicher, dass Sie alle Ergebnisse dieses Trainings zurücksetzen möchten?
Alle Fortschritte, Testergebnisse werden unwiderruflich gelöscht. +crs#:#crs_open#:#Training öffnen +crs#:#crs_other_resources#:#Weitere Trainingsmaterialien +crs#:#crs_period_info#:#Information zum Start und Ende der Veranstaltung, die mit dem Training unterstützt werden soll. +crs#:#crs_ref_delete_confirmation_info#:#Möchten Sie folgende Mitglieder aus diesem Training austragen? Wenn diese Mitglieder auch aus den im Training enthaltenden verlinkten Trainings ausgetragen werden sollen, dann aktivieren Sie die entsprechenden Checkboxen. +crs#:#crs_ref_member_update_info#:#Alle neuen Mitglieder des übergeordneten Trainings werden automatisch in das Training, auf den dieser Trainingslink verweist, eingetragen. +crs#:#crs_ref_missing_access#:#Die Option kann nicht ausgewählt werden, da Sie nicht die Berechtigung "Mitglieder verwalten" für beide Trainings besitzen. +crs#:#crs_ref_missing_parent_crs#:#Die Option kann nicht ausgewählt werden, da dieser Trainingslink kein übergeordnetes Training besitzt. +crs#:#crs_reg#:#Selbstständiger Beitritt durch Benutzer +crs#:#crs_reg_code_enabled_info#:#Unabhängig vom ausgewählten Beitrittsverfahren und das Trainingsrechten ermöglicht diese Option einen direkten Beitritt durch Aufruf eines Links. +crs#:#crs_reg_max_info#:#Ist die maximale Mitgliederanzahl erreicht, ist ein selbstständiger Beitritt nicht mehr möglich. +crs#:#crs_reg_no_selfreg#:#Kein selbstständiger Beitritt +crs#:#crs_reg_password_info#:#Benutzer müssen dieses Passwort eingeben, um dem Training beitreten zu können. +crs#:#crs_registration#:#Zum Training beitreten +crs#:#crs_registration_confirmation_info#:#Der Beitritt erfolgt nur, wenn er durch eine*n Trainingsadministrator*in oder Referent*in bestätigt wird. +crs#:#crs_registration_deactivated#:#Nur Trainingsadministrator*innen und Referent*innen können Benutzer in das Training aufnehmen. +crs#:#crs_registration_limited_info#:#Mitglieder können dem Training nur in einen bestimmten Zeitraum beitreten. +crs#:#crs_reject_subscriber#:#Ablehnung für Training "%s" +crs#:#crs_reject_subscriber_body#:#Ihr Aufnahmeantrag für das Training "%s" ist abgelehnt worden. +crs#:#crs_selected_users#:#Ausgewählte Teilnehmende +crs#:#crs_settings#:#Trainingsinstellungen +crs#:#crs_show_member_export#:#Teilnahmeliste +crs#:#crs_show_member_export_info#:#Mitglieder haben die Möglichkeit, eine Teilnahmeliste zu generieren. +crs#:#crs_show_member_export_settings#:#Teilnahmeliste +crs#:#crs_status_changed#:#Status in Training "%s" +crs#:#crs_status_changed_body#:#Ihr Status in Training "%s" wurde geändert. +crs#:#crs_status_determination_manual#:#Nur manuell durch Referent +crs#:#crs_status_determination_sync#:#Der Bestanden-Status des Trainings wird automatisch gesetzt, sobald ein Lerner alle Lernfortschritts-relevanten Aktivitäten abgeschlossen hat. Bereits bestehender Fortschritt wird berücksichtigt, manuell gesetzte Bestanden-Status bleiben unverändert. Möchten Sie den Bestanden-Status jetzt auf Basis des jeweiligen aktuellen Lernfortschritts setzen? +crs#:#crs_structure#:#Trainingsstruktur +crs#:#crs_subscribe_member#:#Ihre Anmeldung für Training "%s" +crs#:#crs_subscribe_member_body#:#wir haben Sie soeben entsprechend Ihrem Antrag in das Training "%s" aufgenommen. +crs#:#crs_subscribe_wl#:#Ihre Anmeldung für Training "%s" +crs#:#crs_subscribe_wl_body#:#Sie wurden auf die Warteliste des Trainings "%s" gesetzt und haben die Position %s auf der Warteliste. Sie werden per Mail benachrichtigt, sobald Ihr Aufnahmeantrag angenommen bzw. abgelehnt wurde. +crs#:#crs_subscription_min_members_info#:#Wird die geforderte Mindestanzahl an Mitgliedern nicht erreicht, kann das Training nicht stattfinden. Wird die Mindestanzahl bis zum Ende des Beitrittszeitraums bzw. dem spätesten Trainingsaustritt nicht erreicht, versendet cate eine Mail an jene Trainingsadministrator*innen oder Referent*innen, für die im Reiter 'Mitglieder' die Option 'Benachrichtigung' aktiviert ist. +crs#:#crs_subscription_options_password#:#Beitritt mit Trainingspasswort +crs#:#crs_subscription_successful#:#Sie sind in das Training aufgenommen worden. +crs#:#crs_syllabus#:#Trainingsprogramm +crs#:#crs_timings_activate_optional#:#Freiwilligen-Modus des Benutzers / der Benutzer*in im Qualifizierungsprogramm. +crs#:#crs_timings_days_after_subsription#:#Tag(e) nach Trainingsbeitritt +crs#:#crs_timings_optional_checked#:#Der Freiwilligen-Modus wurde für diese*n Benutzer*in aktiviert. +crs#:#crs_timings_optional_unchecked#:#Der Freiwilligen-Modus wurde für diese*n Benutzer*in deaktiviert. +crs#:#crs_timings_short_changeable_tt#:#Lernplanung änderbar durch Teilnehmende +crs#:#crs_timings_short_limit_start_end_tt_rel#:#Spätestes Ende in Tagen nach Trainingsbeitritt +crs#:#crs_timings_short_start_end_rel#:#Empfohlener Start (Tage nach Trainingsbeitritt) +crs#:#crs_timings_short_start_end_tt_rel#:#Empfohlener Start in Tagen nach Trainingsbeitritt +crs#:#crs_timings_update_error#:#Die empfohlene Lernzeit folgender Trainingsmaterialien widerspricht dem angegebenen spätestmöglichen Lernzeitpunkt. +crs#:#crs_tutor#:#Referent +crs#:#crs_tutors#:#Referenten +crs#:#crs_unblocked_member#:#Status in Training "%s" +crs#:#crs_unblocked_member_body#:#Ihre Mitgliedschaft für Training "%s" wurde freigeschaltet. +crs#:#crs_unsubscribe_member#:#Ihre Abmeldung vom Training "%s" +crs#:#crs_unsubscribe_member_body#:#wir bestätigen Ihre Abmeldung vom Training "%s". +crs#:#crs_unsubscribe_member_explanation#:#Sie erhalten diese Mail, da Sie die Trainingsmitgliedschaft des oben genannten Trainings beendet haben. +crs#:#crs_unsubscribe_sure#:#Sind Sie sicher, dass Sie die Mitgliedschaft in diesem Training beenden möchten? +crs#:#crs_unsubscribed_from_crs#:#Ihre Trainingsmitgliedschaft wurde beendet. +crs#:#crs_user_agreement_info#:#Für Trainingsadministratoren freigegebene Daten +crs#:#crs_user_already_assigned#:#Die Person ist bereits Teilnehmer dieses Trainings. +crs#:#crs_users_added#:#Benutzer wurde(n) in das Training aufgenommen +crs#:#crs_users_already_assigned#:#Ein Benutzer ist bereits Mitglied dieses Trainings. +crs#:#crs_users_removed_from_list#:#Die ausgewählten Benutzer*innen wurden aus der Warteliste ausgetragen. +crs#:#crs_usr_agreement#:#Nutzungsvereinbarung +crs#:#crs_view_info_timing_relative#:#Das Start- und Enddatum wird anhand von Zeitangaben relativ zum Trainingsbeitrittsdatum gesetzt. +crs#:#crs_visibility_until_info#:#Der Training wird seinen Mitgliedern nur für einen bestimmten Zeitraum angezeigt. +crs#:#crs_visibility_unvisible#:#Der Training ist nicht sichtbar. +crs#:#crs_wait_info#:#Ist die maximale Mitgliederanzahl erreicht, können sich weitere Benutzer*innen auf eine Warteliste setzen lassen. +crs#:#crs_waiting_list_autofill_info#:#Teilnehmer*innen rücken automatisch bei Stornierungen von der Warteliste nach. Dies sollte nicht in Verbindung mit dem Beitrittsverfahren "Beitritt nach Bestätigung" benutzt werden, da die Bestätigung so umgangen wird. +crs#:#crs_warn_no_max_set_on_waiting_list#:#Die maximale Teilnehmeranzahl ist erreicht. Sie können sich jedoch auf die Warteliste für dieses Training setzen lassen und würden benachrichtigt, wenn Sie in das Training nachrücken könnten. +crs#:#crs_warn_wl_set_on_waiting_list#:#Es sind bereits Teilnehmer auf der Warteliste eingetragen. Sie können sich jedoch auf die Warteliste für dieses Training setzen lassen. Sie werden per Mail benachrichtigt, sobald Ihr Aufnahmeantrag angenommen oder abgelehnt wurde. +crs#:#event#:#Termin +crs#:#event_add_new_event#:#Ein neuer Termin wurde angelegt. +crs#:#event_assign_materials_info#:#Hier können Sie dem Termin Materialien zuordnen. Diese werden dann direkt unterhalb des Termins angezeigt. +crs#:#event_btn_add#:#Termin anlegen +crs#:#event_btn_add_edit#:#Termin anlegen und Materialien zuordnen +crs#:#event_details_workflow#:#Details zum Termin +crs#:#event_edit_members#:#Teilnehmende +crs#:#event_materials#:#Materialien zum Termin +crs#:#event_overview#:#Teilnahme an Terminen +crs#:#event_registered#:#Sie haben sich für diesen Termin angemeldet. +crs#:#event_section_information#:#Informationen zum Termin +crs#:#event_table_create#:#Neuer Termin +crs#:#event_table_update#:#Termin bearbeiten +crs#:#event_tbl_admin#:#Trainingsadministrator +crs#:#event_tbl_admins#:#Trainingsadministratoren +crs#:#event_tbl_tutor#:#Referent +crs#:#event_tbl_tutors#:#Referenten +crs#:#event_tutor_selection#:#Auswahl Referent +crs#:#event_tutor_source#:#Referent +crs#:#event_tutor_source_from_course#:#Aus dem Training +crs#:#event_tutor_source_manually#:#Eingabe +crs#:#event_user_selection_include_requests#:#Binde alle Benutzer der Liste "Aufnahmeanträge" ein +crs#:#event_user_selection_include_role#:#Binde alle Benutzer der Rolle "%1$s" ein +crs#:#event_user_selection_include_waiting_list#:#Binde alle Benutzer der "Warteliste" ein +crs#:#events#:#Termine +crs#:#export_members#:#Export der Teilnehmendendaten +crs#:#mem_cron_min_members_intro#:#die folgendas Trainings und Gruppen erreichen aktuell nicht die Mindestanzahl an Mitgliedern: +crs#:#mem_cron_min_members_reason#:#Möchten Sie keine Benachrichtigungen mehr für diese Trainings und Gruppen erhalten, deaktivieren Sie in den jeweiligen Objekten die Checkbox „Benachrichtigung“ im Reiter „Mitglieder“. +crs#:#mem_cron_min_members_subject#:#Training/Gruppe: Prüfung der minimalen Teilnehmerzahl +crs#:#sess_attendance_list#:#Teilnahmeliste +crs#:#sess_join_info#:#Bitte klicken Sie auf "Anmelden", wenn Sie an diesem Termin teilnehmen möchten. +crs#:#sess_limit#:#Anzahl der angezeigten Termine begrenzen +crs#:#sess_limit_info#:#Teilnehmenden werden nicht alle Termine angezeigt, sondern nur eine definierte Anzahl. +crs#:#sess_num_next#:#Anzahl nachfolgender Termine (ab morgen) +crs#:#sess_num_prev#:#Anzahl vergangener Termine (bis einschließlich gestern) +crs#:#t_course#:#Ansicht: Training +crs#:#timings_reminder_notifications_info#:#Wenn aktiviert, werdas Trainingsteilnehmer über überschrittene Lernplanungsmaterialien informiert. +crsv#:#crsv_create#:#Trainingszertifikat erstellen +crsv#:#crsv_create_info#:#Wählen Sie ein Training, für den Sie ein Zertifikat benötigen +dash#:#dash_enable_memberships#:#Meine Trainings und Gruppen +dash#:#dash_memberships#:#Meine Trainings und Gruppen +dash#:#dash_studyprogramme#:#Meine Qualifizierungsprogramme +dash#:#dash_view_courses_groups#:#Block ‘Meine Trainings und Gruppen’ +dateplaner#:#back_to_crs#:#Trainingsinhalt +dateplaner#:#cal_adm_notification_info#:#Wählen Sie diese Einstellung, um eine optionale Mailbenachrichtigung für Trainings- und Gruppentermine zu ermöglichen. +dateplaner#:#cal_adm_notification_user_info#:#Wählen Sie diese Einstellung, um eine optionale Mailbenachrichtigung an einzelne, auswählbare Benutzer*innen versenden zu können. +dateplaner#:#cal_booking_cancellation_user#:#Dies ist eine Kopie der Mail an Benutzer*in: +dateplaner#:#cal_booking_confirmation_user#:#Dies ist eine Kopie der Mail an Benutzer*in: +dateplaner#:#cal_cal_shared_with#:#Benutzerkonten, mit denen der Kalender geteilt wird +dateplaner#:#cal_cg_notification#:#Trainings-/Gruppenbenachrichtigung +dateplaner#:#cal_cg_registration_info#:#Wenn aktiviert, können sich Benutzer für Trainings- und Gruppentermine anmelden. +dateplaner#:#cal_cg_registrations#:#Anmeldung für Training/Gruppentermine +dateplaner#:#cal_ch_assign_participants#:#Teilnehmende zuordnen +dateplaner#:#cal_ch_cancel_booking_info#:#Bei der Absage von Terminbuchungen werden die Teilnehmenden per E-Mail über die Absage der Termine informiert. Wenn Sie wünschen, dass die Teilnehmenden nicht informiert werden, sollten Sie die Option "Terminbuchung(en) löschen" auswählen. +dateplaner#:#cal_ch_cron_reminder_info#:#Wenn aktiviert, erhalten Benutzer*innen, die einen Sprechstundentermin gebucht haben, eine Erinnerungsmail über bevorstehende Termine. Bitte legen Sie fest, wie viele Tage im voraus die Erinnerungen verschickt werden sollen. +dateplaner#:#cal_ch_current_bookings#:#Aktuelle Teilnehmende +dateplaner#:#cal_ch_delete_app_booking_info#:#Bei folgenden Terminen bestehen bereits Buchungen. Wenn Sie diese Termine löschen, werden die Teilnehmende nicht über die Löschung informiert. +dateplaner#:#cal_ch_delete_booking_info#:#Bei der Löschung von Terminbuchungen werden die Teilnehmenden nicht per E-Mail über die Löschung der Termine informiert. Wenn Sie wünschen, dass die Teilnehmenden informiert werden, sollten Sie die Option "Terminbuchung(en) absagen" auswählen. +dateplaner#:#cal_ch_grp_multiple_info#:#Sie können hier die Maximalanzahl von Buchungen pro Teilnehmer*in für diese Termingruppe festlegen. +dateplaner#:#cal_ch_target_object_info#:#Die Sprechstunden werden in Trainings und Gruppen in einem kleinen Block rechts angezeigt. Um dies auf bestimmte Trainings oder Gruppen zu beschränken, geben Sie die Ref-ID des betreffenden Objektes ein. Sie finden diese in der URL des entsprechenden Objekts. Mehrere Ref-IDs geben Sie kommagetrennt ein. Unabhängig davon können Sprechstunden auch in Ihren E-Portfolios erscheinen. +dateplaner#:#cal_ch_user_assignment_failed_info#:#Die folgenden Benutzer*innen konnten keinem Termin zugeordnet werden, da die maximale Anzahl an Buchungen überschritten wurde. +dateplaner#:#cal_crs_new_notification_body#:#ein neuer Termin ist im Training "%s" angelegt worden. +dateplaner#:#cal_crs_new_notification_sub#:#Neuer Termin in Training "%s" +dateplaner#:#cal_crs_notification_body#:#es erfolgte eine Terminänderung im Training "%s". +dateplaner#:#cal_crs_notification_sub#:#Terminänderung in Training "%s" +dateplaner#:#cal_enable_group_milestones_desc#:#Diese Option aktiviert das Management von Meilensteinen im Kalender (Trainings und Gruppen). +dateplaner#:#cal_err_invalid_notification_rcps#:#Die Empfänger*innen für die Mail-Benachrichtigung sind nicht gültig. Bitte wählen geben Sie ausschließlich Benutzerkontennamen oder gültige Mail-Adressen an. +dateplaner#:#cal_export_timezone_tz#:#Benutze Zeitzone +dateplaner#:#cal_grp_curr_crs#:#Aktuelles Training +dateplaner#:#cal_notification_crsgrp#:#Benachrichtigung für Trainings-/Gruppenteilnehmer +dateplaner#:#cal_notification_info#:#Wenn aktiviert, werden alle Trainings-/Gruppenteilnehmenden über die Terminänderung per Mailbenachrichtigung informiert. +dateplaner#:#cal_notification_users#:#Benachrichtigung für ausgewählte Benutzerkonten +dateplaner#:#cal_reg_registered_users#:#Angemeldete Benutzerkonten +dateplaner#:#cal_sess_info#:#Information zum Termin +dateplaner#:#cal_setting_global_crs_act#:#Trainingskalender +dateplaner#:#cal_setting_global_crs_act_info#:#In neu erstellten Trainings ist der Kalender standardmäßig aktiviert. +dateplaner#:#cal_setting_global_crs_vis_info#:#Der Trainingskalender wird standardmäßig als Block im Reiter „Inhalt“ angezeigt. +dateplaner#:#cal_shared_selected_usr#:#Der Kalender wurde für die ausgewählten Benutzer*innen/Rollen freigegeben. +dateplaner#:#cal_timezone_info#:#Bitte wählen Sie die nächstgelegene Stadt in Ihrer Zeitzone für die Anzeige von Terminen innerhalb des Systems aus. +dateplaner#:#cal_type_crs#:#Trainingskalender +dateplaner#:#cal_type_info#:#Bitte wählen Sie die Kalenderart aus. "Öffentliche Kalender" sind für alle Benutzer*innen sichtbar. +dateplaner#:#cal_type_sess#:#Terminkalender +dateplaner#:#cal_unshared_selected_usr#:#Die Freigabe für die ausgewählten Benutzer*innen/Rollen wurde beendet. +dateplaner#:#cal_user_notification_info#:#Eine Mail mit den Termindetails wird an die hier eingetragenen Benutzer*innen oder E-Mail-Adressen versandt. +dateplaner#:#cal_user_timezone#:#Zeitzone +dateplaner#:#crs_cal_activation_end#:#Trainingsde +dateplaner#:#crs_cal_activation_start#:#Trainingsbeginn +dateplaner#:#crs_cal_end#:#Training endet +dateplaner#:#crs_cal_start#:#Training startet +dcl#:#dcl_add_perm_desc#:#Benutzer*innen können Einträge in dieser Tabelle erstellen. +dcl#:#dcl_export_enabled_desc#:#Alle Benutzer*innen können die Daten der Tabelle selbst exportieren. Dazu müssen in der Übersicht "Felder der ausgewählten Tabelle" die Felder einzeln als exportierbar ausgewählt werden. +dcl#:#dcl_ilias_reference_desc#:#Suchfeld, um ein Objekt im System auszuwählen und zu verlinken +dcl#:#dcl_import_enabled_desc#:#Alle Benutzer*innen können selbst Daten in die Tabellen importieren, solange sie entsprechende Schreibrechte besitzen. +dcl#:#dcl_length_info#:#Anzahl von Zeichen, die ein*e Benutzer*in eingeben kann (maximal 4000). Bei mehr als 200 Zeichen aktivieren Sie zusätzlich die Option "Mehrzeiliges Texteingabefeld". +dcl#:#dcl_limited_desc#:#Benutzer*innen können Einträge nur bis zum gewählten Datum hinzufügen, bearbeiten und löschen. +dcl#:#dcl_online_info#:#Nur wenn die Datensammlung online geschaltet ist, können Benutzer*innen die Datensammlung sehen und benutzen. +dcl#:#dcl_public_comments_desc#:#Benutzer*innen können Datensätze dieser Tabelle kommentieren. +dcl#:#dcl_rating_desc#:#Benutzer*innen können Einträge mit bis zu fünf Sternen bewerten. +dcl#:#dcl_save_confirmation_desc#:#Benutzer*in muss das Eintragen von neuen Datensätzen bestätigen +dcl#:#dcl_table_info#:#Nachfolgend legen Sie fest, was Benutzer*innen in dieser Tabelle tun dürfen, die für die Datensammlung das Recht "Eintragen" besitzen. +dcl#:#dcl_visible#:#Für alle Benutzer sichtbar +dcl#:#dcl_visible_desc#:#Benutzer*innen haben Zugriff auf diese Tabelle. +forum#:#frm_activation_online_info#:#Nur wenn das Forum online geschaltet ist, können Benutzer*innen darauf zugreifen. Wenn nicht, ist das Forum nur für Administrator*innen verfügbar. +didactic#:#didactic_icon_info#:#Das Icon wird für alle Objekte angezeigt, die diese Vorlagen anwenden. "Angepasste Icons" der Objekte überschreiben das Icon der Vorlage. Icons können nur für Container-Objekte (wie zum Beispiel Trainings und Kategorien) konfiguriert werden. +ecs#:#ecs_account_duration_info#:#Die Aktivierungszeit neuer ECS-Benutzer ist auf die Session-Dauer begrenzt. Erst mit der Aufnahme in ein Training wird das Ende der Aktivierungszeit verlängert. +ecs#:#ecs_approval_rcp#:#Benachrichtigungen über Trainingsfreigaben +ecs#:#ecs_approval_rcp_info#:#Geben Sie hier einen oder mehrere Benutzernamen (durch Komma getrennt) ein, die über neue Trainingsfreigaben per E-Mail benachrichtigt werden sollen. +ecs#:#ecs_cat_mapping_duration_info#:#Wählen Sie diese Einstellung, um ECS-Trainings z.B. anhand ihres Starttermins bestimmten Kategorien zuzuordnen. +ecs#:#ecs_cmap_all_in_one#:#Trainings in einer Kategorie +ecs#:#ecs_cmap_all_in_one_cat#:#Training-Kategorie +ecs#:#ecs_cmap_all_in_one_info#:#Bitte geben Sie die Kategorie an, in welcher alle Trainings angelegt werden sollen. In allen weiteren Kategorien werden ggf. Trainingslinks angelegt. +ecs#:#ecs_cmap_def_cat_info#:#Bitte geben Sie die Kategorie an, in welcher Trainings angelegt werde sollen, die über bestehende Regeln nicht zugeordnet werden können. +ecs#:#ecs_cmap_enable#:#Trainingszuordnung +ecs#:#ecs_cmap_mapping_form_title#:#Trainingszuordnung für Kategorie: +ecs#:#ecs_crs_alloc#:#Trainingszuordnungen +ecs#:#ecs_crs_alloc_set#:#Trainingszuordnungen bearbeiten +ecs#:#ecs_crs_export#:#Trainingsfreigaben +ecs#:#ecs_crs_export_obj_settings#:#Einstellungen für Trainingsfreigaben +ecs#:#ecs_econ_rcp#:#Benachrichtigungen über externe Trainings +ecs#:#ecs_econ_rcp_info#:#Geben Sie hier einen oder mehrere Benutzernamen (durch Komma getrennt) ein, die über neue externe Trainings per E-Mail benachrichtigt werden sollen. +ecs#:#ecs_enable_participant#:#Trainingsimport und Export zulassen +ecs#:#ecs_export#:#Trainingsfreigaben +ecs#:#ecs_export_created_body_a#:#Ein neues Training wurde freigegeben: +ecs#:#ecs_export_obj_settings#:#Einstellungen für Trainingsfreigaben +ecs#:#ecs_import#:#Externe Trainings +ecs#:#ecs_mapping_crs#:#Zuordnung für Trainings +ecs#:#ecs_mapping_rcrs#:#Zuordnung für ECS-Trainings +ecs#:#ecs_new_approval_subject#:#Ein neues Training wurde freigegeben +ecs#:#ecs_new_category_mapping#:#Neue Regel für die Zuordnung von importierten ECS-Trainings zu Kategorien +ecs#:#ecs_new_econtent_subject#:#Neuer ECS-Training +ecs#:#ecs_no_owner#:#Bitte wählen Sie aus, unter welcher Community Sie dieses Training veröffentlichen möchten. +ecs#:#ecs_node_mapping_create_empty#:#Nur Kategorien anlegen, die Trainings enthalten +ecs#:#ecs_node_mapping_create_empty_info#:#Nur in Verbindung mit der Trainingszuordnung nutzbar (diese wird automatisch aktiviert). +ecs#:#ecs_rcrs_created_body_a#:#Ein neuer ECS-Training wurde angelegt: +ecs#:#ecs_read_remote_links#:#Trainingsinformationen aktualisieren +ecs#:#ecs_released#:#Freigegebene Trainings +ecs#:#ecs_remote_imported#:#Die Informationen über Trainingsänderungen wurden neu eingelesen. +evnt_evhk_OrguByMailDomain#:#evnt_evhk_OrguByMailDomain_organisational_unit#:#Zuweisung Organisationseinheit +evnt_evhk_OrguByMailDomain#:#evnt_evhk_OrguByMailDomain_orgus#:#Zuweisung Organisationseinheit +evnt_evhk_OrguByMailDomain#:#evnt_evhk_OrguByMailDomain_position#:#Zuweisung Position +exc#:#exc_adopt_group_teams_added#:#%s Benutzerkonten wurden hinzugefügt. +exc#:#exc_adopt_group_teams_blocked#:#%s Benutzerkonten waren bereits vorhanden. +exc#:#exc_adopt_group_teams_conflict#:#Benutzer*in "%1$s" ist bereits in Gruppe "%2$s" gewählt. +exc#:#exc_comment_for_learner_info#:#Es wird eine Benachrichtigung an den/die Teilnehmende*n versandt.

Die Rückmeldung wird in seiner/ihrer persönlichen Übungseinheiten-Übersicht angezeigt. +exc#:#exc_completion_by_submission_info#:#Gibt ein*e Teilnehmende*r ein Arbeitsergebnis ab, wird der Status "Bestanden" gesetzt. Der/die Referent*in kann den Status manuell überschreiben. Das Ändern dieser Einstellung hat keine Auswirkung auf bestehende Bewertungen. +exc#:#exc_completion_by_tutor#:#Nur manuell durch Referenten +exc#:#exc_create_team_times_up_warning#:#Sie können kein Team mehr erstellen. Bitte kontaktieren Sie die Referent*innen. +exc#:#exc_deleted_user#:#Gelöschtes Benutzerkonto +exc#:#exc_denied_has_submissions#:#Grund: Benutzer*innen haben bereits Abgaben getätigt. +exc#:#exc_fb_tutor_info#:#Wird eine Datei zur Bewertung der Übungseinheit hochgeladen, erhält die/der Teilnehmer*in eine Benachrichtigung, Die Datei kann dann in der Übersicht der Übungseinheiten heruntergeladen und eingesehen werden. +exc#:#exc_feedback_notification_reason#:#Sie erhalten diese Nachricht, da Sie Teilnehmer*in der oben genannten Übung sind. +exc#:#exc_global_feedback_file_cron_info#:#Teilnehmende werden per Mail über die Verfügbarkeit der Musterlösung informiert. +exc#:#exc_mail_context_grade_reminder_info#:#Die Referent*innen werden an die Bewertung der Einreichungen erinnert. +exc#:#exc_max_file_info#:#Nach Erreichen des Limits können Teilnehmende keine weiteren Dateien hochladen. Auch in Team-Übungseinheiten wird das Limit pro Teilnehmer*in gewertet und nicht für das gesamte Team. +exc#:#exc_members_already_assigned_team#:#Diese*r Benutzer*in ist bereits einem Team zugeordnet. +exc#:#exc_msg_failed_mandatory#:#Sie haben mindestens eine obligatorische Übungseinheit nicht bestanden. +exc#:#exc_msg_new_feedback_text_uploaded2#:#Ein*e Referent*in hat einen neuen Kommentar für Sie eingestellt. +exc#:#exc_msg_participants_removed#:#Der/die Teilnehmer*in wurde aus der Übung entfernt. +exc#:#exc_msg_sure_to_deassign_participant#:#Wollen Sie wirklich die folgenden Teilnehmenden aus allen Übungseinheiten der Übung entfernen? Alle Lösungsabgaben der Teilnehmenden würden aus allen Übungseinheiten gelöscht. +exc#:#exc_multi_feedb_info#:#Auf dieser Seite können Sie die Feedback-Dateien für mehrere Übungsteilnehmer*innen auf einmal hochladen. Klicken Sie zunächst unten auf die Schaltfläche "ZIP-Verzeichnisstruktur herunterladen" und speichern Sie die ZIP-Datei auf Ihrem Computer. Dort öffnen Sie im nächsten Schritt die ZIP-Datei, um die Verzeichnisstruktur zu entpacken. Legen Sie nun die Feedback-Dateien in die entsprechenden Ordner der Übungsteilnehmenden und komprimieren Sie abschließend das Verzeichnis wieder als ZIP-Datei. Wählen Sie nun auf dieser Seite unten diese ZIP-Datei als Multi-Feedback-Datei aus und laden diese hoch. Die Bestätigungsseite führt alle hochgeladenen Dateien auf. Wichtig: Vermeiden Sie auf jeden Fall Umlaute und Sonderzeichen in den Dateinamen, da hierdurch Probleme bei der Zuordnung der Dateien entstehen. +exc#:#exc_multi_feedback#:#Rückmeldung an mehrere Teilnehmende +exc#:#exc_no_participants#:#Zur Zeit gibt es keine Teilnehmenden. +exc#:#exc_no_team_yet_info_tutor#:#Teams werden von den Referent*innen verwaltet. +exc#:#exc_note_for_tutor#:#Notiz für Referenten +exc#:#exc_participants#:#Teilnehmende +exc#:#exc_pass_all_info#:#Teilnehmende müssen alle verpflichtenden Übungseinheiten bestehen, um die gesamte Übung zu bestehen. +exc#:#exc_pass_minimum_nr_info#:#Teilnehmende müssen eine Mindestanzahl an Übungseinheiten bestehen, um die gesamte Übung zu bestehen. +exc#:#exc_peer_review_ass_setting_info#:#Nachdem der Abgabetermin und ggfs. die Nachfrist verstrichen sind, können Teilnehmende ihre Arbeitsergebnisse gegenseitig bewerten. Genaue Einstellungen zum Peer-Feedback werden im gleichnamigen Reiter vorgenommen. Der Reiter wird eingeblendet, wenn diese Option aktiviert und gespeichert wurde. +exc#:#exc_peer_review_invalid_giver_ids#:#Feedback-Geber, die nicht mehr Teilnehmende der Übung sind oder keine Abgabe haben +exc#:#exc_peer_review_invalid_peer_ids#:#Feedback-Nehmer, die nicht mehr Teilnehmende der Übung sind oder keine Abgabe haben +exc#:#exc_peer_review_min_number_info#:#Anzahl an Feedbacks, die Teilnehmende den Peers geben müssen. Sollte die Anzahl der geforderten Feedbacks die Anzahl der tatsächlichen Einreichungen übersteigen, wird die geforderte Anzahl automatisch auf die Anzahl der tatsächlichen Einreichungen reduziert. +exc#:#exc_peer_review_missing_users#:#Teilnehmende mit einer Abgabe, die nicht Teil des Peer-Feedbacks sind +exc#:#exc_peer_review_not_returned_users#:#Teilnehmende ohne Abgabe, die nicht Teil des Peer-Feedbacks sind +exc#:#exc_peer_review_overview_invalid_users#:#Ungültige Teilnehmende +exc#:#exc_random_selection_info#:#Jedem/jeder Benutzer*in wird eine zufällige Auswahl an verpflichtenden Übungseinheiten zugeordnet. +exc#:#exc_relative_date_info#:#Das Abgabedatum ergibt sich aus dem Bearbeitungszeitraum und dem Startzeitpunkt, den der/die Teilnehmende gewählt hat. +exc#:#exc_reminder_feedback_setting#:#Teilnehmende an Peer-Feedbacks erinnern +exc#:#exc_reminder_grade_subject#:#Übungseinheit "%s" wurde nicht bewertet +exc#:#exc_reminder_start_info#:#Alle Mitglieder der übergeordneten Gruppe oder des übergeordneten Trainings werden benachrichtigt.
Ohne Training oder Gruppe wird niemand benachrichtigt. +exc#:#exc_reminder_submit_setting#:#Teilnehmende an Abgaben erinnern +exc#:#exc_select_part#:#Teilnehmende auswählen +exc#:#exc_settings_feedback_file_info#:#Referent*innen laden ihre Datei hoch. Die Teilnehmenden erhalten eine Benachrichtigung und die jeweilige Datei wird ihnen in der Übungseinheiten-Übersicht angezeigt. +exc#:#exc_settings_feedback_mail_info#:#Referent*innen geben ihre Rückmeldungen zur Abgabe in ein Textfeld ein. Der Text wird per E-Mail dem/der Teilnehmenden zugesandt. +exc#:#exc_settings_feedback_text_info#:#Referent*innen geben ihre Rückmeldungen in ein Textfeld ein. Die Teilnehmenden erhalten eine Benachrichtigung und der jeweilige Text wird ihnen in der Übungseinheiten-Übersicht angezeigt. +exc#:#exc_show_submissions_info#:#Alle Lösungsabgaben einer Übungseinheit können nach dem Abgabetermin von allen Teilnehmenden eingesehen werden. +exc#:#exc_submission_notification_info#:#Sie werden per Mail benachrichtigt, sobald neue Lösungen abgegeben wurden. Dies ist eine persönliche Einstellung, die nur für Sie gilt. Andere Referent*innen der Übung sind davon nicht betroffen. +exc#:#exc_team_by_participants#:#Durch Teilnehmende +exc#:#exc_team_by_participants_info#:#Die Teilnehmenden organisieren die Teams selbst. +exc#:#exc_team_by_random_add_info#:#Bitte beachten Sie, dass Sie der Übung zunächst alle Teilnehmenden zuordnen müssen, bevor Sie diese Option sinnvoll nutzen können. +exc#:#exc_team_by_random_info#:#Teilnehmende werden automatisch und zufällig zu Teams zugeordnet. +exc#:#exc_team_by_tutors#:#Durch Referenten +exc#:#exc_team_by_tutors_info#:#Referent*innen organisieren die Teams. +exc#:#exc_team_by_tutors_manual_info#:#Referent*innen ordnen die Teilnehmenden manuell den Teams zu. +exc#:#exc_team_management_tutor#:#Team-Management durch Referenten +exc#:#exc_team_management_tutor_info#:#Bei Aktivierung dieser Option können Teilnehmende ihre Teams nicht selbst organisieren. +exc#:#exc_team_max_small_than_members#:#Die maximale Anzahl an Teilnehmenden kann nicht auf %s gesetzt werden, da einige Teams %s Teilnehmende erhalten müssen. +exc#:#exc_team_member_container_add#:#Team-Mitglied aus Training/Gruppe hinzufügen +exc#:#exc_team_min_big_than_max#:#Die maximale Anzahl an Teilnehmenden kann nicht kleiner als die minimale Anzahl sein. +exc#:#exc_team_min_small_than_members#:#Die minimale Anzahl an Teilnehmenden kann nicht auf %s gesetzt werden, da einige Teams %s Teilnehmende erhalten müssen. +exc#:#exc_team_minimal_too_big#:#Die minimale Anzahl an Teilnehmenden %s ist zu groß, bitte verringern Sie den Wert. +exc#:#exc_team_notification_reason#:#Sie erhalten diese Nachricht, da Sie ein*e Teilnehmer*in der oben genannten Übung sind. +exc#:#exc_total_members#:#Gesamtanzahl an Teilnehmenden +exc#:#exc_wiki_container_info#:#Ort in dem neue Wikis der Teilnehmende angelegt werden. +exc#:#exc_with_wiki_template_info#:#Neue Wikis der Teilnehmende werden durch Kopie der Vorlage erstellt. +exc#:#exc_without_template_info#:#Teilnehmende erstellen ihre Portfolios selbständig ohne Vorlage. +exc#:#exc_without_wiki_template_info#:#Teilnehmende starten mit leerem Wiki. +exc#:#feedback_given#:#Gegebenes Feedback +exc#:#fiter_no_results#:#Der aktuelle Filter stimmte mit keiner Einreichung überein. +exc#:#text_assignment#:#Text-Übungseinheit +exercise#:#exc_feedback_from_tutor#:#Bewertung durch Referent +file#:#general_upload_error_occured#:#Beim Verarbeiten der Datei ist ein unerwarteter Fehler aufgetreten. +file#:#not_yet_migrated#:#Dieses Datei-Objekt wurde noch nicht migriert, und es können keine neue Versionen angelegt werden. Wenden Sie sich an die Systemadministrator*innen von cate. +file#:#upload_info_desc#:#Sie können die Dateien und die Dateiversionen im Reiter "Versionen" verwalten. +fils#:#token_authenticated_download_service#:#Download per Token +fils#:#token_authenticated_upload_service#:#Upload per Token +fils#:#token_created#:#Der Token wurde erfolgreich angelegt. Bitte notieren Sie sich diesen, um ihn verwenden zu können.
Bitte beachten Sie, dass der Token später nicht mehr für Sie einzusehen ist. %s +form#:#form_link_internal#:#Innerhalb des Systems +form#:#form_password_not_allowed_for_auth#:#Für die gewählte Authentifizierungsmethode können Sie das Passwort nicht ändern. +form#:#form_password_required_for_auth#:#Für die gewählte Authentifizierungsmethode ist ein Passwort notwendig. +forum#:#adm_save_drafts_desc#:#Wenn aktiviert, können angemeldete Benutzer*innen Beiträge in Foren als Entwurf speichern. +forum#:#empty_subject#:#Beim Antworten auf einen Beitrag bleibt die Titelzeile leer und muss vom Benutzer*innen gefüllt werden. +forum#:#enable_send_attachments_desc#:#Bitte beachten Sie, dass Datei-Anhänge für jede*n benachrichtigte*n Benutzer*in separat gespeichert werden müssen, sofern die Zustellung auch als interne Nachricht erfolgt. Dies kann eine sehr hohe Belegung des Festplattenspeichers auf dem Server hervorrufen. +forum#:#enable_thread_ratings_info#:#Falls aktiviert, können Themen dieses Forums von Benutzer*innen bewertet werden. +forum#:#forums_disable_notification#:#Benachrichtigung für dieses Thema beenden +forum#:#forums_enable_notification#:#Benachrichtigung für dieses Thema starten +forum#:#forums_notification_intro#:#Diese E-Mail wurde von der Installation %s, %s automatisch an Sie versandt. +forum#:#forums_post_activation_mail#:#Solange der folgende Beitrag nicht aktiviert ist, ist er für andere Forenteilnehmende nicht sichtbar. Sie erhalten diese Mail, da Sie als Moderator eingetragen sind und die Berechtigung besitzen, diesen Beitrag zu aktivieren. +forum#:#frm_anonymous_posting_desc#:#Ist diese Option eingeschaltet, können registrierte Benutzer*innen nur mit einem Pseudonym oder ohne Nennung ihres Namens Beiträge in diesem Forum schreiben. Sollte die Option "Moderatoren-Beiträge markieren" ebenfalls aktiviert sein, können Moderator*innen kein Pseudonym verwenden. +forum#:#frm_moderator_role_added_successfully#:#Der/die Benutzer*in wurde als Moderator*in hinzugefügt. +forum#:#frm_moderators_detached_role_successfully#:#Für die ausgewählten Benutzer*innen wurde die Rolle "Forenmoderator" erfolgreich entfernt. +forum#:#frm_moderators_select_one#:#Bitte wählen Sie eine*n Benutzer*in, dem/der Sie die Rolle "Forenmoderator" zuweisen möchten. +forum#:#frm_move_invalid_file_type#:#Das ausgewählte Thema "%s" hat einen nicht unterstützten Dateityp im Dateianhang. Entfernen Sie diese Datei oder kontaktieren Sie die Systemadministrator*innen, um den Dateityp zur Positivliste hinzuzufügen. +forum#:#frm_noti_obj_crs#:#Training +forum#:#frm_statistics_enabled_desc#:#Statistik für alle Benutzer anzeigen +forum#:#mark_moderator_posts_desc#:#Wenn aktiviert, werden Beiträge der Benutzer*innen farblich hervorgehoben, die die Rolle "Forenmoderator" in diesem Forum innehaben. +forum#:#sticky#:#Top-Thema +grp#:#events#:#Termine +grp#:#grp_admins#:#Gruppenadministratoren +grp#:#grp_admission_link_failure_registration_period#:#Ein Beitritt ist nicht möglich. Der Beitrittszeitraum ist vergangen oder hat noch nicht begonnen. +grp#:#grp_admission_link_success_registration#:#Erfolgreich zur Gruppe "%s" beigetreten. +grp#:#grp_at_least_one_admin#:#Dieser Gruppe muss mindestens ein*e Gruppenadministrator*in zugeordnet sein. +grp#:#grp_auto_notification_info#:#Mail-Benachrichtigungen werden automatisch an jene Mitglieder versendet, die von den Gruppenadministrator*innen in die Gruppe aufgenommen wurden. +grp#:#grp_cancellation_end_info#:#Mitglieder können nur bis zum gesetzten Datum selbstständig die Gruppenmitgliedschaft beenden. +grp#:#grp_create_or_use_existing#:#Wollen Sie den/die Benutzer*in zu einer bestehenden Gruppe hinzufügen oder eine neue Gruppe anlegen? +grp#:#grp_created_and_user_been_added#:#Die Gruppe wurde erstellt und der/die Benutzer*in hinzugefügt. +grp#:#grp_edit_members#:#Teilnahmeverwaltung +grp#:#grp_info_agree#:#Ich bin damit einverstanden, dass die oben angegebenen Daten von Gruppenadministrator*innen eingesehen werden können. +grp#:#grp_info_agreement#:#Die folgenden Daten können von Gruppenadministrator*innen eingesehen werden: +grp#:#grp_mail_admission_new_bod#:#Sie sind in Gruppe "%s" als Mitglied aufgenommen worden. +grp#:#grp_mail_all_info#:#Mitglieder und Gruppenadministrator*innen können die Funktion "Mail an Mitglieder" im Reiter "Mitglieder" nutzen. +grp#:#grp_mail_dismiss_bod#:#Ihre Mitgliedschaft in Gruppe "%s" wurde beendet. +grp#:#grp_mail_notification_reg_req_bod2#:#Um den/die Benutzer*in zur Gruppe zuzulassen oder den Antrag abzuweisen, müssen Sie die Mitgliederverwaltung aufrufen. Wählen Sie dazu bitte folgenden Link: +grp#:#grp_mail_notification_unsub_bod#:#der/die Teilnehmer*in "%s" hat die Mitgliedschaft in der Gruppe "%s" beendet. +grp#:#grp_mail_tutors_only#:#Nur für Gruppenadministratoren +grp#:#grp_mail_tutors_only_info#:#Nur Gruppenadministrator*innen können die Funktion "Mail an Mitglieder" im Reiter "Mitglieder" nutzen. +grp#:#grp_member_administration#:#Teilnahmeverwaltung +grp#:#grp_notification_explanation_admin#:#Sie erhalten diese Mail, da für Sie als Gruppenbetreuer*in die Benachrichtigungen aktiviert sind. +grp#:#grp_notification_salutation#:#Sehr geehrte Gruppenteilnehmende, +grp#:#grp_reg_disabled_info#:#Nur Gruppenadministrator*innen können Benutzer*innen in die Gruppe aufnehmen. +grp#:#grp_reg_max_members_info#:#Ist die maximale Mitgliederzahl erreicht, ist ein selbstständiger Beitritt nicht mehr möglich. +grp#:#grp_reg_no_selfreg#:#Kein selbstständiger Beitritt +grp#:#grp_reg_passwd_info_screen#:#Wenn Sie das Gruppenpasswort von den Gruppenadministrator*innen erhalten haben, können Sie in dieser Gruppe beitreten. +grp#:#grp_reg_password_info#:#Benutzer*innen müssen dieses Passwort eingeben, um der Gruppe beitreten zu können. +grp#:#grp_reg_req_info_screen#:#Sie können die Aufnahme in diese Gruppe beantragen. Sobald die Gruppenadministrator*innen Ihren Antrag angenommen oder abgelehnt hat, werden Sie per Mail benachrichtigt. +grp#:#grp_reg_request_info#:#Der Beitritt erfolgt nur, wenn er durch die Gruppenadministrator*innen bestätigt wird. +grp#:#grp_selected_users#:#Ausgewählte Teilnehmende +grp#:#grp_setting_header_registration#:#Selbstständiger Beitritt durch Benutzer +grp#:#grp_subscription_min_members_info#:#Wird die geforderte Mindestanzahl an Mitgliedern nicht erreicht, kann die Gruppe nicht stattfinden. Wird die Mindestanzahl bis zum Ende des Beitrittszeitraums bzw. dem spätesten Gruppenaustritt nicht erreicht, versendet das System eine Mail an jene Gruppenadministrator*innen, für die im Reiter "Mitglieder" die Option "Benachrichtigung" aktiviert ist. +grp#:#grp_sure_add_user_to_group#:#Wollen Sie den/die Benutzer*in wirklich der Gruppe hinzufügen? +grp#:#grp_sure_create_group_add_user#:#Wollen Sie die Gruppen wirklich erstellen und den/die Benutzer*in hinzufügen? +grp#:#grp_user_already_in_group#:#Die ausgewählte Benutzer*innen sind bereits Mitglied der Gruppe. +grp#:#grp_user_been_added#:#Der/die Benutzer*in wurde der Gruppe hinzugefügt. +grp#:#grp_users_already_assigned#:#Ein*e Benutzer*in ist bereits Mitglied dieser Gruppe. +grp#:#grp_usr_agreement#:#Nutzungsvereinbarung +grp#:#grp_view_inherit#:#Durch Training bestimmt +grp#:#grp_view_inherit_info#:#Wird die Ansicht des übergeordneten Trainings geändert, ändert sich auch die Gruppenansicht. +grp#:#grp_waiting_list_autofill_info#:#Teilnehmende rücken automatisch bei Stornierungen von der Warteliste auf. Dies sollte nicht in Verbindung mit dem Beitrittsverfahren "Beitritt nach Bestätigung" benutzt werden, da die Bestätigung so umgangen wird. +grp#:#grp_waiting_list_info#:#Ist die maximale Mitgliederanzahl erreicht, können sich weitere Benutzer*innen auf eine Warteliste setzen lassen. +grp#:#grp_warn_no_max_set_on_waiting_list#:#Die maximale Teilnehmerzahl ist erreicht. Sie können sich jedoch auf die Warteliste für diese Gruppe setzen lassen und werden dann per Mail benachrichtigt, wenn Sie nachrücken können. +grp#:#grp_warn_wl_set_on_waiting_list#:#Es sind bereits Benutzer*innen in der Warteliste eingetragen. Sie können sich jedoch auf die Warteliste für diese Gruppe setzen und werden dann per Mail benachrichtigt, wenn Sie nachrücken können. +iass#:#iass_add_user_failure#:#Einer oder mehrere Benutzer*innen konnten nicht hinzugefügt werden. +iass#:#iass_add_user_success#:#Der/die Benutzer*in wurde als Teilnehmer*in hinzugefügt. +iass#:#iass_file_visible_examinee#:#Datei für Teilnehmende*n sichtbar +iass#:#iass_finalize_user_qst#:#Soll die Bewertung des/der Teilnehmenden wirklich final abgeschlossen werden? Änderungen an der Bewertung sind im Nachhinein nicht mehr möglich. +iass#:#iass_internal_note_info#:#Diese Notiz ist nur für Referent*innen sichtbar, die Prüfungsdaten von Teilnehmenden einsehen können. Die Teilnehmende selbst sehen die Prüfungsnotiz nicht. +iass#:#iass_notify#:#Teilnehmende*n nach abschließender Bewertung benachrichtigen +iass#:#iass_notify_explanation#:#Der/die Teilnehmende wird nach Abschluss der Bewertung per E-Mail benachrichtigt und kann die Prüfungsnotiz auf der Info-Seite einsehen. +iass#:#iass_record_info#:#Die Prüfungsnotiz kann nach finaler Bewertung durch den/die Teilnehmende*n eingesehen werden. Ist die Benachrichtigung aktiviert, erhält der/die Teilnehmende die Prüfungsnotiz auch per E-Mail. +iass#:#iass_record_template_explanation#:#Die Vorlage für die Prüfungsnotiz wird für jede*n neue*n Teilnehmer*in verwendet. +iass#:#iass_remove_user_qst#:#Soll der/die Teilnehmende wirklich entfernt werden? +iass#:#iass_user_removed#:#Der/die Benutzer*in wurde erfolgreich entfernt. +itgr#:#itgr_behaviour_info#:#Das System merkt sich den Zustand (geöffnet/geschlossen) je Benutzer*in bis zur Abmeldung (Logout). +jscalendar#:#about_calendar_long#:#DHTML Date/Time Selector (c) dynarch.com 2002-2003 For latest version visit: http://dynarch.com/mishoo/calendar.epl Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details. Auswahl des Datums: - Verwenden Sie die Schaltflächen << und >>, um das Jahr auszuwählen - Verwenden Sie die Schaltflächen < und >, um den Monat auszuwählen - Lassen Sie die Maustaste über jeder der oberen Schaltflächen gedrückt, um eine Schnellauswahl zu erhalten. +lm#:#lm_copy#:#cate-Lernmodul kopieren +log#:#log_browser_users#:#Aktivierte Benutzerkonten für Browser-Log +logging#:#log_error_file_cleanup_info#:#Löscht alte oder verwaiste Dateien des Error-Log. +logging#:#log_error_file_cleanup_title#:#Löschen alter oder verwaister Error-Log-Dateien +logging#:#log_error_mail#:#Mail-Empfänger +logging#:#log_error_path_not_configured_or_wrong#:#Der Pfad zu den Error-Logs (error_path) ist nicht gesetzt oder nicht erreichbar. +lso#:#lso_activation_online_info#:#Nur wenn die Lernsequenz online geschaltet ist, können Benutzer*innen beitreten und Mitglieder auf die Lernsequenz zugreifen. Wenn nicht, ist die Lernsequenz nur für Administrator*innen und Trainer*innen verfügbar. +lso#:#lso_at_least_one_admin#:#Dieser Lernsequenz muss mindestens ein Lernsequenzadministrator*in zugeordnet sein. +lso#:#lso_mail_notification_reg_req_bod2#:#Um den/die Benutzer*in zur Lernsequenz zuzulassen oder den Antrag abzuweisen, müssen Sie die Mitgliederverwaltung aufrufen. Wählen Sie dazu bitte folgenden Link: +lso#:#lso_mail_notification_unsub_bod#:#der/die Teilnehmende "%s" hat die Mitgliedschaft in der Lernsequenz "%s" beendet. +lso#:#lso_mem_tbl_header#:#Lernsequenz-Teilnehmer +lso#:#lso_member_administration#:#Teilnahmeverwaltung +lso#:#lso_min_one_admin#:#Dieser Lernsequenz muss mindestens ein Lernsequenzadministrator*in zugeordnet bleiben. +lso#:#lso_msg_member_assigned#:#Die Benutzer*innen wurden in die Lernsequenz aufgenommen. +lso#:#lso_notification_explanation_admin#:#Sie erhalten diese Mail, da für Sie als Lernsequenzbetreuer*in die Benachrichtigungen aktiviert sind. +lso#:#lso_read#:#Lesezugriff auf Lernsequenz +lso#:#lso_show_members_info#:#Mitgliedergalerie für Teilnehmende sichtbar +lso#:#lso_users_already_assigned#:#Ein*e Benutzer*in ist bereits Mitglied dieser Lernsequenz. +lso#:#table_may_proceed#:#Teilnehmer darf fortfahren +lti#:#lti_con_prov_always_learner_info#:#In der Regel wird die Rolle in ILIAS auf eine LTI-Rolle abgebildet. Trainingsadministratoren könnten im Provider mehr Rechte haben, z.B. um das Objekt zu manipulieren. Aktivieren Sie diese Option, um das Rollen-Mapping zu vermeiden. +mail#:#chat_users_have_been_invited#:#Die Benutzer*innen wurden eingeladen: +mail#:#chat_users_without_login#:#Die folgenden Benutzer*innen haben kein Benutzerkonto und können nicht eingeladen werden: +mail#:#chat_users_without_permission#:#Die folgenden Benutzer*innen haben keinen Zugriff zum ausgewählten Raum: +mail#:#mail_add_recipient#:#Bitte geben Sie eine*n Empfänger*in ein. +mail#:#mail_auto_generated_info#:#Diese E-Mail wurde von dem System %s, %s automatisch an Sie versandt. +mail#:#mail_crs_list_members_not_available#:#Die Mitglieder der markierten Trainings können nicht aufgelistet werden. +mail#:#mail_crs_list_members_not_available_for_at_least_one_crs#:#Die Mitglieder von mindestens einem gewählten Training können nicht aufgelistet werden. +mail#:#mail_crs_roles#:#Verschicke Mail an folgende Rollen des Trainings +mail#:#mail_email_sys_subject#:#Test-E-Mail "System-Mail" +mail#:#mail_email_usr_body#:#Dies ist eine Test-E-Mail, um den Versand einer von einem/einer Benutzer*in initiierten E-Mail an externe E-Mail-Adressen zu testen. +mail#:#mail_email_usr_subject#:#Test Benutzer-Mail +mail#:#mail_enable_crs_admin_notification#:#Trainingsadministratoren benachrichtigen +mail#:#mail_enable_crs_admin_notification_info#:#In neuen Trainings ist im Reiter "Mitglieder" für Trainingsadministrator*innen und Referent*innen die Einstellung "Benachrichtigung über neue Mitglieder" standardmäßig aktiviert. Sie erhalten E-Mails, wenn ein Mitglied beitritt, das Training verlässt oder die Mindestanzahl an Teilnehmern zur Durchführung des Trainings nicht erreicht wird. +mail#:#mail_enable_crs_member_notification_info#:#Mitglieder erhalten automatisch eine E-Mail, wenn sich ihr Mitgliedsstatus ändert. Diese Einstellung betrifft alle Trainings der Plattform. +mail#:#mail_enable_grp_admin_notification_info#:#In neuen Gruppen ist im Reiter "Mitglieder" für Gruppenadministrator*innen die Einstellung "Benachrichtigungen" standardmäßig aktiviert. Sie erhalten E-Mails, wenn ein Mitglied beitritt, die Gruppe verlässt oder die Mindestanzahl an Teilnehmenden zur Durchführung der Gruppe nicht erreicht wird. +mail#:#mail_enable_lso_admin_notification_info#:#In neuen Lernsequenzen ist im Reiter "Mitglieder" für Lernsequenzadministrator*innen die Einstellung "Benachrichtigungen" standardmäßig aktiviert. Sie erhalten E-Mails, wenn ein*e Benutzer*in beitritt oder die Lernsequenz verlässt. +mail#:#mail_external_send_test_usr#:#Test-Mail für Benutzernachricht schicken +mail#:#mail_filter_sender#:#Absender +mail#:#mail_following_rcp_not_valid#:#Die folgenden Empfänger*innen sind nicht gültig: +mail#:#mail_multiple_role_recipients_found#:#Die Angabe %1$s im „An”-Feld ist nicht eindeutig: Versenden Sie diese Mail bitte direkt aus dem Mitglieder-Reiter des gewünschten Trainings bzw. der gewünschten Gruppe. +mail#:#mail_my_courses#:#Meine Trainings +mail#:#mail_nacc_if_timelimit#:#Dieser Textblock wird nur eingefügt, wenn der/die Benutzer*in einen begrenzten Zugangszeitraum hat. +mail#:#mail_nacc_ilias_url#:#URL des Systems +mail#:#mail_nacc_no_pw_block#:#Dieser Textblock wird nur eingefügt, wenn der/die neue Benutzer*in ohne Passwort angelegt wurde. +mail#:#mail_nacc_pw_block#:#Dieser Textblock wird nur eingefügt, wenn der/die neue Benutzer*in mit Passwort angelegt wurde. +mail#:#mail_nacc_target#:#URL des Zielobjekts, z. B. ein Training, auf das von außerhalb von cate verlinkt wird. +mail#:#mail_nacc_target_title#:#Titel des Zielobjekts, z. B. der Trainingstitel +mail#:#mail_nacc_target_type#:#Typ des Zielobjekts, z. B. "Training" für ein Trainingsobjekt +mail#:#mail_nacc_timelimit#:#Zugangszeitraum des Benutzerkontos +mail#:#mail_nacc_use_placeholder#:#Im Feld "Inhalt" können folgende Platzhalter verwendet werden +mail#:#mail_notify_orphaned_info#:#Wenn Sie hier einen Wert größer oder gleich 1 eintragen, sendet das System eine Mail an den/die Benutzer*in bevor eine interne Mail gelöscht wird. Bitte stellen Sie sicher, dass ein externer Mail-Empfang möglich ist. +mail#:#mail_recipient_not_found#:#%1$s (Es konnte kein*e gültige*r Empfänger*in gefunden werden.) +mail#:#mail_salutation_female#:#Ausgabe für Platzhalter {{MAIL_SALUTATION}}, wenn Empfänger 'Frau' +mail#:#mail_salutation_general#:#Ausgabe für Platzhalter {{MAIL_SALUTATION}}, wenn keine Anrede angegeben oder gewünscht +mail#:#mail_salutation_male#:#Ausgabe für Platzhalter {{MAIL_SALUTATION}}, wenn Empfänger 'Herr' +mail#:#mail_sel_users#:#Verschicke Mail an ausgewählte Benutzerkonten +mail#:#mail_select_course#:#Bitte mindestens ein Training auswählen. +mail#:#mail_settings_incoming_type_see_also#:#Eine weitere Möglichkeit, die Empfangsart für die Benutzer*innen zu ändern, haben Sie hier. +mail#:#mail_settings_user_frm_head#:#Benutzer-Mails +mail#:#mail_smtp_host_info#:#Bitte tragen Sie hier den Host-Namen oder die IP des Mail-Servers ein. +mail#:#mail_smtp_password_req#:#Sofern Sie eine*n Benutzer*in angeben, ist das Passwort obligatorisch. +mail#:#mail_smtp_status_info#:#Falls aktiviert, delegiert das System den Versand externer E-Mails an den hier konfigurierten Mail-Server, statt die von der PHP-Runtime bereitgestellte Funktionalität für den Versand zu nutzen (mail()-Funktion, sendmail). +mail#:#mail_system_sys_env_from_addr_info#:#Sofern dieses Feld leer gelassen wird, wird bei SMTP-Versand die Absender-Adresse genutzt. Andernfalls ist es die Aufgabe der Server-Administrator*innen, den Header zu konfigurieren. +mail#:#mail_system_sys_from_addr#:#E-Mail-Adresse des Absenders (From) +mail#:#mail_system_sys_from_addr_info#:#Tragen Sie hier die Absender-Adresse ein. Der Wert aus dem "From"-Header wird dazu genutzt, den/die Absender*in einer Mail im Mail-Client der Empfänger*innen anzuzeigen.

Beispiele: info@institution.de oder no-reply@institution.de +mail#:#mail_system_sys_from_name#:#Name des Absenders (From) +mail#:#mail_system_usr_env_from_addr_info#:#Sofern dieses Feld leer gelassen wird, wird bei SMTP-Versand die Absender-Adresse genutzt. Andernfalls ist es die Aufgabe der Server-Administrator*innen, den Header zu konfigurieren. +mail#:#mail_system_usr_from_addr#:#E-Mail-Adresse des Absenders (From) +mail#:#mail_system_usr_from_addr_info#:#Tragen Sie hier die Absender-Adresse ein. Der Wert aus dem "From"-Header wird dazu genutzt, den/die Absender*in einer Mail im Mail-Client der Empfänger*innen anzuzeigen. Die Mail-Adresse jenes Benutzerkontos, das eine manuell erstellte Nachricht versendet, wird automatisch in den "Reply-To"-Header übernommen.

Beispiele: info@institution.de oder no-reply@institution.de +mail#:#mail_system_usr_from_name#:#Name des Absenders (From) +mail#:#mail_system_usr_from_name_info#:#Als Platzhalter können [FULLNAME], [FIRSTNAME] und [LASTNAME] genutzt werden. Diese werden dann durch die jeweiligen Daten von dem/der Absender*in der Mail ersetzt. +mail#:#mail_template_no_context_available#:#Aktuell wird von keinem Service oder Modul ein Kontext bereitgestellt. Das Anlegen oder Bearbeiten von Textvorlagen ist daher nicht möglich. +mail#:#mail_threshold_info#:#Interne Mails, die älter als der hier definierte Schwellenwert sind, werden unwiderruflich gelöscht (inklusive evtl vorhandener Anhänge).
Bitte bedenken Sie, dass bei erstmaliger Ausführung dieses Cron-Jobs je nach Schwellenwert sehr viele Nachrichten gelöscht werden und eine E-Mail als Warnung nicht mehr versendet werden kann. +mail#:#mail_use_global_reply_to_addr_info#:#Falls aktiviert, wird die unten eingetragene globale E-Mail-Adresse für den "Reply-To"-Header der Mail genutzt. Dadurch wird die Mail-Adresse von Absender*innen nicht offengelegt. Eine direkte Antwort auf eine Mail ist dann allerdings nicht mehr möglich. +mail#:#only_inbox_trash_info#:#Falls aktiviert, werden ausschließlich Mails gelöscht, die sich zum Zeitpunkt der Cron-Job-Ausführung im Posteingang und Papierkorb der jeweiligen Benutzer*innen befinden. Ansonsten werden alle Mails unabhängig vom Ordner gelöscht. +mail#:#placeholders_advise#:#Persönliche Platzhalter werden nur für Empfänger*innen im "An"-Feld ersetzt.%sBei Empfänger*innen im CC- und BCC-Feld bleiben persönliche Platzhalter erhalten. +mail#:#send_mail_tutors#:#Alle Referenten +mail#:#show_mail_settings_info#:#Falls aktiviert, können Benutzer*innen Ihre Mail-Einstellungen im Bereich "Einstellungen" oder "Mail" selbst vornehmen. +maps#:#maps_enable_maps_info#:#Aktiviert Karten in Benutzerprofil, Gruppen und Trainings +mcst#:#mcst_downloadable_info#:#Benutzer*innen können Beiträge direkt herunterladen. +mcst#:#mcst_duration_info#:#Wenn kein Wert eingegeben wird, bestimmt das System die Laufzeit automatisch +mcst#:#mcst_video_completion_threshold_info#:#Ab diesem Fortschritt wird ein Video als "angesehen" gespeichert. Bitte beachten Sie, dass cate nicht prüft, ob der gesamte Zeitraum auch wirklich angezeigt wurde oder der/die Benutzer*in Teile übersprungen hat. +mep#:#mobs_activate_pages_info#:#Ermöglicht es, Seiteninhalte als Bausteine in Medienpools anzulegen. Diese Inhaltsbausteine können in cate-Lernmodulen wiederverwendet, aber dort nicht bearbeitet werden. +mep#:#mobs_black_list_file_types_info#:#Diese Liste schränkt die Menge der erlaubten Dateitypen ein. Tragen Sie dazu die jeweiligen Dateiendungen komma-getrennt ein (z.B. jpg, gif). Dies ist sinnvoll, wenn die vorangegangene Option leer ist (alle Typen erlaubt). +mep#:#mobs_restrict_file_types_info#:#Bestimmen Sie alle Dateitypen, die in Medienobjekten hochgeladen werden dürfen. Tragen Sie dazu die jeweilige Dateiendungen komma-getrennt ein (z.B. jpg, gif). Wird kein Eintrag vorgenommen, sind alle Typen erlaubt. +meta#:#meta_intended_end_user_role#:#Beabsichtige Endbenutzer-Rolle +meta#:#meta_no_annotation#:#Keine Metadaten für den Bereich "Anmerkung" vorhanden. +meta#:#meta_no_classification#:#Keine Metadaten für den Bereich "Klassifizierung" vorhanden. +meta#:#meta_no_educational#:#Keine Metadaten für den Bereich "Pädagogik" vorhanden. +meta#:#meta_no_lifecycle#:#Keine Metadaten für den Bereich "Lebenszyklus" vorhanden. +meta#:#meta_no_meta_metadata#:#Keine Metadaten für den Bereich "Meta-Metadaten" vorhanden. +meta#:#meta_no_relation#:#Keine Metadaten für den Bereich "Beziehungen" vorhanden. +meta#:#meta_no_rights#:#Keine Metadaten für den Bereich "Rechte und Lizenzen" vorhanden. +meta#:#meta_no_technical#:#Keine Metadaten für den Bereich "Technische Angaben" vorhanden. +mmbr#:#info_refuse_sure#:#Sind Sie sicher, dass Sie den/die folgenden Benutzer*innen ablehnen möchten? +mmbr#:#mmbr_awrn_my_groups_courses#:#Meine Trainings und Gruppen +mmbr#:#mmbr_awrn_my_groups_courses_info#:#Alle Mitglieder von Gruppen und Trainings eines Benutzers werden aufgelistet. +mmbr#:#mmbr_info_delete_sure_unsubscribe#:#Wollen Sie wirklich die Mitgliedschaft für die folgendas Trainings und Gruppen beenden? +mmbr#:#mmbr_selected_users#:#Ausgewählte Teilnehmende +mme#:#field_ref_id#:#Referenz-ID +mme#:#field_ref_id_info#:#Die Referenz-ID des gewünschten Objektes aus dem Magazin, Sie finden die Referenz-ID in der URL eines Objektes (...?ref_id=123) +mst#:#mst_please_select_course#:#Bitte wählen Sie ein Training aus. +mst#:#mst_select_course#:#Training auswählen +news#:#news_enable_internal_news_info#:#Aktiviert Blöcke "Neuigkeiten" für Kategorien, Trainings, Gruppen und andere Objekte. Benutzer können diese Neuigkeiten abonnieren und erhalten diese auf ihrem Dashboard. +news#:#news_nr_of_items_info#:#Anzahl der Neuigkeiten, die für ein Objekt (z. B. eine Datei oder ein Lernmodul) in der Datenbank vorgehalten werden. Beachten Sie bitte, dass Containerobjekte wie Kategorien oder Trainings mehr Neuigkeiten enthalten können, da Sie auch die Neuigkeiten ihrer Unterobjekte anzeigen. +obj#:#cont_skll_published_some_not#:#Alle gegebenen Kompetenzzuweisungen wurden veröffentlicht. Zu einigen Benutzer*innen konnten keine Kompetenzen veröffentlicht werden, da keine Zuweisungen vorlagen. +obj#:#obj_import_file_error#:#Die Datei konnte nicht importiert werden. Bitte stellen Sie sicher, dass es sich um eine Exportdatei (XML-Export) des gleichen Objekttyps handelt und der Dateiname unverändert ist. Fehlermeldung: +obj#:#obj_tool_ext_mail_subject_prefix_info#:#Eingegebener Text wird bei externen E-Mails in die Betreffzeile aufgenommen. Dies erleichtert das Identifizieren und Filtern von E-Mails aus unterschiedlichen Trainings oder Gruppen. +obj#:#obj_user_not_disable_not#:#Mitglieder können die Benachrichtigung nicht deaktivieren +orgu#:#deassign_user_successful#:#Der/die Benutzer*in wurde erfolgreich ausgetragen. +orgu#:#ext_id_updated#:#Die externe ID wurde erfolgreich bearbeitet, da die Daten anonymisiert gespeichert werden. +orgu#:#msg_confirm_d_ua#:#Wollen Sie folgende Benutzer*innen der Position Mitarbeiter in ihrer jeweiligen Organisationseinheit zuweisen? +orgu#:#msg_confirm_remove_user#:#Möchten Sie den/die folgende*n Benutzer*in wirklich aus der Position %s entfernen? +orgu#:#org_op_edit_submissions_grades#:#Abgaben anderer Benutzer bearbeiten +orgu#:#org_op_manage_participants#:#Teilnehmende verwalten +orgu#:#org_op_read_learning_progress#:#Lernfortschritt anderer Benutzer einsehen +orgu#:#org_op_score_participants#:#Teilnehmende bewerten +orgu#:#org_op_view_certificates#:#Zertifikate anderer Benutzer einsehen +orgu#:#org_op_view_competences#:#Kompetenzen anderer Benutzer einsehen +orgu#:#org_op_write_learning_progress#:#Lernfortschritt anderer Benutzer setzen +orgu#:#orgu_global_set_type_default_info#:#Positionen sind im Reiter "Einstellungen" des Objektes standardmäßig aktiviert. +orgu#:#orgu_staff_deassign#:#Möchten Sie diese Benutzer*innen wirklich aus der Rolle entfernen? +orgu#:#ou_external_id_exists#:#Eine Organisationseinheit mit der Externen ID existiert bereits im System. +orgu#:#remove_successful#:#Der/die Benutzer*in wurde erfolgreich entfernt. +orgu#:#user_changed_successful#:#Der Benutzer*in wurde erfolgreich umgeschrieben. +orgu#:#users_successfuly_added#:#Der/die Benutzer*in wurde erfolgreich eingetragen. +pd#:#pd_my_memberships_intro#:#Willkommen zu Ihren Trainings- und Gruppenmitgliedschaften +pd#:#pd_my_memberships_intro2#:#Hier finden Sie alle Trainings und Gruppen, in denen Sie Mitglied sind. Zur Zeit verfügen Sie über keinerlei Mitgliedschaften. Um Trainings- oder Gruppenmitglied zu werden gibt es zwei Wege:
  1. Sie können Trainings oder Gruppen beitreten, bei denen der Beitritt von einen Administrator erlaubt wurde.
  2. Ein Administrator kann Ihnen eine Trainings- oder Gruppenmitgliedsrolle zuweisen.

In beiden Fällen erscheinen die entsprechendas Trainings oder Gruppen automatisch in dieser Übersicht. +pd#:#pd_view_select_at_least_one#:#Bitte wählen Sie mindestens eine Sicht, entweder 'Ausgewählte Angebote' und/oder 'Trainings und Gruppen'. +pdfgen#:#output_options#:#Ausgabeoptionen +pdfgen#:#problem_with_purposes#:#Es wurde ein Problem in der Konfiguration festgestellt. Nutzen Sie bitte die Schaltfläche "Bereinigen", um das Problem zu lösen. +pdfgen#:#user_stylesheet#:#Benutzer-Stylesheet +poll#:#poll_activation_online_info#:#Wählen Sie diese Einstellung, um die Abstimmung für Benutzer*in verfügbar zumachen. +poll#:#poll_max_number_of_answers#:#Maximale Anzahl der Antworten je Teilnehmer +poll#:#poll_non_anonymous_warning#:#Ihr Name und Votum ist in den Abstimmungsergebnissen für Administrator*innen sichtbar. +poll#:#poll_population#:#%s Teilnehmende +poll#:#poll_result_users#:#Teilnehmende +prg#:#aggregate_by_user#:#Nach Benutzern aggregiert +prg#:#content_automation_title#:#Trainings dieser Kategorien automatisch hinzufügen/entfernen +prg#:#could_not_add_users_no_permissons#:#%d Benutzer*innen können Sie wegen mangelnder Berechtigung nicht hinzufügen. +prg#:#crs_affiliation_to_prg#:#Zugehörigkeit zu Qualifizierungsprogrammen +prg#:#deadline#:#Stichtag +prg#:#error_updating_deadline#:#Ein Fehler ist während der Aktualisierung von "Stichtag" aufgetreten. +prg#:#error_updating_expire_date#:#Ein Fehler ist während der Aktualisierung von "Ablaufdatum der Qualifikation" aufgetreten. +prg#:#export_memberships#:#Zuweisungen exportieren +prg#:#foreign_assignment#:#Nicht oberste Programmebene +prg#:#form_msg_file_wrong_file_type#:#Falscher Dateityp +prg#:#header_update_current_plan#:#Wollen Sie den Bearbeitungsstatus der ausgewählten Zuweisungen wirklich neu berechnen lassen? Dabei können auch Zuweisungen, die bereits auf "Abgeschlossen" oder "Akkreditiert" stehen, wieder auf "In Bearbeitung" zurückfallen. +prg#:#info_to_re_assign_mail_body#:#%s %s,

die Gültigkeit ihrer Qualifikation im Qualifizierungsprogramm '%s' läuft bald ab. Bitte melden Sie sich erneut an. +prg#:#info_to_re_assign_mail_subject#:#Erinnerung zur erneuten Teilnahme am Qualifizierungsprogramm +prg#:#label_crs#:#Trainingsname +prg#:#mails_foreign_assignment_failed#:#Die ausgewählten Zuweisungen sind nicht im aktuellen Kontext; Mails sollten nur auf der obersten Ebene des Qualifizierungsprogramms verschickt werden. +prg#:#msg_acknowledge_courses#:#Bestandene Trainings wurden anerkannt. +prg#:#msg_change_deadline_date#:#Stichtag angepasst für %s Zuweisungen. +prg#:#msg_mark_accredited#:#%s Benutzer erfolgreich akkreditiert +prg#:#msg_mark_not_relevant#:#Qualifizierungsprogramm für %s Zuweisungen als nicht relevant markiert +prg#:#msg_mark_relevant#:#Qualifizierungsprogramm für %s Zuweisungen als relevant markiert +prg#:#msg_unmark_accredited#:#%s Benutzer als nicht akkreditiert markiert +prg#:#msg_update_from_settings#:#%s Benutzer aus den Einstellungen aktualisiert +prg#:#obj_prg_select#:#-- Bitte wählen Sie ein Qualifizierungsprogramm aus. -- +prg#:#placeholder_desc_prg_link#:#Link zum Qualifizierungsprogramm +prg#:#placeholder_desc_prg_points#:#Benötigte Punkte am Qualifizierungsprogramm +prg#:#placeholder_desc_usrprg_completiondate#:#Aktuelles Abschlussdatum des Benutzers / der Benutzerin am Qualifizierungsprogramm +prg#:#placeholder_desc_usrprg_deadline#:#Ende der Bearbeitungsfrist des Benutzers / der Benutzerin am Qualifizierungsprogramm +prg#:#placeholder_desc_usrprg_expires#:#Ablaufdatum der Qualifikation des Benutzers / der Benutzerin am Qualifizierungsprogramm +prg#:#placeholder_desc_usrprg_points#:#Erworbene Punkte des Benutzers / der Benutzerin am Qualifizierungsprogramm +prg#:#prg_acknowledge_all_completed_courses#:#Acknowledge All Completed Courses +prg#:#prg_acknowledge_completed_courses#:#Bereits bearbeitete Trainings anerkennen +prg#:#prg_add#:#Qualifizierungsprogramm hinzufügen +prg#:#prg_added_course_ref_successful#:#Neuer Trainingslink erfolgreich hinzugefügt +prg#:#prg_assessment#:#Qualifizierungsprogrammbewertung +prg#:#prg_auto_member_select_crs#:#Trainings +prg#:#prg_can_not_manage_in_repo#:#Sie dürfen dieses Qualifizierungsprogramm nicht verwalten, da bereits Zuweisungen erfolgt sind. +prg#:#prg_cancel_acknowledge_completed_courses#:#Keinerlei Trainings anerkennen +prg#:#prg_copy_threads_info#:#Bitte wählen Sie, welche Elemente des Qualifizierungsprogramms elements kopiert, verknüpft oder ausgelassen werden sollen. +prg#:#prg_create_new_leaf#:#Neuen Trainingslink hinzufügen +prg#:#prg_create_new_node#:#Neues Qualifizierungsprogramm hinzufügen +prg#:#prg_edit#:#Qualifizierungsprogramm bearbeiten +prg#:#prg_invalidate_expired_progresses_desc#:#Markiert abgelaufene Qualifikationen in Qualifizierungsprogrammen als 'ungültig'. +prg#:#prg_invalidate_expired_progresses_title#:#Zeitlich begrenzte Gültigkeit von Qualifikationen in Qualifizierungsprogrammen +prg#:#prg_mail_context_info#:#Für E-Mails aus den Reiter "Zuweisungen" und "Lernfortschritt" eines Qualifizierungsprogramms +prg#:#prg_mail_context_title#:#Qualifizierungsprogramm: Mail an zugewiesene Benutzer +prg#:#prg_mail_permanent_link#:#Wählen Sie den folgenden Link, um auf den Inhalt des Qualifizierungsprogramms zuzugreifen: +prg#:#prg_manage_members#:#Zuweisungen eines Qualifizierungsprogramms bearbeiten +prg#:#prg_mark_accredited_multi_success#:#Ausgewählte Zuweisungen akkreditiert +prg#:#prg_mark_accredited_success#:#Die Zuweisung wurde im Qualifizierungsprogramm erfolgreich akkreditiert. +prg#:#prg_mark_not_relevant_multi_success#:#Ausgewählte Zuweisungen als nicht relevant markiert +prg#:#prg_mark_relevant_multi_success#:#Ausgewählte Zuweisungen als relevant markiert +prg#:#prg_more_objects_without_read_permission#:#Das Qualifizierungsprogramm beinhaltet weitere Elemente, die Sie aufgrund von fehlenden Rechten nicht einsehen dürfen. +prg#:#prg_multi_update_from_current_plan#:#Aus aktuellen Programmeinstellungen neu berechnen +prg#:#prg_new#:#Neues Qualifizierungsprogramm +prg#:#prg_no_members_auto_not_active#:#Das Qualifizierungsprogramm ist nicht aktiv; Automatismen zur Benutzerzuweisung haben keinen Effekt. +prg#:#prg_no_members_not_active#:#Da das Qualifizierungsprogramm nicht aktiv ist, können keine neuen Zuweisungen erfolgen. +prg#:#prg_no_user_selected#:#Es wurde keine Zuweisung ausgewählt. +prg#:#prg_not_allowed_node_to_delete#:#Sie dürfen dieses Qualifizierungsprogramm nicht entfernen. +prg#:#prg_open_node#:#Zum Qualifizierungsprogramm wechseln +prg#:#prg_please_select_a_course_for_creating_a_leaf#:#Bitte wählen Sie einen Trainingslink. +prg#:#prg_points_byline#:#Wenn Benutzer dieses Qualifizierungsprogramm erfolgreich absolviert haben oder akkreditiert wurden, erhalten sie diese Anzahl an Punkten. Das Qualifizierungsprogramm gibt diese Punkte an übergeordnete Programmebenen weiter, sofern solche bestehen. Sofern untergeordnete Programmebenen bestehen, müssen Benutzer diese mindestens Anzahl an Punkten in diesen Programmebenen erreichen. +prg#:#prg_prg_type#:#Qualifizierungsprogrammtyp +prg#:#prg_profile_not_public#:#Das Profil des Benutzers /der Benutzer*in ist nicht öffentlich. +prg#:#prg_progress_info#:#Sie haben %1$d Punkte. Das Qualifizierungsprogramm ist mit %2$d Punkten abgeschlossen. +prg#:#prg_remove_users_not_possible#:#Ausgewählte Zuweisungen können nicht entfernt werden. +prg#:#prg_remove_users_partial_success#:#Ausgewählte Zuweisungen wurden teilweise entfernt. +prg#:#prg_remove_users_success#:#Die ausgewählten Zuweisungen wurden entfernt. +prg#:#prg_restart_assignments_temporal_progress_desc#:#Weist Benutzer erneut dem Qualifizierungsprogramm zu, wenn Gültigkeit der Qualifikation abläuft +prg#:#prg_restart_assignments_temporal_progress_title#:#Automatisch erneute Aufnahme in Qualifizierungsprogramme bei Ablauf von Qualifikationen +prg#:#prg_show_programmes_on_pd_always#:#Qualifizierungsprogramme sind auf dem Dashboard immer sichtbar. +prg#:#prg_show_programmes_on_pd_only_read#:#Qualifizierungsprogramme sind auf Dashboard nur sichtbar, wenn der Lesezugriff möglich ist. +prg#:#prg_some_users_may_not_be_accredited#:#Die ausgewählten Benutzer*innen wurden teilweise akkreditiert. +prg#:#prg_some_users_may_not_be_marked_not_relevant#:#Für bestimmte Zuweisungen konnte das Qualifizierungsprogramm nicht als "nicht relevant" markiert werden. +prg#:#prg_some_users_may_not_be_marked_relevant#:#Für bestimmte Zuweisungen konnte das Qualifizierungsprogramm nicht als "relevant" markiert werden. +prg#:#prg_some_users_may_not_be_unmarked_accredited#:#Akkreditierung ausgewählter Benutzer wurde teilweise entfernt +prg#:#prg_status_byline#:#Verwenden Sie den Programmstatus, um zu steuern, ob dieses Qualifizierungsprogramm für Benutzer*innen zugänglich ist. +prg#:#prg_type#:#Qualifizierungsprogrammtyp +prg#:#prg_type_add#:#Qualifizierungsprogrammtyp hinzufügen +prg#:#prg_type_available_amd_sets#:#Verfügbare benutzerdefinierte Metadatensätze +prg#:#prg_type_msg_unable_delete#:#Konnte Typ nicht löschen, da er bei folgenden Qualifizierungsprogrammen verwendet wird: %s +prg#:#prg_unmark_accredited_multi_success#:#Ausgewählte Zuweisungen als nicht akkreditiert markiert +prg#:#prg_update_from_current_plan_partitial_success#:#Das Überschreiben mit aktuellen Programmeinstellungen konnte für bestimmte Zuweisungen nicht ausgeführt werden. +prg#:#prg_update_progress_description#:#Setzt den Bearbeitungsstatus von "In Bearbeitung" auf "Nicht bestanden", wenn das Fälligkeitsdatum überschritten ist. +prg#:#prg_update_progress_title#:#Status "Nicht bestanden" nach Überschreiten des Fälligkeitsdatums +prg#:#prg_user_not_restarted_desc#:#Sendet Benutzern eine Warnmail, wenn die Gültigkeit einer Qualifikation an einem Qualifizierungsprogramm abläuft, und diese das Programm noch nicht neu gestartet haben. +prg#:#prg_user_not_restarted_time_input#:#Tage vor Ablauf der Gültigkeit +prg#:#prg_user_not_restarted_title#:#Warn-Mail über ablaufende Gültigkeit einer Qualifikation senden +prg#:#prg_user_risky_to_fail_desc#:#Sendet Benutzern eine Warnmail, wenn das Risiko besteht, ein Qualifizierungsprogramm nicht zu bestehen, weil das Ende des Bearbeitungszeitraums bald erreicht wird. +prg#:#re_assigned_mail_body#:#%s %s,

Sie wurden erneut dem Qualifizierungsprogramm '%s' zugewiesen. +prg#:#re_assigned_mail_subject#:#Erneute Zuweisung zum Qualifizierungsprogramm +prg#:#restart_recheck_desc#:#Bei Zuweisungen, die über einen Automatismus vorgenommen wurden, wird erneut geprüft, ob die Kriterien für die Zuweisung noch vorliegen. +prg#:#restart_recheck_label#:#Voraussetzungen erneut prüfen +prg#:#restarted#:#Wiederaufnahme +prg#:#risky_to_fail_mail_body#:#%s %s,

der Abschluss des Qualifizierungsprogramm '%s' ist bald fällig. +prg#:#risky_to_fail_mail_subject#:#Erinnerung, dass der Abschluss eines Qualifizierungsprogramms bald fällig ist. +prg#:#search_for_crs_members#:#Nach Trainings suchen +prg#:#select_crs#:#Nach Trainings suchen +prg#:#send_info_to_re_assign_mail#:#E-Mail vor Ablauf der Gültigkeit +prg#:#send_re_assigned_mail_info#:#Versand einer E-Mail bei automatisierter erneuter Zuweisung zum Qualifizierungsprogramm, nachdem Gültigkeit der Qualifikation abgelaufen ist +prg#:#send_risky_to_fail_mail_info#:#Versand einer E-Mail, wenn Bearbeitungszeitraum endet und Qualifizierungsprogramm nicht abgeschlossen wurde +prtf#:#prtf_allow_my_courses#:#Seitenelement "Meine Trainings" +prtf#:#prtf_allow_my_courses_info#:#Ermöglicht eine Liste der aktuellen Trainingsmitgliedschaften in ein Portfolio aufzunehmen. +prtf#:#prtf_no_offline_share_info#:#Das Portfolio muss zunächst online gesetzt werden, bevor es für bestimmte Benutzer*innen freigegeben werden kann. +prtf#:#prtf_page_element_my_courses_info#:#Dies ist eine Liste aller Trainings, in denen ich Mitglied bin und die aktuell online sind. +prtf#:#prtf_page_element_my_courses_title#:#Trainingsmitgliedschaften +prtf#:#prtf_page_element_teaser_my_courses#:#Innerhalb des Portfolios erscheint an dieser Stelle eine Liste Ihrer Trainings. +prtf#:#prtf_set_default_publish_confirmation#:#Das Portfolio muss mindestens für alle registrierten Benutzer*innen freigegeben werden. Soll es auch für das ganze Internet ohne Registrierung sichtbar sein? +prtf#:#prtf_set_default_publish_global#:#Auch für unregistrierte Benutzer freigeben +prtf#:#prtf_signature_info#:#Das PDF enthält ein Feld, in welchem die Benutzer*innen unterschreiben können. +prtt#:#prtt_activation_online_info#:#Wählen Sie diese Einstellung, um die Portfoliovorlage für Benutzer*innen verfügbar zu machen. +ps#:#crs_ps_cdf_info#:#Weitere trainingsspezifische Daten. Bitte füllen Sie die folgenden Felder aus. +ps#:#crs_ps_required_info#:#Für die Teilnahme an diesem Training werden weitere Informationen benötigt. +ps#:#ps_auto_https_description#:#Wenn aktiviert, versucht das System den HTTPS-Status eines Request per Header-Analyse zu bestimmen. +ps#:#ps_cdf_no_fields#:#Dieses Training enthält keine Datenfelder +ps#:#ps_cdf_warning_modify#:#Achtung: Mindestens ein*e Benutzer*in hat bereits einer Nutzungsvereinbarung zugestimmt. Das Ändern von Datenfeldern bewirkt, dass diese Nutzungsvereinbarungen zurückgesetzt werden. +ps#:#ps_crs_user_fields#:#Trainingsspezifische Benutzerdaten +ps#:#ps_export_confirm#:#Nutzungsvereinbarung für Trainingsmitglieder aktivieren +ps#:#ps_export_course#:#Export der Persönlichen Daten aus Trainings erlauben +ps#:#ps_export_groups#:#Export der Persönlichen Daten aus Gruppen erlauben +ps#:#ps_export_prgs#:#Persönliche Daten in Qualifizierungsprogrammen anzeigen und exportieren +ps#:#ps_export_sub#:#Noch nicht freigeschaltete Benutzerkonten +ps#:#ps_export_tutor#:#Referenten +ps#:#ps_login_max_attempts_info#:#Bestimmt, wie viele Anmeldeversuche von Benutzer*innen höchstens fehlschlagen dürfen. Schlagen mehr Anmeldeversuche fehl, wird diese*r Benutzer*in auf "inaktiv" gesetzt und muss im Benutzermanagement wieder aktiviert werden, bevor er/sie das System benutzen kann. Wird kein Wert eingetragen, ist die Funktion deaktiviert und das System zählt die fehlgeschlagenen Anmeldeversuche nicht. +ps#:#ps_participants_list_courses#:#Aktivierung von Teilnehmerlisten in der Mitgliedergalerie der Trainings erlauben +ps#:#ps_password_change_on_first_login_enabled_info#:#Zwingt Benutzer*innen, die sich nicht selbst registriert haben, bei der ersten Anmeldung ihr Passwort zu ändern. +ps#:#ps_prevent_simultaneous_logins_info#:#Wenn dies aktiviert ist, werden gleichzeitige Logins mit dem gleichem cate-Benutzerkonto über verschiedene Rechner verhindert. +ps#:#ps_show_crs_access#:#Anzeige der letzten Zugriffszeit von Trainingsteilnehmern +ps#:#ps_show_grp_access#:#Anzeige der letzten Zugriffszeit von Teilnehmenden in Gruppen +ps#:#ps_warning_modify#:#Achtung: Mindestens ein*e Benutzer*in hat bereits einer Nutzungsvereinbarung zugestimmt. Das Ändern der Einstellungen bewirkt, dass diese Nutzungsvereinbarungen zurückgesetzt werden. +pwassist#:#password_assistance#:#Login-Unterstützung +pwassist#:#pwassist_disabled_no_access#:#Die Login-Unterstützung ist nicht aktiviert. Bitte kontaktieren Sie die Systemadministrator*innen für weitere Unterstützung: %s +pwassist#:#pwassist_enter_email#:#Geben Sie eine E-Mail-Adresse ein, und klicken Sie auf Abschicken. cate sendet eine E-Mail an diese Adresse. Die E-Mail enthält alle Anmeldenamen, in deren Profil die E-Mail eingegeben wurde. Wählen Sie den passenden Anmeldenamen aus und lassen Sie sich mit der "Passwort vergessen"-Funktion ein neues Passwort schicken. Falls Sie mit dieser Funktion keine E-Mail erhalten, benachrichtigen Sie bitte Ihre Trainingsleitung oder senden Sie ein E-Mail an %1$s. +pwassist#:#pwassist_enter_username_and_email#:#Geben Sie einen Anmeldenamen und die dazugehörende E-Mail-Adresse ein, und klicken Sie auf Abschicken. cate sendet eine E-Mail an diese Adresse. Die E-Mail enthält eine Adresse zu einer Webseite, mit der Sie ein neues Passwort für das Benutzerkonto eingeben können. Falls Sie mit dieser Funktion Ihr Passwort nicht setzen können, benachrichtigen Sie bitte Ihre Trainingsleitung oder senden Sie ein E-Mail an %1$s. +pwassist#:#pwassist_enter_username_and_new_password#:#Geben Sie den Anmeldenamen, für den Sie die Login-Unterstützung angefordert haben, und Ihr neues Passwort ein. +pwassist#:#pwassist_login_not_match#:#Der eingegebene Anmeldename stimmt nicht überein mit dem Anmeldenamen, für den Sie die Login-Unterstützung angefordert hatten. Bitte geben Sie den korrekten Anmeldenamen ein. +pwassist#:#pwassist_mail_body#:#Guten Tag,\n\num Ihr Passwort neu zu setzen, gehen Sie wie folgt vor:\n\n1. Kopieren Sie folgende Adresse in Ihren Browser:\n%6$s\n\n2. Im nächsten Schritt setzen Sie Ihr Passwort neu.\n\nBeachten Sie:\nAus Sicherheitsgründen können Sie diesen Vorgang nur exakt einmal und innerhalb einer begrenzten Zeit ausführen. Danach wird die Adresse ungültig und Sie müssen die Login-Unterstützung erneut anfordern.\n\nSollten Sie die Zurücksetzung Ihres Passworts nicht beantragt haben, kontaktieren Sie bitte die Systemadministrator*innen.\n +pwassist#:#pwassist_mail_sent#:#Sofern Ihre Angaben korrekt waren, wurde eine E-Mail an die Adresse %1$s versandt. Weitere Anweisungen finden Sie in dieser E-Mail. +pwassist#:#pwassist_mail_sent_generic#:#Sofern Ihre Angaben korrekt waren, wurde eine E-Mail an die hinterlegte Adresse versandt. Weitere Anweisungen finden Sie in dieser E-Mail. +pwassist#:#pwassist_mail_subject#:#Login-Unterstützung +pwassist#:#pwassist_session_expired#:#Bitte fordern Sie die Login-Unterstützung erneut an. Die Gültigkeit der Adresse für die Durchführung der Login-Unterstützung ist abgelaufen. Dies kann passiert sein, weil Sie versucht haben, die Adresse, die Ihnen per E-Mail zugesandt wurde, mehr als einmal zu verwenden, oder weil zu viel Zeit verstrichen ist, seit Ihnen die Adresse zugesandt wurde. +pwassist#:#pwassist_username_mail_body#:#Guten Tag,\n\nSie haben soeben Ihren Anmeldenamen angefragt.\n\nDies sind die aktiven Anmeldenamen, die in cate dieser E-Mail-Adresse zugeordnet sind: %s\n\nWenn Sie die Zusendung Ihres Anmeldenamens nicht beantragt haben, kontaktieren Sie bitte den Anwenderservice.\n +pwassist#:#tms_forgot_password_header#:#Passwort vergessen? +pwassist#:#tms_forgot_username_header#:#Anmeldename vergessen? +pwassist#:#unassist_disabled_no_access#:#Die Anmeldenamen-Unterstützung ist nicht aktiviert. Bitte kontaktieren Sie eine*n Systemadministrator*in für weitere Unterstützung: %s +rating#:#rating_activate_rating_info#:#Wenn aktiviert, können Benutzer*innen dieses Objekt bewerten. +rbac#:#cals_edit_event#:#Öffentliche Kalender und Termine anlegen und verwalten +rbac#:#cat_administrate_users#:#Benutzerkonten lokal verwalten +rbac#:#cat_cat_administrate_users#:#Benutzerkonten können lokal angelegt und verwaltet werden +rbac#:#cat_read_users#:#Benutzerkonten können lokal in dieser Kategorie eingesehen werden +rbac#:#cmps_provider_provider#:#Konfiguration von Trainingsanbieter +rbac#:#cmps_provider_tags#:#Konfiguration von Tags +rbac#:#cmps_provider_trainer#:#Konfiguration von Trainern +rbac#:#cmps_venues_tags#:#Konfiguration von Tags +rbac#:#cmps_venues_tags_search#:#Konfiguration von Tags für die Trainingssuche +rbac#:#cmps_venues_venues#:#Konfiguration von Veranstaltungsorten +rbac#:#crs_copy#:#Training kopieren +rbac#:#crs_delete#:#Training löschen oder verschieben +rbac#:#crs_grade#:#Trainingsmitglieder bewerten +rbac#:#crs_join#:#Training beitreten +rbac#:#crs_leave#:#Trainingsmitgliedschaft beenden +rbac#:#crs_manage_members#:#Mitglieder eines Trainings verwalten +rbac#:#crs_read#:#Training lesen +rbac#:#crs_visible#:#Training ist sichtbar +rbac#:#crs_write#:#Training bearbeiten +rbac#:#crsr_copy#:#Trainingslinks kopieren +rbac#:#crsr_delete#:#Trainingslinks verschieben oder löschen +rbac#:#crsr_visible#:#Trainingslinks sind sichtbar und können genutzt werden +rbac#:#crsr_write#:#Einstellungen der Trainingslinks bearbeiten +rbac#:#crss_edit_permission#:#Rechteeinstellungen für die Trainingsadministration ändern +rbac#:#crss_read#:#Lesezugriff auf Trainingsadministration +rbac#:#crss_visible#:#Trainingsadministration ist sichtbar +rbac#:#crss_write#:#Einstellungen in Trainingsadministration bearbeiten +rbac#:#hlps_edit_permission#:#Rechteeinstellungen für die Administration der Online-Hilfe ändern +rbac#:#il_sess_participant#:#Terminteilnehmer +rbac#:#il_sess_status_closed#:#Nicht-Teilnehmer geschlossener Termin +rbac#:#ilias_id#:#cate-ID +rbac#:#lm_copy#:#cate-Lernmodul kopieren +rbac#:#lm_delete#:#cate-Lernmodul löschen +rbac#:#lm_read#:#cate-Lernmodul lesen +rbac#:#lm_visible#:#cate-Lernmodul ist sichtbar +rbac#:#lm_write#:#cate-Lernmodul bearbeiten +rbac#:#mail_internal_mail#:#Benutzer dürfen das interne Mail-System nutzen +rbac#:#mail_smtp_mail#:#Benutzer darf Mails per SMTP an externe Adressen senden +rbac#:#org_op_edit_submissions_grades#:#Abgaben anderer Benutzer bearbeiten +rbac#:#org_op_manage_participants#:#Untergeordnete Teilnehmende verwalten +rbac#:#org_op_score_participants#:#Untergeordnete Teilnehmende bewerten +rbac#:#org_op_view_certificates#:#Zertifikate untergeordneter Benutzer einsehen +rbac#:#org_op_view_competences#:#Kompetenzen untergeordneter Benutzer einsehen +rbac#:#orgu_cat_administrate_users#:#Benutzerkonten können lokal angelegt und verwaltet werden +rbac#:#orgu_read_users#:#Benutzerkonten können in dieser Organisationseinheit lokal eingesehen werden +rbac#:#prg_copy#:#Benutzer kann das Qualifizierungsprogramm kopieren +rbac#:#prg_delete#:#Qualifizierungsprogramm löschen +rbac#:#prg_manage_members#:#Zuweisungen eines Qualifizierungsprogramms bearbeiten +rbac#:#prg_read#:#Seiteninhalt des Qualifizierungsprogramms kann gelesen werden +rbac#:#prg_visible#:#Qualifizierungsprogramm ist sichtbar +rbac#:#prgr_copy#:#Links zu Qualifizierungsprogrammen kopieren +rbac#:#prgr_delete#:#Links zu Qualifizierungsprogrammen verschieben oder löschen +rbac#:#prgr_visible#:#Links zu Qualifizierungsprogrammen sind sichtbar und können genutzt werden +rbac#:#prgr_write#:#Einstellungen der Links zu Qualifizierungsprogrammen bearbeiten +rbac#:#prgs_edit_permission#:#Rechteeinstellungen in Qualifizierungsprogramm-Administration ändern +rbac#:#prgs_read#:#Lesezugriff auf Qualifizierungsprogramm-Administration +rbac#:#prgs_visible#:#Qualifizierungsprogramm-Administration ist sichtbar +rbac#:#prgs_write#:#Einstellungen in Qualifizierungsprogramm-Administration bearbeiten +rbac#:#provider_provider#:#Trainingsanbieter -> Trainingsanbieter +rbac#:#provider_tags#:#Trainingsanbieter -> Tags +rbac#:#provider_trainer#:#Trainingsanbieter -> Trainer +rbac#:#ps_export_member_data#:#Export von Mitgliederdaten in Gruppen und Trainings erlauben +rbac#:#rbac_create_crs#:#Training anlegen +rbac#:#rbac_create_crsr#:#Trainingslink anlegen +rbac#:#rbac_create_lm#:#cate-Lernmodul anlegen +rbac#:#rbac_create_prg#:#Qualifizierungsprogramm anlegen +rbac#:#rbac_create_prgr#:#Link zu Qualifizierungsprogramm anlegen +rbac#:#rbac_create_rcrs#:#ECS-Training anlegen +rbac#:#rbac_create_sess#:#Termin anlegen +rbac#:#rbac_delete_local_policies_info#:#Wählen Sie diese Einstellung, um alle vorhandenen lokalen Zugriffsregelungen (z.B. in Trainings und Gruppen) zu entfernen. Alle Rechte werden neu geschrieben, anschließend wird der Rechteschutz aktiviert. +rbac#:#rbac_form_copy_roles_adjust_type#:#Art der Rechteanpassung +rbac#:#rbac_form_copy_roles_ce_add_yes#:#Vorhandene Objekte nur um ausgewählte Rechte ergänzen +rbac#:#rbac_form_copy_roles_ce_add_yes_info#:#Sowohl die vorhandenen Rechtevorgaben der Ziel-Rolle als auch die Rechteeinstellungen vorhandener Objekte werden entsprechend ergänzt. +rbac#:#rbac_form_copy_roles_ce_clone_no_info#:#Vorhandene Rechtevorgaben der Ziel-Rolle werden überschrieben. Die Rechteeinstellungen der bereits vorhandenen Objekte werden dagegen nicht geändert. +rbac#:#rbac_form_copy_roles_ce_clone_yes_info#:#Vorhandene lokale Rechtevorgaben werden entsprechend überschrieben und IN GÄNZE mit allen markierten und nicht markierten Rechten auf alle vorhandenen Objekte angewendet. +rbac#:#rbac_form_copy_roles_ce_remove_yes#:#Vorhandene Objekte nur um ausgewählte Rechte reduzieren +rbac#:#rbac_msg_user_already_assigned#:#Die ausgewählten Benutzer*innen sind dieser Rolle bereits zugeordnet. +rbac#:#rbac_precondition_hide_info#:#Dieses Objekt wird Benutzer*innen solange nicht angezeigt, bis die definierten Vorbedingungen erfüllt sind. +rbac#:#rbac_role_delete_self#:#Achtung: Sie selbst sind dieser Rolle zugeordnet. Wenn Sie den Löschvorgang fortführen, kann es sein, dass Sie Zugriffsrechte an diesem oder anderen Materialien verlieren. +rbac#:#rbac_unprotected_delete_local_policies_info#:#Wenn aktiviert, werden alle lokalen Zugriffsregelungen überschrieben und die Rechte in Trainings und Gruppen neu initialisiert. +rbac#:#rcrs_delete#:#ECS-Training löschen +rbac#:#rcrs_read#:#Lesezugriff auf ECS-Training +rbac#:#rcrs_visible#:#ECS-Training ist sichtbar +rbac#:#rcrs_write#:#ECS-Training bearbeiten +rbac#:#read_users#:#Benutzerkonten lokal einsehen +rbac#:#root_read#:#Lesezugriff auf das System +rbac#:#root_visible#:#System ist sichtbar +rbac#:#sess_copy#:#Termin kopieren +rbac#:#sess_delete#:#Termin löschen +rbac#:#sess_manage_members#:#Teilnehmende eines Termins verwalten +rbac#:#sess_read#:#Lesezugriff auf Termine +rbac#:#sess_visible#:#Termine sind sichtbar +rbac#:#sess_write#:#Termine bearbeiten +rbac#:#sysc_write#:#Benutzer darf Systemchecks durchführen +rbac#:#venues_tags#:#Veranstaltungsorte -> Tags +rbac#:#venues_tags_search#:#Veranstaltungsorte -> Tags für Trainingssuche +rbac#:#venues_venues#:#Veranstaltungsorte -> Veranstaltungsorte +rcrs#:#rcrs_call#:#ECS-Training aufrufen +registration#:#reg_added_assignment#:#Eine neue Zuordnung wurde angelegt. +registration#:#reg_allow_codes_info#:#Benutzer*innen können sich zusätzlich mit Codes registrieren. +registration#:#reg_allowed_domains_info#:#Benutzen Sie * als Platzhalter und ; als Trennzeichen. Zum Beispiel "*@cate-tms.de". Registrierungscodes heben diese Prüfung auf. +registration#:#reg_approve_info#:#Alle neu angemeldeten Benutzerkonten müssen vom einem/einer Systemadministrator*in freigeschaltet werden. +registration#:#reg_approve_needs_recipient#:#Für die Registrierungsart "Anmeldung mit Überprüfung" sollte mindestens ein*e Benutzer*in festgelegt werden, der/die bei Neuanmeldungen benachrichtigt wird. +registration#:#reg_confirmation_link_successful#:#Sie haben sich erfolgreich registriert. Jetzt müssen Sie noch Ihr Benutzerkonto aktivieren. Dazu wurde Ihnen soeben eine E-Mail mit einem Bestätigungslink geschickt. Bitte klicken Sie innerhalb der nächsten Minuten auf den Bestätigungslink, um Ihr Benutzerkonto zu aktivieren. Danach können Sie sich in cate einloggen. +registration#:#reg_direct_info#:#Wenn eingeschaltet, werden alle neu angemeldeten Benutzer*innen automatisch freigeschaltet. +registration#:#reg_email_domains#:#Bitte vervollständigen Sie Ihre Eingabe. Die folgenden E-Mail-Adress-Domains sind gültig: %s +registration#:#reg_info_pwd#:#Wenn eingeschaltet, wird neu angemeldeten Benutzer*innen ein automatisch generiertes Passwort vergeben und zugesandt. +registration#:#reg_mail_body_activation#:#um Ihr Benutzerkonto freizuschalten und gleichzeitig diese E-Mail-Adresse zu bestätigen, klicken Sie bitte den folgenden Link an: +registration#:#reg_mail_body_approve#:#Sie haben sich bereits bei cate angemeldet und eine Mail mit Ihren Zugangsdaten erhalten. Jetzt ist Ihr Zugang von den Systemadministrator*innen freigeschaltet worden. Bei Fragen und Problemen, wenden Sie sich am besten per Mail an diese. +registration#:#reg_mail_body_confirmation#:#Um das Benutzerkonto zu aktivieren, müssen Sie es in der cate-Benutzerverwaltung freischalten. +registration#:#reg_mail_body_pwd_generation#:#Allerdings muss Ihr Zugang noch von den Systemadministrator*innen freigeschaltet werden. Wenn dies erfolgt ist, erhalten Sie noch eine Bestätigungsmail. +registration#:#reg_mail_new_user#:#Anmeldung eines neuen Benutzerkontos +registration#:#reg_mail_new_user_body#:#Ein*e neue Benutzer*in hat sich angemeldet. +registration#:#reg_type_confirmation_info#:#Bei dieser Registrierungsmethode erhält der/die neue Benutzer*in zunächst per E-Mail-Adresse einen Bestätigungslink zugesandt. Wird dieser bestätigt, erfolgt die automatische Freischaltung des Benutzerkontos. +registration#:#reg_unknown_recipients#:#Die folgenden Benutzer*innen sind nicht gültig: +registration#:#registration_code_optional_info#:#Einen evtl. vorhandenen Registrierungs-Code können Sie hier eingeben. +registration#:#registration_code_required_info#:#Ein Registrierungs-Code ist Voraussetzung für die erfolgreiche Registrierung. +registration#:#registration_codes_roles_title#:#Rolle für neue cate-Benutzerkonten +registration#:#reg_confirmation_hash_not_found#:#Dieser Bestätigungslink passt zu keinem cate-Benutzerkonto. +registration#:#registration_disabled_no_access#:#Die Selbstregistrierung ist nicht aktiviert. Bitte kontaktieren Sie die Systemadministrator*innen für weitere Unterstützung: %s. +registration#:#registration_no_valid_role#:#Es ist momentan keine Rolle für Registrierungen definiert. Bitte kontaktieren Sie die Systemadministrator*innen. +registration#:#registration_reg_type_codes_info#:#Bei dieser Registrierungsmethode benötigt der/die neue Benutzer*in einen gültigen Code. +registration#:#registration_settings#:#Auth / Selbstregistrierung +rep#:#rep_activation_online_object_info#:#Diese Einstellung wirkt sich auf alle Referenzen im Magazin aus. +rep#:#rep_breadcr_crs#:#Brotkrumennavigation beginnt mit Training +rep#:#rep_breadcr_crs_overwrite#:#Brotkrumendarstellung kann im Training konfiguriert werden. +rep#:#rep_breadcr_crs_overwrite_not#:#Brotkrumendarstellung kann im Training nicht konfiguriert werden. +rep#:#rep_export_limitation_info#:#Begrenzt die Anzahl an exportierten Unterobjekten beim Export von Containern (Kategorien, Trainings, ...) im Magazin. +rep#:#rep_intro3#:#Klicken Sie auf die %s-Schaltfläche neben der Auswahlliste oben rechts, um eine erste Kategorie anzulegen. +rep#:#rep_mo_mem_dash#:#Sie sind aktuell noch nicht Mitglied eines Trainings oder einer Gruppe. +rep_robj_xack#:#rep_robj_xack_course_idd_time_units#:#Weiterbildungszeit +rep_robj_xado#:#rep_robj_xado_no_trainings_available#:#Derzeit haben Sie keine Einsätze als Trainingsadministrator*in. +rep_robj_xage#:#rep_robj_xage_idd_learning_time#:#Weiterbildungszeit +rep_robj_xage#:#rep_robj_xage_idd_time#:#Weiterbildungszeit (Stunden) +rep_robj_xage#:#rep_robj_xage_pool_item_idd_relevance#:#relevant +rep_robj_xage#:#rep_robj_xage_total_idd_time#:#Summe Weiterbildungszeit für diesen Tag: +rep_robj_xaip#:#rep_robj_xaip_idd_learning_content#:#Lerninhalt +rep_robj_xaip#:#rep_robj_xaip_idd_relevant#:#weiterbildungszeit-relevant +rep_robj_xaip#:#rep_robj_xaip_idd_relevant_byline#:#Bestimmt, ob dieser Baustein im Sinne von Weiterbildungszeit anrechnungsfähig ist. +rep_robj_xbkm#:#rep_robj_xbkm_booking_forward_to_course#:#Nach Buchung direkt Training öffnen +rep_robj_xbkm#:#rep_robj_xbkm_booking_forward_to_course_info#:#Benutzer*innen erhalten beim Abschluss der Buchung die alternative Möglichkeit, direkt das Training zu öffnen. +rep_robj_xbka#:#rep_robj_xbka_course_idd_time_units#:#Weiterbildungszeit +rep_robj_xbkm#:#rep_robj_xbkm_admin#:#Trainingsadministrator +rep_robj_xbkm#:#rep_robj_xbkm_anonymous_decision_form_text#:#Für die Buchung eines Trainings benötigen Sie ein Benutzerkonto. Wechseln Sie über "%s" zur Anmeldung, wenn Sie bereits ein Benutzerkonto besitzen. Nach der Anmeldung werden Sie direkt zur Buchung des Trainings weitergeleitet.

Wenn Sie noch kein Benutzerkonto besitzen, klicken Sie auf "%s". Bitte beachten Sie, dass Sie nach der Registrierung die Buchung des Trainings erneut durchführen müssen. +rep_robj_xbkm#:#rep_robj_xbkm_assign_roles#:#Rollenzuweisung +rep_robj_xbkm#:#rep_robj_xbkm_book_status#:#Buchungsstatus +rep_robj_xbkm#:#rep_robj_xbkm_booked_by#:#Zuletzt geändert von +rep_robj_xbkm#:#rep_robj_xbkm_booked_courses#:#Besuchte Trainings +rep_robj_xbkm#:#rep_robj_xbkm_booking_cancel_done#:#Ihre Stornierung für das Training "%s" war erfolgreich. +rep_robj_xbkm#:#rep_robj_xbkm_booking_deadline_info#:#Tage vor Trainingsbeginn, wenn die Frist für Buchungen abläuft. 0 bedeutet am Tag des Trainings. +rep_robj_xbkm#:#rep_robj_xbkm_booking_hide_superior_approve#:#Keine Abstimmung mit Führungskraft benötigt +rep_robj_xbkm#:#rep_robj_xbkm_booking_link_booked_message#:#Eine Buchung ist nicht möglich, da Sie bereits Mitglied dieses Trainings sind. +rep_robj_xbkm#:#rep_robj_xbkm_booking_link_course_overbooked#:#Eine Buchung ist nicht möglich, da das Training ausgebucht ist. +rep_robj_xbkm#:#rep_robj_xbkm_booking_skip_duplicate_check_info#:#Wenn die Checkbox gewählt ist, wird eine Buchung nicht verhindert, wenn der/die Benutzer*in bereits ein auf ein vergleichbares Training gebucht ist. +rep_robj_xbkm#:#rep_robj_xbkm_booking_waiting_done#:#Sie wurden auf die Warteliste für das Training "%s" gesetzt. +rep_robj_xbkm#:#rep_robj_xbkm_cancel_step_overview_label#:#Zu stornierende Benutzer +rep_robj_xbkm#:#rep_robj_xbkm_conf_min_member#:#Reminder Mindestteilnehmerzahl nicht erreicht +rep_robj_xbkm#:#rep_robj_xbkm_confirm_delete_multi#:#Sollen diese Stornierungsgründe wirklich gelöscht werden? +rep_robj_xbkm#:#rep_robj_xbkm_crs_ref_id#:#Ref-Id Training +rep_robj_xbkm#:#rep_robj_xbkm_current_booking_status#:#Mitgliedsstatus am zu buchenden Training +rep_robj_xbkm#:#rep_robj_xbkm_days_before_course_info#:#Tag vor Trainingsbeginn, an dem die Erinnerung an das Nichterreichen der Mindestteilnehmerzahl versendet werden soll. +rep_robj_xbkm#:#rep_robj_xbkm_duplicate_courses_confirmation_alert#:#Bitte bestätigen Sie, dass Ihnen bekannt ist, dass in den letzten %s Tagen bereits ein vergleichbares Training gebucht wurde. +rep_robj_xbkm#:#rep_robj_xbkm_duplicate_bookings#:#Vergleichbare Teilnahmen (letzte 365 Tage) +rep_robj_xbkm#:#rep_robj_xbkm_edit_organizer_booking#:#Teilnehmende verwalten +rep_robj_xbkm#:#rep_robj_xbkm_employee_booking_waiting_done#:#%s wurde für das Training "%s" auf die Warteliste gesetzt. +rep_robj_xbkm#:#rep_robj_xbkm_member_max#:#Maximale Teilnehmerzahl +rep_robj_xbkm#:#rep_robj_xbkm_member_max_info#:#Maximale Anzahl an Teilnehmenden für das Training +rep_robj_xbkm#:#rep_robj_xbkm_member_min#:#Mindestteilnehmerzahl +rep_robj_xbkm#:#rep_robj_xbkm_member_min_info#:#Mindestanzahl an Teilnehmenden für das Training +rep_robj_xbkm#:#rep_robj_xbkm_min_mem_title#:#Reminder Mindestteilnehmerzahl nicht erreicht +rep_robj_xbkm#:#rep_robj_xbkm_no_cancable_usr_selected#:#Die ausgewählten Benutzer können nicht storniert werden. +rep_robj_xbkm#:#rep_robj_xbkm_no_locale_role_waiting_list_user#:#Die Einladung konnte nicht versendet werden, da die folgenden ausgewählten Benutzer*innen keine Rolle am Training haben: +rep_robj_xbkm#:#rep_robj_xbkm_no_permissions_to_book#:#Sie besitzen nicht das Recht, dieses Training für den/die Benutzer*in zu buchen. +rep_robj_xbkm#:#rep_robj_xbkm_no_permissions_to_book_with_approval#:#Sie besitzen nicht das Recht, dieses Training für den/die Benutzer*in zu buchen. +rep_robj_xbkm#:#rep_robj_xbkm_no_permissions_to_cancel#:#Sie besitzen nicht das Recht, dieses Training für den/die Benutzer*in zu stornieren. +rep_robj_xbkm#:#rep_robj_xbkm_no_template_set_for_crs_member#:#Es ist keine Vorlage für die Einladung an Trainingsmitglieder konfiguriert. +rep_robj_xbkm#:#rep_robj_xbkm_no_user_selected#:#Sie haben keine Benutzer ausgewählt. +rep_robj_xbkm#:#rep_robj_xbkm_no_usr_selected#:#Es wurde kein*e Benutzer*in ausgewählt. +rep_robj_xbkm#:#rep_robj_xbkm_not_below_course#:#Dieses Objekt liegt nicht unterhalb eines Trainings und ist deshalb in seiner Funktionalität eingeschränkt. +rep_robj_xbkm#:#rep_robj_xbkm_not_below_crs#:#Dieses Objekt liegt nicht unterhalb eines Trainings und ist deshalb in seiner Funktionalität eingeschränkt. +rep_robj_xbkm#:#rep_robj_xbkm_obj_xbkm#:#Buchungsmodalitäten +rep_robj_xbkm#:#rep_robj_xbkm_organizer_all_booking_done#:#Benutzer wurden erfolgreich den Vorgaben entsprechend gebucht. +rep_robj_xbkm#:#rep_robj_xbkm_organizer_not_all_booking_done#:#Nicht alle Teilnehmende konnten auf einen Festplatz gebucht werden, da Sie diesen bereits besitzen. +rep_robj_xbkm#:#rep_robj_xbkm_send_booking_mail#:#Soll die Buchungsbestätigung an folgende Benutzer versendet werden? +rep_robj_xbkm#:#rep_robj_xbkm_send_invitation_mail#:#Soll die Einladung an folgende Benutzer versendet werden? +rep_robj_xbkm#:#rep_robj_xbkm_set_user_as_booked#:#Sind Sie sicher, dass Sie den/die folgende*n Benutzer*in auf einen Festplatz buchen möchten? +rep_robj_xbkm#:#rep_robj_xbkm_tab_bookings#:#Teilnahmeverwaltung +rep_robj_xbkm#:#rep_robj_xbkm_trainer#:#Referent +rep_robj_xbkm#:#rep_robj_xbkm_view_organizer_booking#:#Teilnehmende einsehen +rep_robj_xbkm#:#rep_robj_xbkm_waiting_self_cancelled#:#Wartenlistenplatz selbst storniert +rep_robj_xbkm#:#rep_robj_xbkm_waitinglist_cancellation_info#:#Tag vor Trainingsbeginn, an dem die Warteliste abgesagt wird +rep_robj_xbkm#:#rep_robj_xbkm_waitinglist_max_info#:#Maximale Anzahl an Plätzen auf der Warteliste +rep_robj_xbkm#:#rep_robj_xbkm_wrong_file_type#:#Falscher Datei-Typ: Bitte verwenden Sie ein PDF. +rep_robj_xbkm#:#rep_robj_xbkm_xbkm_context_freetext_info#:#Freitext-E-Mail aus der Teilnahmeverwaltung der Buchungsmodalitäten +rep_robj_xccl#:#rep_robj_xccl_confirm_rename_multi#:#Folgende Bewirtungsoptionen sollen umbenannt werden. Dies wirkt sich auf alle bestehenden Objekte aus. Sollen die Einträge umbenannt werden? +rep_robj_xccl#:#rep_robj_xccl_confirm_rename_text#:#Alt: %s
Neu: %s +rep_robj_xccl#:#rep_robj_xccl_mail_info#:#Sie können eine oder mehrere (durch Komma getrennte) E-Mail-Adressen eingeben. +rep_robj_xccl#:#rep_robj_xccl_org_units_info#:#Wählen Sie die Organisationseinheiten, für deren Mitarbeiter*innen das Training als Suchergebnis auffindbar sein soll. Darunterliegende Organisationseinheiten werden automatisch mit behandelt. +rep_robj_xccl#:#rep_robj_xccl_org_units_saved#:#Die Organisationseinheiten wurden erfolgreich gespeichert. +rep_robj_xccl#:#rep_robj_xccl_placeholder_contact_email#:#Trainingssteckbrief, Kontakt-E-Mail +rep_robj_xccl#:#rep_robj_xccl_responsibility#:#Zuständigkeit/Abteilung +rep_robj_xcmb#:#rep_robj_xcmb_cat_create_xcmb#:#Teilnahmeliste anlegen +rep_robj_xcmb#:#rep_robj_xcmb_close_list#:#Teilnahmeliste abschließen +rep_robj_xcmb#:#rep_robj_xcmb_configurable_config#:#Konfiguration Vorlagen für Unterschriftenlisten +rep_robj_xcmb#:#rep_robj_xcmb_confirm_closing#:#Soll die Teilnahmeliste wirklich abgeschlossen werden? +rep_robj_xcmb#:#rep_robj_xcmb_course_admin#:#Trainingsadministrator +rep_robj_xcmb#:#rep_robj_xcmb_create_xcmb#:#Teilnahmeliste anlegen +rep_robj_xcmb#:#rep_robj_xcmb_crs_create_xcmb#:#Teilnahmeliste anlegen +rep_robj_xcmb#:#rep_robj_xcmb_download_blank_file#:#Download Blanko-Teilnahmeliste +rep_robj_xcmb#:#rep_robj_xcmb_file_deleted#:#Die Unterschriftenliste wurde erfolgreich gelöscht. +rep_robj_xcmb#:#rep_robj_xcmb_file_type_not_allowed#:#Die ausgewählte Datei weist einen unerlaubten Dateityp auf. Folgende Typen sind zulässig: +rep_robj_xcmb#:#rep_robj_xcmb_file_uploaded#:#Die Unterschriftenliste wurde erfolgreich hochgeladen. +rep_robj_xcmb#:#rep_robj_xcmb_fold_create_xcmb#:#Teilnahmeliste anlegen +rep_robj_xcmb#:#rep_robj_xcmb_grp_create_xcmb#:#Teilnahmeliste anlegen +rep_robj_xcmb#:#rep_robj_xcmb_hint_idd_equals_null#:#Es wurden erfolgreiche Teilnahmen mit einer Weiterbildungszeit von Null erfasst. Soll die Teilnahmeliste wirklich abgeschlossen werden? +rep_robj_xcmb#:#rep_robj_xcmb_idd_learning_time#:#Weiterbildungszeit +rep_robj_xcmb#:#rep_robj_xcmb_idd_learning_time_to_high#:#Die eingegebene Weiterbildungszeit ist zu hoch. Der Maximalwert beträgt %s Stunden. +rep_robj_xcmb#:#rep_robj_xcmb_ilias_lp#:#Lernfortschritt +rep_robj_xcmb#:#rep_robj_xcmb_interval_info#:#Intervall an Tagen, in dem der Cron-Job die einzelnen Teilnahmelisten überprüft. +rep_robj_xcmb#:#rep_robj_xcmb_list_required_info#:#Die Unterschriftenliste ist beim Abschließen der Teilnahmeliste verpflichtend. +rep_robj_xcmb#:#rep_robj_xcmb_memberlist_for_trainer#:#Teilnahmeliste für Referenten +rep_robj_xcmb#:#rep_robj_xcmb_no_close#:#Die Teilnahmeliste konnte aufgrund von falschen oder fehlenden Eingaben nicht abgeschlossen werden. +rep_robj_xcmb#:#rep_robj_xcmb_no_list_uploaded#:#Teilnahmeliste konnte nicht abgeschlossen werden, da keine Unterschriftenliste hochgeladen wurde. +rep_robj_xcmb#:#rep_robj_xcmb_no_lp_selected#:#Bitte wählen Sie einen Lernfortschritt +rep_robj_xcmb#:#rep_robj_xcmb_no_parent_course#:#Kein Training oberhalb dieser Teilnahmeliste gefunden +rep_robj_xcmb#:#rep_robj_xcmb_no_status_for_user#:#Es wurde keine Mail verschickt. Der/die Benutzer*in %s %s (%s) hat keinen gültigen Teilnahmestatus. +rep_robj_xcmb#:#rep_robj_xcmb_not_allowed_to_close#:#Sie haben nicht das Recht, diese Teilnahmeliste abzuschließen. +rep_robj_xcmb#:#rep_robj_xcmb_not_below_course#:#Diese Teilnahmeliste liegt nicht unterhalb eines Trainings und ist deshalb in ihrer Funktionalität eingeschränkt. +rep_robj_xcmb#:#rep_robj_xcmb_not_finalized_title#:#Reminder nichtfinalisierter Teilnahmelisten +rep_robj_xcmb#:#rep_robj_xcmb_obj_lp_mode_info_text#:#Der Status des/der Benutzer*in wird manuell von einer verantwortlichen Person gesetzt. +rep_robj_xcmb#:#rep_robj_xcmb_obj_lp_mode_text#:#Training Teilnahme +rep_robj_xcmb#:#rep_robj_xcmb_obj_xcmb#:#Teilnahmeliste +rep_robj_xcmb#:#rep_robj_xcmb_obj_xcmb_duplicate#:#Teilnahmeliste kopieren +rep_robj_xcmb#:#rep_robj_xcmb_objs_xcmb#:#Teilnahmelisten +rep_robj_xcmb#:#rep_robj_xcmb_objs_xcmb_duplicate#:#Teilnahmeliste kopieren +rep_robj_xcmb#:#rep_robj_xcmb_placeholder_desc_idd_user_time#:#Tatsächliche Zeit des Benutzers +rep_robj_xcmb#:#rep_robj_xcmb_recipient#:#Mail-Empfänger +rep_robj_xcmb#:#rep_robj_xcmb_recipient_info#:#Wenn keine Referent*innen hinterlegt sind, wird die Mail an die Trainingsadministrator*innen gesendet. +rep_robj_xcmb#:#rep_robj_xcmb_reminder#:#Reminder nichtfinalisierter Teilnahmelisten +rep_robj_xcmb#:#rep_robj_xcmb_root_create_xcmb#:#Teilnahmeliste anlegen +rep_robj_xcmb#:#rep_robj_xcmb_save_successfull#:#Die Teilnahmedaten wurden erfolgreich gespeichert. +rep_robj_xcmb#:#rep_robj_xcmb_save_successfull_and_closed#:#Die Teilnahmedaten wurden erfolgreich gespeichert und die Liste abgeschlossen. +rep_robj_xcmb#:#rep_robj_xcmb_save_successfull_partial#:#Die Teilnahmedaten konnten nur teilweise erfolgreich gespeichert werden. +rep_robj_xcmb#:#rep_robj_xcmb_set_lp_to_all#:#Die Teilnahmeliste konnte nicht abgeschlossen werden, da nicht allen Teilnehmenden ein Teilnahmestatus zugewiesen wurde.Sollten Sie eine Seitenauswahl sehen, speichern Sie bitte jede Seite einzeln, bevor Sie die Liste abschließen. +rep_robj_xcmb#:#rep_robj_xcmb_settings#:#Einstellungen für Trainingsmitglieder +rep_robj_xcmb#:#rep_robj_xcmb_siglist_template_created#:#Die Vorlage für Unterschriftenlisten wurde erfolgreich angelegt. +rep_robj_xcmb#:#rep_robj_xcmb_signature_trainer#:#Unterschrift Referent +rep_robj_xcmb#:#rep_robj_xcmb_signaturelist_trainer#:#Referent: +rep_robj_xcmb#:#rep_robj_xcmb_template_mail_id#:#Platzhalter E-Mail +rep_robj_xcmb#:#rep_robj_xcmb_template_mail_id_info#:#Platzhalter, um den Link zu dieser Liste via E-Mail versenden zu können +rep_robj_xcmb#:#rep_robj_xcmb_trainer#:#Referent +rep_robj_xcmb#:#rep_robj_xcmb_xcmb_close_list#:#Teilnahmeliste abschließen +rep_robj_xcmb#:#rep_robj_xcmb_xcmb_copy#:#Kopieren: Teilnahmeliste kopieren +rep_robj_xcmb#:#rep_robj_xcmb_xcmb_delete#:#Löschen: Teilnahmeliste verschieben oder löschen +rep_robj_xcmb#:#rep_robj_xcmb_xcmb_new#:#Teilnahmeliste hinzufügen +rep_robj_xcmb#:#rep_robj_xcmb_xcmb_read#:#Lesezugriff: Teilnahmeliste lesen +rep_robj_xcmb#:#rep_robj_xcmb_xcmb_visible#:#Anzeigen: Teilnahmelisten sind sichtbar und können genutzt werden +rep_robj_xcmb#:#rep_robj_xcmb_xcmb_write#:#Einstellungen bearbeiten: Einstellungen der Teilnahmelisten bearbeiten +rep_robj_xcml#:#rep_robj_xcml_attachments_misconfigured#:#Die Einstellungen für Mail-Anhänge entsprechen nicht den Objekten innerhalb dieses Trainings. Bitte überprüfen Sie die Einstellungen für Einladung. +rep_robj_xcml#:#rep_robj_xcml_create_xcml#:#Mailing anlegen +rep_robj_xcml#:#rep_robj_xcml_del_nothing_todo#:#Es wurden keine Elemente zum Löschen ausgewählt. +rep_robj_xcml#:#rep_robj_xcml_editCourseDates#:#Einstellungen zum Mail-Versand +rep_robj_xcml#:#rep_robj_xcml_freetext_send#:#Die Freitext-Mail wurde verschickt. +rep_robj_xcml#:#rep_robj_xcml_il_crs_admin#:#Trainingsadministrator +rep_robj_xcml#:#rep_robj_xcml_il_crs_member#:#Trainingsteilnehmer +rep_robj_xcml#:#rep_robj_xcml_il_crs_tutor#:#Referent +rep_robj_xcml#:#rep_robj_xcml_invite_colheader_booking_status#:#Buchungs-/Stornierungsstatus +rep_robj_xcml#:#rep_robj_xcml_invite_colheader_lastchange#:#gebucht/storniert am +rep_robj_xcml#:#rep_robj_xcml_mail_footer#:#Mail-Footer +rep_robj_xcml#:#rep_robj_xcml_mail_footer_header#:#Einstellungen für Mail-Footer +rep_robj_xcml#:#rep_robj_xcml_mail_to#:#Empfänger +rep_robj_xcml#:#rep_robj_xcml_mailing#:#Mailing +rep_robj_xcml#:#rep_robj_xcml_no_user_selected#:#Sie haben keine Empfänger ausgewählt. +rep_robj_xcml#:#rep_robj_xcml_not_below_course#:#Diese Mailings liegen nicht unterhalb eines Trainings und sind deshalb in ihrer Funktionalität eingeschränkt. +rep_robj_xcml#:#rep_robj_xcml_prevent_booking_confirmation#:#Mail-Versand +rep_robj_xcml#:#rep_robj_xcml_prevent_booking_confirmation_info#:#Keine automatische Buchungsbestätigung für dieses Training versenden (Versand-Einstellung "Automatischen Mail-Versand unterbinden" aus dem Mailing-Objekt setzt sich im Zweifel durch). +rep_robj_xcml#:#rep_robj_xcml_prevent_cancel_confirmation_info#:#Keine automatische Stornierungsbestätigung für dieses Training versenden (Versand-Einstellung "Automatischen Mail-Versand unterbinden" aus dem Mailing-Objekt setzt sich im Zweifel durch). +rep_robj_xcml#:#rep_robj_xcml_prevent_confirmation#:#Mail-Versand unterbinden +rep_robj_xcml#:#rep_robj_xcml_prg_context_manual#:#Qualifizierungsprogramm: Mail an zugewiesene Benutzer +rep_robj_xcml#:#rep_robj_xcml_prg_create_xcml#:#Mailing anlegen +rep_robj_xcml#:#rep_robj_xcml_read_log#:#Mail-Log einsehen +rep_robj_xcml#:#rep_robj_xcml_reject_invite_link#:#Link, um die Einladung abzusagen +rep_robj_xcml#:#rep_robj_xcml_send_booking_mail#:#Soll die Buchungsbestätigung an folgende Personen geschickt werden? +rep_robj_xcml#:#rep_robj_xcml_send_freetex_mail#:#Soll die Freitext-Mail an folgende Personen geschickt werden? +rep_robj_xcml#:#rep_robj_xcml_set_invited#:#Manuell auf "eingeladen" setzen +rep_robj_xcml#:#rep_robj_xcml_set_rejected#:#Manuell auf "abgesagt" setzen +rep_robj_xcml#:#rep_robj_xcml_settings_days_invitation#:#Zeitpunkt Einladung +rep_robj_xcml#:#rep_robj_xcml_settings_days_invitation_desc#:#Zeitpunkt der Einladung in Tagen vor Trainingsbeginn +rep_robj_xcml#:#rep_robj_xcml_settings_prevent_mailing#:#Automatischen Mail-Versand unterbinden +rep_robj_xcml#:#rep_robj_xcml_settings_prevent_mailing_edit_info#:#Geändert von %s am %s. +rep_robj_xcml#:#rep_robj_xcml_settings_prevent_mailing_info#:#Keine automatischen Mails für dieses Training versenden +rep_robj_xcml#:#rep_robj_xcml_settings_successful_deleted#:#Der Eintrag / die Einträge wurde(n) erfolgreich gelöscht. +rep_robj_xcml#:#rep_robj_xcml_sure_delete_user#:#Sind Sie sich sicher, dass Sie folgende Benutzer*innen wirklich entfernen wollen? +rep_robj_xcml#:#rep_robj_xcml_table_automails_title#:#Automatische Mails in diesem Training +rep_robj_xcml#:#rep_robj_xcml_table_rolemapping_nomail_option#:#Keine E-Mail +rep_robj_xcml#:#rep_robj_xcml_table_rolemappings_localrole#:#Lokale Rolle am Training +rep_robj_xcml#:#rep_robj_xcml_template_ident_asc#:#Mail-Template aufsteigend +rep_robj_xcml#:#rep_robj_xcml_template_ident_desc#:#Mail-Template absteigend +rep_robj_xcml#:#rep_robj_xcml_user_deleted#:#Die Benutzer*innen wurden erfolgreich entfernt. +rep_robj_xcml#:#rep_robj_xcml_user_marked_as_invited#:#Die Benutzer*innen wurden erfolgreich als eingeladen markiert. +rep_robj_xcml#:#rep_robj_xcml_user_marked_as_rejected#:#Die Benutzer*innen wurden erfolgreich als abgesagt markiert. +rep_robj_xcml#:#rep_robj_xcml_user_still_added#:#Die Benutzer*innen sind bereits hinzugefügt. +rep_robj_xcml#:#rep_robj_xcml_validation_only_positive_numbers#:#Bitte geben Sie eine positive Zahl (oder 0) ein. +rep_robj_xcml#:#rep_robj_xcml_xcml_context_freetext_info#:#Freitext-Mails für "Mail an Mitglieder" der Mailing-Objekte in Trainings +rep_robj_xcml#:#rep_robj_xcml_xcml_context_invites_info#:#Für Benutzer*innen, die manuell zu einem Training eingeladen werden sollen +rep_robj_xcml#:#rep_robj_xcml_xcml_context_invites_title#:#Manuelle Einladung +rep_robj_xcml#:#rep_robj_xcml_xcml_context_prg_deadline_info#:#Mail, wenn der Bearbeitungszeitraum vorüber ist +rep_robj_xcml#:#rep_robj_xcml_xcml_context_prg_deadline_title#:#Qualifizierungsprogramm: Ablauf Bearbeitungszeitraum +rep_robj_xcml#:#rep_robj_xcml_xcml_context_prg_freetext#:#Freitext-Mail aus Qualifizierungsprogramm +rep_robj_xcml#:#rep_robj_xcml_xcml_context_prg_freetext_title#:#Qualifizierungsprogramme: Freitext-Mail +rep_robj_xcml#:#rep_robj_xcml_xcml_context_prg_freetext_info#:#Freitext-Mails für "Mail an Mitglieder" der Mailing-Objekte in Qualifizierungsprogrammen +rep_robj_xcml#:#rep_robj_xcml_xcml_context_prg_restart_period_info#:#Mail bei einer automatischen erneuten Teilnahme am Qualifizierungsprogramm +rep_robj_xcml#:#rep_robj_xcml_xcml_context_prg_restart_period_title#:#Qualifizierungsprogramm: Wiederaufnahme bei Ablauf der Qualifikation +rep_robj_xcml#:#rep_robj_xcml_xcml_context_prg_user_assignment_info#:#Mail für neue Teilnehmende am Programm +rep_robj_xcml#:#rep_robj_xcml_xcml_context_prg_user_assignment_title#:#Qualifizierungsprogramm: Zuweisung Teilnehmer +rep_robj_xcml#:#rep_robj_xcml_xcml_context_prg_validity_info#:#Mail beim Ablauf der Qualifikation +rep_robj_xcml#:#rep_robj_xcml_xcml_context_prg_validity_title#:#Qualifizierungsprogramm: Ablauf der Qualifikation +rep_robj_xcml#:#rep_robj_xcml_xcml_mail_to_members#:#Mail-Versand: Mails an Trainingsmitglieder senden +rep_robj_xcml#:#rep_robj_xcml_xcml_new#:#Mailings hinzufügen +rep_robj_xcml#:#settings_days_invitation_desc#:#Zeitpunkt der Einladungsmail in Tagen vor Trainingssbeginn +rep_robj_xcml#:#settings_days_invitation_reminder_desc#:#Zeitpunkt der Erinnerungsmail in Tagen vor Trainingsbeginn (wenn zum Buchungszeitpunkt sowohl Einladungs- als auch Erinnerungsversandtermin verstrichen ist, wird nur noch die Einladung versandt) +rep_robj_xcml#:#xcml_context_prg_freetext_info#:#Verfügbar für Mailing-Objekte in Qualifizierungsprogrammen +rep_robj_xcml#:#xcml_context_prg_freetext_title#:#Freitext-Mails aus Qualifizierungsprogrammen +rep_robj_xcps#:#rep_robj_xcps_additional_infos_info#:#Im geführten Anlageprozess können zusätzliche Informationen (z. B. für externe Trainings) hinzugefügt werden. +rep_robj_xcps#:#rep_robj_xcps_choose_course_location#:#Ort für neues Training aussuchen +rep_robj_xcps#:#rep_robj_xcps_crs_admin_role#:#Trainingsadministrator +rep_robj_xcps#:#rep_robj_xcps_crs_tutor_role#:#Referent +rep_robj_xcps#:#rep_robj_xcps_duplicate_from_template#:#Training aus Vorlage anlegen +rep_robj_xcps#:#rep_robj_xcps_edit_benefits_info#:#Die Ziele und Nutzen dürfen im geführten Anlageprozess für Trainings geändert werden. +rep_robj_xcps#:#rep_robj_xcps_edit_content_info#:#Die Inhalte dürfen im geführten Anlageprozess für Trainings geändert werden. +rep_robj_xcps#:#rep_robj_xcps_edit_gti_info#:#Im geführten Anlageprozess können GTI-Informationen geändert werden. +rep_robj_xcps#:#rep_robj_xcps_edit_idd_learningtime#:#Weiterbildungszeit ändern +rep_robj_xcps#:#rep_robj_xcps_edit_idd_learningtime_info#:#Die Weiterbildungszeit darf im Anlagemechanismus für Trainings geändert werden. +rep_robj_xcps#:#rep_robj_xcps_edit_memberlimits#:#Teilnehmerzahl ändern +rep_robj_xcps#:#rep_robj_xcps_edit_memberlimits_info#:#Die minimale und maximale Anzahl an Teilnehmer*innen darf im geführten Anlageprozess für Trainings geändert werden. +rep_robj_xcps#:#rep_robj_xcps_edit_org_units_info#:#Wenn aktiviert ist, können im geführten Anlageprozess die Organisationseinheiten bestimmt werden, für deren Mitarbeiter*innen das Training als Suchergebnis angezeigt werden soll. +rep_robj_xcps#:#rep_robj_xcps_edit_provider_info#:#Der Trainingsanbieter darf im geführten Anlageprozess für Trainings geändert werden. +rep_robj_xcps#:#rep_robj_xcps_edit_target_group_description_info#:#Die Freitextbeschreibung der Zielgruppen darf im geführten Anlageprozess für Trainings geändert werden. +rep_robj_xcps#:#rep_robj_xcps_edit_target_groups_info#:#Die Schlagwörter dürfen im geführten Anlageprozess für Trainings geändert werden. +rep_robj_xcps#:#rep_robj_xcps_edit_title#:#Trainingstitel ändern +rep_robj_xcps#:#rep_robj_xcps_edit_title_info#:#Der Trainingstitel darf im geführten Anlageprozess für Trainings geändert werden. +rep_robj_xcps#:#rep_robj_xcps_edit_venue_info#:#Der Veranstaltungsort darf im geführten Anlageprozess für Trainings geändert werden. +rep_robj_xcps#:#rep_robj_xcps_if_not_set_by_agenda#:#Wenn "Nein" gewählt ist, wird die Trainingszeit aus dem Ablaufplan bestimmt. +rep_robj_xcps#:#rep_robj_xcps_il_crs_member#:#Trainingsmitglied +rep_robj_xcps#:#rep_robj_xcps_idd_learningtime#:#Weiterbildungszeit +rep_robj_xcps#:#rep_robj_xcps_not_below_course#:#Diese Kopiereinstellungen liegen nicht unterhalb eines Trainings und sind deshalb in ihrer Funktionalität eingeschränkt. +rep_robj_xcps#:#rep_robj_xcps_self_ref_templates_info#:#Wenn die Checkbox aktiviert ist, wird nach der Anlage eines neuen Trainings das Feld "Vorlage" in den Trainingseinstellungen auf das neue Training selbst gesetzt. +rep_robj_xcps#:#rep_robj_xcps_set_by_agenda#:#aus Ablaufplan bestimmt +rep_robj_xcps#:#rep_robj_xcps_start_must_be_in_future#:#Das Training darf nicht vor dem %s starten. +rep_robj_xcps#:#rep_robj_xcps_time_mode#:#Modus für Trainingsstart bei Anlage +rep_robj_xcps#:#rep_robj_xcps_xcps_choose_course_location#:#Ort für neues Training aussuchen +rep_robj_xcps#:#rep_robj_xcps_xcps_duplicate_from_template#:#Training aus Vorlage erzeugen +rep_robj_xebo#:#rep_robj_xebo_filteroption_unassigned_to_orgu#:#Benutzerkonten ohne Organisationseinheit +rep_robj_xebo#:#rep_robj_xebo_invisible_course_topics_info#:#Trainings mit einem dieser Schlagwörter werden nicht angezeigt. +rep_robj_xebo#:#rep_robj_xebo_invisible_tags_info#:#Trainings mit einem dieser Schlagwörter werden nicht angezeigt. +rep_robj_xebo#:#rep_robj_xebo_sum_idd_achieved#:#Weiterbildungszeit (bisher gesammelt) +rep_robj_xebo#:#rep_robj_xebo_sum_idd_forecast#:#Weiterbildungszeit (bereits gebucht) +rep_robj_xebo#:#rep_robj_xebo_update#:#Aktualisieren +rep_robj_xebo#:#rep_robj_xebo_view_all_users#:#Alle Benutzerkonten/Organisationseinheiten einsehen +rep_robj_xebo#:#rep_robj_xebo_xebo_view_all_users#:#Alle Benutzerkonten/Organisationseinheiten einsehen +rep_robj_xebr#:#rep_robj_xebr_config_saved#:#Die Konfiguration für die Sichtbarkeit des Reiters wurde gespeichert. +rep_robj_xebr#:#rep_robj_xebr_confirm_header#:#Sollen die Zertifikate für folgende Trainings wirklich entfernt werden? +rep_robj_xebr#:#rep_robj_xebr_confirm_header_single#:#Soll das Zertifikat für folgendes Training und folgende*n Benutzer*in wirklich entfernt werden? +rep_robj_xebr#:#rep_robj_xebr_crs_ref_id#:#Training Referenz-ID +rep_robj_xebr#:#rep_robj_xebr_error_creating_certificate_pdf#:#Das Zertifikat konnte nicht erstellt werden. Bitte lassen Sie den Zertifikatsserver durch die Systemadministrator*innen prüfen. +rep_robj_xebr#:#rep_robj_xebr_may_not_view_user#:#Sie besitzen nicht die nötigen Rechte, um die Bildungsbiographie des/der Benutzer*in einzusehen. +rep_robj_xebr#:#rep_robj_xebr_no_admin_no_action#:#Sie haben nicht die nötigen Rechte, um diese Funktion auszuführen. +rep_robj_xebr#:#rep_robj_xebr_no_course#:#Die eingegebene Referenz-ID entspricht keinem vorhandenen Training. +rep_robj_xebr#:#rep_robj_xebr_no_permission_to_download#:#Sie besitzen nicht die nötigen Rechte, um das Zertifikat herunterzuladen. +rep_robj_xebr#:#rep_robj_xebr_nothing_to_delete#:#Es wurden keine Benutzer*innen gefunden, deren Zertifikat entfernt werden muss. +rep_robj_xebr#:#rep_robj_xebr_nothing_to_save#:#Es wurden keine Werte zum Speichern eingegeben. +rep_robj_xebr#:#rep_robj_xebr_part_document_crs_provider#:#Trainingsanbieter +rep_robj_xebr#:#rep_robj_xebr_part_document_description#:#Im Folgenden sind die Trainings aufgeführt, an denen Sie teilgenommen haben und die im System finalisiert worden sind. Alle Maßnahmen, die noch offen sind bzw. in der Zukunft liegen, sind nicht in dieser Übersicht enthalten. Diese finden Sie online in Ihrer Bildungsbiografie. +rep_robj_xebr#:#rep_robj_xebr_part_document_image_uploaded#:#Das Logo wurde erfolgreich hochgeladen/entfernt. +rep_robj_xebr#:#rep_robj_xebr_part_document_logo_info#:#Logo für den Überblick der Trainingsteilnahmen (maximale Größe 180x175 Pixel) +rep_robj_xebr#:#rep_robj_xebr_recommendation_allowed#:#Training empfehlen aktiv +rep_robj_xebr#:#rep_robj_xebr_refresh_user_certificates_message#:#Aufgrund einer Systemaktualisierung ist es erforderlich, den Abruf Ihrer bereits generierten Zertifikate einmalig neu zu initialisieren.

Klicken Sie dazu auf "Zertifikate initialisieren".

Die Aktualisierung der Zertifikate kann - abhängig von der Anzahl der Zertifikate - einige Minuten in Anspruch nehmen.

Im Anschluss stehen die Zertifikate wie gewohnt in Ihrer Bildungsbiografie zum Abruf zur Verfügung.

+rep_robj_xebr#:#rep_robj_xebr_schedule_created#:#Das Überblickszertifikat wurde erfolgreich angelegt. Die weitere Konfiguration des Überblickszertifikats ist nun möglich. +rep_robj_xebr#:#rep_robj_xebr_schedule_deleted#:#Das Überblickszertifikat ist erfolgreich entfernt worden. +rep_robj_xebr#:#rep_robj_xebr_schedule_updated#:#Das Überblickszertifikat wurde erfolgreich gespeichert. +rep_robj_xebr#:#rep_robj_xebr_settings_saved_confirm#:#Die Einstellungen wurden gespeichert. +rep_robj_xebr#:#rep_robj_xebr_idd_learning_time#:#Weiterbildungszeit +rep_robj_xebr#:#rep_robj_xebr_title#:#Titel +rep_robj_xebr#:#rep_robj_xebr_idd_learning_time_booked#:#Gebuchte Weiterbildungszeit +rep_robj_xebr#:#rep_robj_xebr_min_idd_value#:#Schwellenwert Weiterbildungszeit +rep_robj_xebr#:#rep_robj_xebr_part_document_crs_idd#:#Weiterbildungszeit +rep_robj_xebr#:#rep_robj_xebr_part_document_idd_minutes#:#Summe Weiterbildungszeit: +rep_robj_xebr#:#rep_robj_xebr_received_idd_minutes#:#Erreichte Weiterbildungszeit +rep_robj_xebr#:#rep_robj_xebr_sum_idd_achieved#:#Weiterbildungszeit (bisher gesammelt) +rep_robj_xebr#:#rep_robj_xebr_sum_idd_forecast#:#Weiterbildungszeit (bereits gebucht) +rep_robj_xebr#:#rep_robj_xebr_total_idd_value#:#Gesammelte, fest erwirkte Weiterbildungszeit +rep_robj_xebr#:#rep_robj_xebr_total_sum_idd_achieved#:#Summe Weiterbildungszeit (bisher gesammelt) +rep_robj_xebr#:#rep_robj_xebr_total_sum_idd_forecast#:#Summe Weiterbildungszeit (bereits gebucht) +rep_robj_xebr#:#rep_robj_xebr_user_certificates_refreshing_message#:#Die Initialisierung Ihrer Zertifikate ist aktuell noch in Arbeit.

Die Aktualisierung der Zertifikate kann - abhängig von der Anzahl der Zertifikate - einige Minuten in Anspruch nehmen.

Bitte haben Sie noch etwas Geduld. +rep_robj_xebr#:#rep_robj_xebr_usernames_info#:#Diese Benutzerkonten sind berechtigt, das Plugin zu konfigurieren. +rep_robj_xetr#:#rep_robj_xetr_idd_settings#:#Einstellungen für Weiterbildungszeit +rep_robj_xetr#:#rep_robj_xetr_idd_settings_saved#:#Einstellungen für Weiterbildungszeit erfolgreich gespeichert. +rep_robj_xetr#:#rep_robj_xetr_learning_time#:#Weiterbildungszeit +rep_robj_xetr#:#rep_robj_xetr_placeholder_desc_idd_time#:#Zeit (Bildungstracking) +rep_robj_xetr#:#rep_robj_xetr_tab_idd#:#Einstellungen Weiterbildungszeit +rep_robj_xfbk#:#rep_robj_xfbk_add_successful#:#Die Dimension wurde hinzugefügt. +rep_robj_xfbk#:#rep_robj_xfbk_cant_unlock_title_in_use#:#Die Dimension kann nicht entsperrt werden. Der Titel wird bereits von einer vorhandenen Dimension benutzt. +rep_robj_xfbk#:#rep_robj_xfbk_create_successful#:#Das Objekt wurde erfolgreich hinzugefügt. +rep_robj_xfbk#:#rep_robj_xfbk_enable_comment_info#:#Wenn diese Option aktiviert ist, wird dem/der Benutzer*in neben der eigentlichen Bewertung die Möglichkeit zur Freitexteingabe gegeben. +rep_robj_xfbk#:#rep_robj_xfbk_min_submissions_byline#:#Haben bei einem Feedback zu diesem Set weniger Benutzer*innen als die Anzahl teilgenommen, werden keine Informationen in der Auswertung angezeigt. +rep_robj_xfbk#:#rep_robj_xfbk_no_dim_selected#:#Sie haben keine Dimension ausgewählt, die hinzugefügt werden kann. +rep_robj_xfbk#:#rep_robj_xfbk_not_enough_feedbacks#:#Die eingestellte Mindestteilnehmerzahl von %d ist noch nicht erreicht. Bisher haben %d Teilnehmende ein Feedback abgegeben. +rep_robj_xfbk#:#rep_robj_xfbk_notdeleteable#:#Folgende Einträge befinden sich noch in Benutzung und dürfen darum nicht gelöscht werden. +rep_robj_xfbk#:#rep_robj_xfbk_obj_lp_mode_info_text#:#Der Status des/der Benutzer*in wird automatisch auf "Bestanden" gesetzt, wenn er/sie an dem Sternefeedback teilgenommen hat. +rep_robj_xfbk#:#rep_robj_xfbk_save_feedback#:#Das Feedback wurde erfolgreich gespeichert. +rep_robj_xfbk#:#rep_robj_xfbk_set_in_use#:#Es liegen bereits Bewertungen vor. Die Dimensionen dieses Sets können darum nicht mehr geändert werden. +rep_robj_xfbk#:#rep_robj_xfbk_settings_online_info#:#Nur wenn die Bewertung online geschaltet ist, können Benutzer*innen daran teilnehmen. +rep_robj_xfbk#:#rep_robj_xfbk_xfbk_view_evaluation#:#Der Benutzer darf die Auswertung einsehen. +rep_robj_xmat#:#rep_robj_xmat_selection#:#Individuelle Einstellungen für dieses Training +rep_robj_xpay#:#rep_robj_xpay_live_key#:#Live-Schlüssel +rep_robj_xpay#:#rep_robj_xpay_missing_live_key#:#Bitte tragen Sie einen Live-Schlüssel ein. +rep_robj_xpay#:#rep_robj_xpay_not_below_course#:#Dieses Objekt liegt nicht unterhalb eines Trainings und ist deshalb in seiner Funktionalität eingeschränkt. +rep_robj_xpay#:#rep_robj_xpay_placeholder_desc_cancellation_fee#:#Effektive Stornogebühr für das jeweilige Training in EUR +rep_robj_xpay#:#rep_robj_xpay_settings_saved#:#Die Einstellungen wurden erfolgreich gespeichert. +rep_robj_xpay#:#rep_robj_xpay_tab_provider#:#Provider-Einstellungen +rep_robj_xpay#:#rep_robj_xpay_test_key#:#Test-Schlüssel +rep_robj_xpfr#:#rep_robj_xpfr_approval_pending#:#wartend auf Genehmigung +rep_robj_xpfr#:#rep_robj_xpfr_filteroption_unassigned_to_orgu#:#Benutzerkonten ohne Organisationseinheit +rep_robj_xpfr#:#rep_robj_xpfr_invisible_course_topics_info#:#Trainings mit einem dieser Schlagwörter werden nicht angezeigt. +rep_robj_xpfr#:#rep_robj_xpfr_invisible_tags_info#:#Trainings mit einem dieser Schlagwörter werden nicht angezeigt. +rep_robj_xpfr#:#rep_robj_xpfr_sum_idd_achieved#:#Weiterbildungszeit (bisher gesammelt) +rep_robj_xpfr#:#rep_robj_xpfr_sum_idd_forecast#:#Weiterbildungszeit (bereits gebucht) +rep_robj_xpfr#:#rep_robj_xpfr_update#:#Aktualisieren +rep_robj_xpfr#:#rep_robj_xpfr_view_all_users#:#Alle Benutzerkonten/Organisationseinheiten einsehen +rep_robj_xpfr#:#rep_robj_xpfr_xpfr_add#:#Zahlungsströme hinzufügen +rep_robj_xpfr#:#rep_robj_xpfr_xpfr_new#:#Neuen Zahlungsströme-Report anlegen +rep_robj_xpfr#:#rep_robj_xpfr_xpfr_view_all_users#:#Alle Benutzerkonten/Organisationseinheiten einsehen +rep_robj_xtda#:#rep_robj_xtda_idd_learning_time#:#Weiterbildungszeit +rep_robj_xtda#:#rep_robj_xtda_with_idd#:#mit Zeiteinheiten +rep_robj_xtda#:#rep_robj_xtda_without_idd#:#ohne Zeiteinheiten +rep_robj_xtdr#:#rep_robj_xtdr_sum_idd#:#Generierte Weiterbildungszeit +rep_robj_xtdr#:#rep_robj_xtdr_with_idd#:#mit Zeiteinheiten +rep_robj_xtdr#:#rep_robj_xtdr_without_idd#:#ohne Zeiteinheiten +rep_robj_xtrs#:#rep_robj_xtrs_currently_running_approval_request#:#Für dieses Training liegt bereits eine Genehmigungsanfrage von Ihnen vor. +rep_robj_xtrs#:#rep_robj_xtrs_hidden_tags_byline#:#Die ausgewählten Schlagwörter und ihre Synonyme stehen in der Trainingssuche nicht zu Auswahl. Trainings mit diesen Schlagwörtern werden aber weiterhin angezeigt. +rep_robj_xtrs#:#rep_robj_xtrs_idd_learning_time#:#Weiterbildungszeit +rep_robj_xtrs#:#rep_robj_xtrs_idd_relevant#:#Nur weiterbildungszeit-relevante Trainings +rep_robj_xtrs#:#rep_robj_xtrs_is_recommendation_allowed#:#Training empfehlen aktiv +rep_robj_xtrs#:#rep_robj_xtrs_settings_saved#:#Die Einstellungen wurden gespeichert. +rep_robj_xtrs#:#rep_robj_xtrs_xtrs_visible#:#Anzeigen: Trainingssuche ist sichtbar +rep_robj_xccu#:#rep_robj_xccu_action_move#:#Trainings verschieben +rep_robj_xccu#:#rep_robj_xccu_decision#:#Trainings +rep_robj_xccu#:#rep_robj_xccu_filter_delete#:#Training zu löschen +rep_robj_xccu#:#rep_robj_xccu_filter_type#:#Trainingstyp +rep_robj_xccu#:#rep_robj_xccu_move_crss#:#Folgende Trainings sollen verschoben werden: +rep_robj_xccu#:#rep_robj_xccu_nothing_selected#:#Sie haben kein Training für diese Aktion ausgewählt. +rep_robj_xccu#:#rep_robj_xccu_obj_xccu#:#Löschvorbereitung für Trainings +rep_robj_xccu#:#rep_robj_xccu_objs_xccu#:#Löschvorbereitung für Trainings +rep_robj_xccu#:#rep_robj_xccu_objs_xccu_duplicate#:#Löschvorbereitung für Trainings kopieren +rep_robj_xccu#:#rep_robj_xccu_title#:#Trainingstitel +rep_robj_xccu#:#rep_robj_xccu_trainings_moved#:#Alle ausgewählten Trainings wurden erfolgreich verschoben. +rep_robj_xccu#:#rep_robj_xccu_trainings_to_decide#:#Trainings +rep_robj_xccu#:#rep_robj_xccu_type#:#Trainingstyp +rep_robj_xccu#:#rep_robj_xccu_xccu_new#:#Neue Löschvorbereitung für Trainings anlegen +rep_robj_xccu#:#rep_robj_xccu_xccu_read#:#Löschvorbereitung für Trainings lesen +rep_robj_xccu#:#rep_robj_xccu_xccu_visible#:#Löschvorbereitung für Trainings anzeigen +rep_robj_xccu#:#rep_robj_xccu_xccu_write#:#Löschvorbereitung für Trainings bearbeiten +rep_robj_xubk#:#rep_robj_xubk_local_evaluation_info#:#Es werden nur Trainings unterhalb der Kategorie berücksichtigt. +rep_robj_xubk#:#rep_robj_xubk_recommendation_allowed#:#Training empfehlen aktiv +rep_robj_xubk#:#rep_robj_xubk_successful_saved#:#Die Einstellungen wurden erfolgreich gespeichert. +rep_robj_xubk#:#rep_robj_xubk_superior_view#:#Ansicht Vorgesetzte +rep_robj_xubk#:#rep_robj_xubk_xubk_new#:#Buchungen von Benutzern hinzufügen +rep_robj_xwbm#:#rep_robj_xwbm_agreement_text#:#Hiermit erteile ich die %s zur Eintragung von Weiterbildungszeiten und -maßnahmen in die Weiterbildungsdatenbank von gut beraten. +rep_robj_xwbm#:#rep_robj_xwbm_idd_time#:#Weiterbildungszeit +rep_robj_xwbm#:#rep_robj_xwbm_learning_time#:#Weiterbildungszeit +rep_robj_xwbm#:#rep_robj_xwbm_positive_agreement#:#Sie haben der Eintragung von Weiterbildungszeiten und -maßnahmen in die Weiterbildungsdatenbank zugestimmt. +rep_robj_xwbr#:#rep_robj_xwbr_book_from_course#:#Buchung von Trainingsmitgliedern +rep_robj_xwbr#:#rep_robj_xwbr_book_member_from_kurs#:#Teilnehmende aus Training aktualisieren +rep_robj_xwbr#:#rep_robj_xwbr_cat_create_xwbr#:#Online-Seminar anlegen +rep_robj_xwbr#:#rep_robj_xwbr_confirm_finish#:#Sind Sie sich sicher, dass Sie dieses Online-Seminar abschließen wollen? +rep_robj_xwbr#:#rep_robj_xwbr_course_admin#:#Trainingsadministrator +rep_robj_xwbr#:#rep_robj_xwbr_create_xwbr#:#Online-Seminar anlegen +rep_robj_xwbr#:#rep_robj_xwbr_crs_create_xwbr#:#Online-Seminar anlegen +rep_robj_xwbr#:#rep_robj_xwbr_crs_user_booked#:#Der/die Teilnehmende des Trainings wurden erfolgreich aktualisiert. +rep_robj_xwbr#:#rep_robj_xwbr_delete_csn#:#CSN-Liste entfernen +rep_robj_xwbr#:#rep_robj_xwbr_delete_saba#:#SABA-Liste entfernen +rep_robj_xwbr#:#rep_robj_xwbr_delete_user#:#Benutzerkonto löschen +rep_robj_xwbr#:#rep_robj_xwbr_download_new_csn#:#Teilnehmende exportieren +rep_robj_xwbr#:#rep_robj_xwbr_download_new_generic#:#Teilnehmende exportieren +rep_robj_xwbr#:#rep_robj_xwbr_fold_create_xwbr#:#Online-Seminar anlegen +rep_robj_xwbr#:#rep_robj_xwbr_grp_create_xwbr#:#Online-Seminar anlegen +rep_robj_xwbr#:#rep_robj_xwbr_interval_info#:#Intervall an Tagen, in dem der Cron-Job die einzelnen Online-Seminare überprüft. +rep_robj_xwbr#:#rep_robj_xwbr_list_required#:#Das Online-Seminar konnte nicht abgeschlossen werden, da keine Log-Datei hochgeladen wurde. +rep_robj_xwbr#:#rep_robj_xwbr_no_booking#:#Der/die Benutzer*in konnte nicht gebucht werden, da er/sie bereits teilnimmt. +rep_robj_xwbr#:#rep_robj_xwbr_not_finalized_title#:#Reminder nicht finalisiertes Online-Seminare +rep_robj_xwbr#:#rep_robj_xwbr_obj_lp_mode_info_text#:#Der Status des/der Benutzer*in wird automatisch auf "Bestanden" gesetzt, wenn er/sie mindestens die in den Einstellungen definierte Zeit anwesend war. +rep_robj_xwbr#:#rep_robj_xwbr_obj_lp_mode_text#:#Online-Seminar Teilnahme +rep_robj_xwbr#:#rep_robj_xwbr_obj_xwbr#:#Online-Seminar +rep_robj_xwbr#:#rep_robj_xwbr_obj_xwbr_duplicate#:#Online-Seminar kopieren +rep_robj_xwbr#:#rep_robj_xwbr_objs_xwbr#:#Online-Seminare +rep_robj_xwbr#:#rep_robj_xwbr_objs_xwbr_duplicate#:#Online-Seminar kopieren +rep_robj_xwbr#:#rep_robj_xwbr_online_seminar#:#Online-Seminar +rep_robj_xwbr#:#rep_robj_xwbr_onlineseminar#:#Online-Seminar +rep_robj_xwbr#:#rep_robj_xwbr_onlineseminar_finished#:#Das Online-Seminar ist abgeschlossen. +rep_robj_xwbr#:#rep_robj_xwbr_placeholder_desc_link#:#Link zum Online-Seminar +rep_robj_xwbr#:#rep_robj_xwbr_placeholder_desc_login_trainer#:#Anmeldename des Trainers +rep_robj_xwbr#:#rep_robj_xwbr_placeholder_desc_password#:#Passwort (für Teilnehmende) +rep_robj_xwbr#:#rep_robj_xwbr_placeholder_desc_password_trainer#:#Passwort des Referenten +rep_robj_xwbr#:#rep_robj_xwbr_placeholder_desc_pin#:#PIN (bei Online-Seminartyp CSN) +rep_robj_xwbr#:#rep_robj_xwbr_properties_saved#:#Die Einstellungen wurden erfolgreich gespeichert. +rep_robj_xwbr#:#rep_robj_xwbr_recipient_info#:#Wenn kein*e Trainer*in hinterlegt ist, wird die Mail an die Trainingsadministrator*innen gesendet. +rep_robj_xwbr#:#rep_robj_xwbr_reminder#:#Reminder nicht finalisiertes Online-Seminare +rep_robj_xwbr#:#rep_robj_xwbr_required_minutes_info#:#Geben Sie hier an, wie viele Minuten der/die Benutzer*in im Online-Seminar verweilen muss. +rep_robj_xwbr#:#rep_robj_xwbr_root_create_xwbr#:#Online-Seminar anlegen +rep_robj_xwbr#:#rep_robj_xwbr_saba_upload_required#:#SABA-Log-Datei verpflichtend +rep_robj_xwbr#:#rep_robj_xwbr_saba_upload_required_info#:#Die SABA-Log-Datei ist beim Abschließen des Online-Seminars verpflichtend. +rep_robj_xwbr#:#rep_robj_xwbr_search_no_selection#:#Es wurde kein*e Benutzer*in ausgewählt. +rep_robj_xwbr#:#rep_robj_xwbr_should_be_deleted#:#Sollen die Benutzer*innen wirklich entfernt werden? +rep_robj_xwbr#:#rep_robj_xwbr_successful_finished#:#Das Online-Seminar wurde abgeschlossen. +rep_robj_xwbr#:#rep_robj_xwbr_to_online_seminar_settings#:#Einstellungen des Online-Seminars +rep_robj_xwbr#:#rep_robj_xwbr_to_online_seminar_url#:#Zum Online-Seminar +rep_robj_xwbr#:#rep_robj_xwbr_trainer#:#Referent +rep_robj_xwbr#:#rep_robj_xwbr_tutor_login#:#Anmeldename des Referenten +rep_robj_xwbr#:#rep_robj_xwbr_tutor_password#:#Referenten-Passwort +rep_robj_xwbr#:#rep_robj_xwbr_upload_required#:#CSN-Log-Datei verpflichtend +rep_robj_xwbr#:#rep_robj_xwbr_upload_required_info#:#Die CSN-Log Datei ist beim Abschließen des Online-Seminars verpflichtend. +rep_robj_xwbr#:#rep_robj_xwbr_user_booked#:#Der/die Benutzer*in wurde erfolgreich hinzugefügt. +rep_robj_xwbr#:#rep_robj_xwbr_user_was_booked#:#Der/die Benutzer*in ist bereits Teilnehmer*in. +rep_robj_xwbr#:#rep_robj_xwbr_users_set_not_participated#:#Der Teilnahmestatus für den/die Benutzer*in wurde auf "Nicht teilgenommen" gesetzt. +rep_robj_xwbr#:#rep_robj_xwbr_users_set_participated#:#Der Teilnahmestatus für wurde für den/die Benutzer*in auf "Teilgenommen" gesetzt. +rep_robj_xwbr#:#rep_robj_xwbr_vc#:#Online-Seminartyp +rep_robj_xwbr#:#rep_robj_xwbr_vc_type#:#Online-Seminartyp +rep_robj_xwbr#:#rep_robj_xwbr_xwbr_copy#:#Kopieren: Online-Seminar kopieren +rep_robj_xwbr#:#rep_robj_xwbr_xwbr_delete#:#Löschen: Online-Seminar verschieben oder löschen +rep_robj_xwbr#:#rep_robj_xwbr_xwbr_new#:#Online-Seminar hinzufügen +rep_robj_xwbr#:#rep_robj_xwbr_xwbr_read#:#Lesezugriff: Online-Seminar lesen +rep_robj_xwbr#:#rep_robj_xwbr_xwbr_visible#:#Anzeigen: Online-Seminare sind sichtbar und können genutzt werden +rep_robj_xwbr#:#rep_robj_xwbr_xwbr_write#:#Einstellungen bearbeiten: Einstellungen des Online-Seminares bearbeiten +sahs#:#sahs_activate_expert_mode_info#:#In diesem Modus können Sie direkt die Sequencing-Informationen des SCORM-Packages editieren. Achtung: Das System prüft dabei nicht Ihre Eingaben auf Gültigkeit. +sahs#:#sahs_authoring_mode_info#:#Die SCORM-ZIP-Datei muss mit dem System-SCORM-Editor erstellt worden sein und als SCORM 1.2/2004-Package exportiert worden sein. +sahs#:#sahs_mail_context_lp_info#:#Für Mails an Teilnehmende aus den Lernfortschrittsansichten eines SCORM-Moduls +sahs#:#sahs_std_sequencing_info#:#Standard-Sequencing Verhalten benutzen (empfohlen). +scormdebug#:#cmi.total_time#:#Summe aller kumulierter Session-Zeiten des SCO im derzeitigen Lernversuch +scormdebug#:#i_gray#:#grau: vom System korrigierter Fehler +scormtrac#:#tracinteractionuser#:#Teilnehmerbezogener Report zum Kapitel mit Auswertung der Kapitel-Aufgaben +scormtrac#:#user_id#:#ID des cate-Benutzerkontos +search#:#lucene_prefix_wildcard_info#:#Erlaubt die Nutzung von Platzhaltern auch am Beginn eines Suchbegriffs: "*ate" findet "cate" +search#:#no_valid_file_coding#:#Die Datei hat nicht die geforderte Kodierung (UTF-8). +search#:#no_valid_file_selected#:#Sie haben eine ungültige Datei ausgewählt. +search#:#search_add_members_from_container_crs#:#Benutzer aus aktuellem Training hinzufügen +search#:#search_crs_title#:#Trainingsname +search#:#search_err_user_not_exist#:#Es konnte kein*e entsprechende*r Benutzer*in gefunden werden. +search#:#search_exact_file#:#Exakte Übereinstimmung der Suchbegriffe +search#:#search_exact_file_info#:#Es werden nur Benutzerkonten gefunden, bei denen der Feldinhalt exakt mit dem Inhalt einer Zeile in der Datei übereinstimmt. +search#:#search_file#:#Datei +search#:#search_file_info#:#Bitte nur Dateien mit der Kodierung UTF-8 verwenden. Je gesuchtem Benutzerkonto muss eine separate Zeile vorliegen. Damit Benutzerkonten gefunden werden, muss in einer Zeile der Datei wenigstens ein Bestandteil der Benutzerdatenfelder Anmeldename, Vor-/Nachname oder Mail-Adresse stehen. +search#:#search_for_authority_over#:#Nach Autorität per Position suchen +search#:#search_for_authority_over_pos#:#Autorität als +search#:#search_for_crs_members#:#Nach Trainings suchen +search#:#search_for_orgu_members_orgu#:#Organisationseinheit +search#:#search_for_orgu_members_recursive#:#Darunterliegende einbeziehen? +search#:#search_for_users#:#Nach Benutzerkonten suchen +search#:#search_from_file_upload#:#Aus Datei suchen +search#:#search_full_info#:#Diese Suchart benutzt einen Index, um in großen Datenmengen zu suchen. +search#:#search_like_info#:#Erlaubt die Suche in der cate-Datenbank ohne Zusatzsoftware. Der Inhalt von Dateien (z. B. PDFs oder HTML-Lernmodule) wird nicht erfasst und deshalb auch nicht als Suchergebnis angezeigt. +search#:#search_show_inactive_user#:#Inaktive Benutzerkonten anzeigen +search#:#search_show_inactive_user_info#:#In der Benutzersuche werden auch Benutzer angezeigt, deren Konto nicht aktiv ist. +search#:#search_show_limited_user#:#Zeitlich begrenzte Benutzerkonten anzeigen +search#:#search_show_limited_user_info#:#In der Benutzersuche werden auch Benutzerkonten mit zeitlichem begrenztem Zugang angezeigt, die entweder noch nicht oder nicht mehr auf das System zugreifen können. +search#:#search_users#:#Benutzerkonten suchen +sess#:#event_days_offset#:#Veranstaltungstag +sess#:#event_end_time#:#Endzeit +sess#:#event_planer#:#Datum/Uhrzeit +sess#:#event_relativ_to_crs_date#:#Relativ zum Veranstaltungszeitraum +sess#:#event_start_time#:#Startzeit +sess#:#event_static_date#:#Festes Datum +sess#:#sess_no_tutor_select#:#Es wurde kein Referent ausgewählt. +sess#:#il_sess_participant#:#Terminteilnehmer +sess#:#mail_sess_roles#:#Verschicke Mail an folgende Rollen des Termins +sess#:#objs_crs_role#:#Trainingsrollen +sess#:#preview_crs_title#:#Beispieltraining +sess#:#send_mail_participants#:#Alle Teilnehmende des Termins +sess#:#sess_accept_request#:#Zum Termin zulassen +sess#:#sess_copy#:#Termin kopieren +sess#:#sess_import#:#Termin importieren +sess#:#sess_lp_preset_info#:#Lernfortschritt für alle anzulegenden Termine aktivieren +sess#:#sess_mail_admins_only#:#Nur für Administratoren des umgebenden Trainings-/Gruppenobjekts +sess#:#sess_mail_admins_only_info#:#Nur Administrator*innen des umgebenden Trainings-/Gruppenobjekts können die Funktion "Mail an Teilnehmende" nutzen. +sess#:#sess_mail_all#:#Für alle Teilnehmenden +sess#:#sess_mail_all_info#:#Alle Teilnehmer können die Funktion "Mail an Teilnehmende" im Reiter "Teilnehmer" nutzen. +sess#:#seq_endsession#:#Die aktuelle Trainingssitzung wurde beendet. +sess#:#sess_mail_context_participant_info#:#Freitext-Mails aus den Mitglieder- und Lernfortschrittsansichten eines Termins +sess#:#sess_mail_context_participant_title#:#Termin: Freitext-Mail +sess#:#sess_mail_permanent_link#:#Wählen Sie den folgenden Link, um auf den Inhalt des Termins zuzugreifen: +sess#:#sess_mail_permanent_link_participants#:#Wählen Sie den folgenden Link, um auf den Inhalt des Termins zuzugreifen: +sess#:#sess_mail_sub_acc_bod#:#Sie wurden für die Teilnahme am Termin "%s" zugelassen. +sess#:#sess_mail_sub_acc_sub#:#Teilnahme am Termin "%s" +sess#:#sess_mail_sub_dec_bod#:#Ihr Antrag auf Teilnahme an dem Termin "%s" ist abgelehnt worden. +sess#:#sess_mail_sub_dec_sub#:#Ablehnung der Teilnahme am Termin "%s" +sess#:#sess_mail_type#:#Mail an Teilnehmende +sess#:#sess_mem_tbl_header#:#Terminteilnehmer +sess#:#sess_member_administration#:#Teilnahmeverwaltung +sess#:#sess_members_print_title#:#Terminteilnehmer +sess#:#sess_msg_applicants_assigned#:#Der/die Benutzer*in wurde für den Termin angemeldet. +sess#:#sess_notification_option_inherit_info#:#Nutze die Einstellungen des übergeordneten Objekts (bspw. Einstellungen von Training oder Gruppe) für Mitglieder dieser Sitzung. +sess#:#sess_notification_option_manual_info#:#Empfänger*innen für Benachrichtigungen müssen im Reiter "Terminteilnehmer verwalten" manuell gesetzt werden. +sess#:#sess_open#:#Termin öffnen +sess#:#sess_participation_refused_info#:#Ihre Teilnahme an diesem Termin wurde abgesagt. +sess#:#sess_reg_cannot_participate_info#:#Benutzer*innen haben auf der "Info-Seite" die Möglichkeit, ihre Teilnahme abzusagen. +sess#:#sess_reg_direct_info#:#Benutzer*innen müssen auf „Anmelden“ klicken, wenn Sie an diesem Termin teilnehmen möchten. +sess#:#sess_reg_disabled#:#Keine Anmeldung erforderlich +sess#:#sess_reg_max_members_info#:#Ist die maximale Teilnehmerzahl erreicht, ist eine Anmeldung nicht mehr möglich. +sess#:#sess_reg_max_members_short#:#Begrenzte Teilnehmerzahl +sess#:#sess_reg_max_users_exceeded#:#Eine Anmeldung ist nicht möglich, da die maximale Teilnehmerzahl für diesen Termin überschritten wurde. +sess#:#sess_reg_max_users_exceeded_wl#:#Die maximale Teilnehmerzahl für diesen Termin ist überschritten. Sie können sich jedoch in die Warteliste eintragen. +sess#:#sess_reg_request_info#:#Eine Teilnahme an dem Termin erfordert die Zustimmung durch die Administrator*innen des umgebenden Trainings-/Gruppenobjekts. +sess#:#sess_reg_tutor_info#:#Die Anmeldung durch Benutzer*innen ist inaktiv. Lediglich Administrator*innen können Benutzer*innen anmelden. +sess#:#sess_reg_waiting_list_autofill_info#:#Teilnehmende rücken automatisch bei Stornierungen von der Warteliste nach. Dies sollte nicht in Verbindung mit dem Anmeldeverfahren "Teilnahme beantragen" benutzt werden, da die Bestätigung so umgangen wird. +sess#:#sess_reg_waiting_list_no_autofill_info#:#Ist die maximale Teilnehmeranzahl erreicht, können sich weitere Benutzer*innen auf eine Warteliste setzen lassen. +sess#:#sess_registered_confirm#:#Sie wurden für den Termin angemeldet. Allerdings muss Ihr Antrag noch von den Administrator*innen des umgebenden Trainings-/Gruppenobjekts bestätigt werden. Sie werden benachrichtigt sobald dies erfolgt ist. +sess#:#sess_registration_notification_info#:#Zeigt im Reiter "Terminteilnehmer verwalten" eine Spalte an, um Benutzer*innen auszuwählen, die über neue oder ausscheidende Teilnehmende benachrichtigt werden. +sess#:#sess_show_participants_info#:#Alle Teilnehmenden können im Reiter "Teilnehmer" die Teilnehmergalerie einsehen. +sess#:#sess_title#:#Titel des Termins +sess#:#sess_users_added#:#Die Benutzer*innen wurden für den Termin angemeldet. +sess#:#sess_users_already_assigned#:#Die Benutzer*innen sind bereits für den Termin angemeldet. +sess#:#sess_users_removed_from_list#:#Die ausgewählten Benutzer*innen wurden aus der Warteliste ausgetragen. +skmg#:#skmg_allow_local_profiles_info#:#Nutzer mit dem Recht 'Einstellungen bearbeiten' in Trainings und Gruppen können lokale Kompetenzprofile erstellen und dabei global definierte Kompetenzen verwenden. +skmg#:#skmg_cont_profiles_info#:#In dieser Ansicht können Sie die Kompetenzprofile mit Kompetenzeinträgen auswählen, die im Zusammenhang mit dem derzeit geöffneten Objekt (Training/Gruppe) stehen. Um zu der globalen Ansicht mit allen Ihnen zugewiesenen Kompetenzprofilen und sämtlichen Kompetenzeinträgen zu gelangen, klicken Sie auf den unten stehenden Link. +style#:#adapt_icon_description#:#Passe die Icon-Farbe oder das Icon an. +style#:#adapt_icons#:#Anpassung der Icon-Farben +style#:#cant_delete_if_users_assigned#:#Styles können nicht gelöscht werden, solange Benutzer*innen ihnen zugewiesen sind. +style#:#enable_system_styles_management_no_write_perm#:#System-Styles-Management ist aktiviert. Das System hat aber keinen Schreibzugriff auf das Customizing/global/skin Verzeichnis. Es können deshalb keine neuen Styles erstellt/editiert werden. +style#:#less_compile_failed#:#Die less-Datei konnte nicht kompiliert werden. Lessc muss dafür installiert und der Pfad im Setup richtig gesetzt sein. +style#:#less_variable_empty#:#Für diese Variable wurde kein Wert gesetzt. Der Wert aus der variables.less wurde nun geladen. Bitte überprüfen Sie dieses Feld, bevor Sie kompilieren. +style#:#less_variables_empty_might_have_changed#:#less-Variablen ohne Wert waren im Formular enthalten. Die Ursache kann sein, dass die variables.less Datei seit dem Laden dieses Formulars geändert wurde. Die leeren Variablen wurden mit den Werten aus der variables.less-Datei ersetzt und markiert. Bitte überprüfen Sie diese Werte, bevor Sie kompilieren und somit auch die Werte im Formular in die variables.less-Datei schreiben. +style#:#select_icon#:#Selektiertes Icon +style#:#sty_move_user_styles#:#Stylesheet der Benutzerkonten ändern +style#:#style_page_layout_module_learning_module#:#cate-Lernmodul +style#:#sub_style_id_description#:#Die Sub-Style-ID wird für die betreffenden css- und less-Dateien verwendet. Diese befinden sich innerhalb des betreffenden Skin-Ordners. Die Sub-Style-ID darf sich nur aus Buchstaben, Nummern sowie Bindestrichen zusammensetzen. +style#:#system_style_activation_description#:#Aktive System-Styles können bestimmten Benutzer*innen zugewiesen, oder durch diese ausgewählt werden wenn die betreffende Einstellung (Benutzerverwaltung > Einstellungen > Standardfelder > Standard-Skin/-Style) aktiviert ist. +style#:#system_style_default_description#:#Wenn aktiviert, ist dieser System-Style als Standard festgelegt. Der Standard-System-Style wird verwendet, sofern der/die Benutzer*in noch keinen eigenen Style zugewiesen bekommen hat oder nicht eingeloggt ist. +survey#:#adm_no_special_users#:#Es sind keine speziellen Benutzer*innen definiert, die Umfragen mehrfach durchführen können. +survey#:#confirm_delete_single_user_data#:#Sind Sie sicher, dass Sie diese*n Teilnehmende*n entfernen wollen? Dies löscht alle Umfragedaten für die ausgewählten Teilnehmenden. +survey#:#evaluation_access#:#Zugriff der Teilnehmende auf die Ergebnisse +survey#:#evaluation_access_all#:#Alle registrierten Benutzer*innen können auf die Ergebnisse zugreifen. +survey#:#evaluation_access_off#:#Teilnehmende haben keinen Zugriff auf Ergebnisse +survey#:#evaluation_access_participants#:#Alle Teilnehmende der Umfrage haben Zugriff auf die Ergebnisse +survey#:#external_recipients_imported#:#Es wurden externe Empfänger*innen importiert. +survey#:#externalmails_info#:#Die Importdatei muss eine CSV-Datei sein. Die Spalten müssen durch ein Semikolon getrennt werden. Die erste Zeile muss die Spaltenüberschriften beinhalten. Die Datei muss mindestens eine Spalte mit der Spaltenüberschrift "email" für die externen Empfänger*innen beinhalten. +survey#:#externaltext_info#:#Der importierte Text muss in Zeilen und Spalten aufgeteilt sein. Spalten müssen per Semikolon getrennt sein. Die erste Zeile beinhaltet die Spaltentitel. Der Text muss mindestens einen Eintrag für die Mail-Adresse von dem/der Empfänger*in enthalten. +survey#:#filter_all_question_types#:#Alle Fragentypen +survey#:#invited_users#:#Ausgewählte Benutzerkonten +survey#:#mailaddresses_info#:#Tragen Sie hier eine kommagetrennte Liste der Empfänger*innen ein, an die eine Benachrichtigung über abgeschlossene Umfragen versendet werden soll. +survey#:#mailparticipantdata_info#:#Fügen Sie einen einleitenden Text hinzu, der vor den Ergebnisdaten der Teilnehmenden in die E-Mail eingetragen wird. +survey#:#mailparticipantdata_placeholder#:# Diese Platzhalter werden durch die entsprechenden Benutzerdaten ersetzt, wenn "Datenschutz" auf "Mit Namen" gesetzt ist. +survey#:#message_content_info#:#Geben Sie einen Benachrichtigungstext für das Versenden des Zugangscodes ein. Sie sollten die Platzhalter [code] (Zugangsschlüssel), [url] (die URL zu dieser Umfrage) verwenden und Platzhalter, die Sie in den Importdaten der Mail-Empfänger*innen verwendet haben: %s. Die Platzhalter werden mit den importierten Teilnehmerdaten ersetzt. +survey#:#metric_question_floating_point#:#Der angegebene Wert ist eine Fließkommazahl. Fließkommazahlen sind für diesen Fragentyp nicht erlaubt! +survey#:#metric_subtype_description_interval#:#Ein Merkmal heißt intervallskaliert, falls es lediglich die definierenden Eigenschaften eines quantitativen Merkmals erfüllt. Insbesondere müssen die Abstände (Differenzen) sinnvoll interpretierbar sein. Der Begriff dient lediglich zur Abgrenzung gegenüber Merkmalen, deren Ausprägungen zusätzlich weitere Eigenschaften aufweisen. Es ist wichtig zu betonen, dass die Skalen, die zur Messung eines intervallskalierten Merkmals verwendet werden, keinen natürlichen Nullpunkt besitzen müssen. Beispiele für intervallskalierte Merkmale sind z.B. die Jahre in Kalendern oder die Temperatur der Celsius-Skala. +survey#:#no_user_invited#:#Allen eingeladenen Benutzer*innen fehlen die notwendigen Rechte, um die Umfrage durchzuführen. Es wurde niemand eingeladen. +survey#:#please_enter_mail_code#:#Bitte verwenden Sie den Platzhalter für den Zugangsschlüssel [code]. +survey#:#question_not_checked#:#Sie müssen eine der angebotenen Antworten auswählen! +survey#:#question_type#:#Fragentyp +survey#:#questiontype#:#Fragentyp +survey#:#search_users#:#Benutzerkonten suchen +survey#:#survey_360_rater_message_content_registered#:#Inhalt (registrierte Benutzerkonten) +survey#:#survey_360_self_appraisee_info#:#Allen Benutzer*innen wird ein Link auf dem Reiter "Info" angezeigt. Über diesen Link können diese sich selbst als Feedback-Empfänger*innen für diese Umfrage eintragen. +survey#:#survey_360_self_raters_info#:#Feedback-Nehmer*innen wählen die Personen, welche ihnen eine Rückmeldung geben sollen, selbst aus. Sie laden diese Personen auch selbstständig ein. +survey#:#survey_access_codes_info#:#Benutzer*innen erhalten Zugang zur Umfrage, indem sie dem Reiter "Info" einen Zugangsschlüssel eingeben. Diese Zugangsschlüssel werden im gleichnamigen Unterreiter im Reiter 'Teilnehmer' erzeugt. +survey#:#survey_activate_skill_service_info#:#Es wird ein weiterer Reiter "Kompetenzen" eingeblendet. Hier werden zunächst den Fragen Kompetenzen zugeordnet, danach werden den Schwellenwerte für die Erreichung bestimmter Kompetenzausprägungen gesetzt. +survey#:#survey_calculate_sum_score_info#:#Berechnet die Summe aller Skalenpunkte von Single-Choice-, Multiple-Choice- und Matrixfragen je Teilnehmenden-Datensatz. Achtung: Wenn Teilnehmende solche Fragen überspringen, wird die gesammte Skalenpunktesumme nicht berechnet. +survey#:#survey_has_datasets_warning#:#Die Umfrage enthält bereits Teilnahmedatensätze. Sie können die Fragen erst wieder bearbeiten, wenn Sie alle Teilnahmedatensätze löschen. +survey#:#survey_has_datasets_warning_page_view#:#Die Umfrage enthält bereits Teilnahmedatensätze. Sie können die Fragen erst wieder bearbeiten, wenn Sie alle Teilnahmedatensätze löschen. +survey#:#survey_has_datasets_warning_page_view_link#:#Teilnahmedatensätze bearbeiten +survey#:#survey_introduction_info#:#Dieser Text wird dauerhaft auf dem Reiter "Info" angezeigt. +survey#:#survey_notification_finished_introduction#:#der/die folgende Teilnehmer*in hat die Umfrage beendet. +survey#:#survey_notification_target_group_parent_course#:#Alle Teilnehmer des übergeordneten Trainings/Gruppe, welche die Umfrage noch nicht abgeschlossen haben +survey#:#survey_notification_target_group_parent_course_inactive#:#Kein übergeordneter Training/Gruppe - keine Erinnerung möglich! +survey#:#survey_notification_tutor_body#:#die folgende Umfrage ist von allen Teilnehmenden beendet worden +survey#:#survey_notification_tutor_recipients#:#Referenten (Anmeldename[n]) +survey#:#survey_notification_tutor_recipients_invalid#:#Bitte geben Sie Benutzer*innen mit Schreibrecht an. +survey#:#survey_notification_tutor_setting#:#Eine E-Mail nachdem alle Teilnehmende beendet haben +survey#:#survey_notification_tutor_subject#:#Alle Teilnehmende haben die Umfrage "%s" beendet +survey#:#survey_reminder_cron#:#Benutzer an Teilnahme erinnern / Referenten Ergebnisse zusenden +survey#:#survey_results_anonymized_info#:#Im Reiter "Ergebnisse" werden die Namen der Teilnehmende durch Codes ersetzt. Benutzer*innen mit Zugang zu diesem Reiter können die Antworten keinem Namen zuordnen, sondern nur einem / einer Benutzer*in "iTXaF" (Beispiel). +survey#:#survey_results_personalized_info#:#Im Reiter "Ergebnisse" werden Teilnehmende namentlich gelistet und ihre Antworten angezeigt. Alle Benutzer*innen mit Zugang zu diesem Reiter können einsehen, wer welche Antworten gegeben hat. +survey#:#svy_activation_online_info#:#Nur wenn die Umfrage online ist, können Benutzer*innen an der Umfrage teilnehmen. +survey#:#svy_add_internal_user_info#:#Feedbackgeber benötigen ein Benutzerkonto für diese Installation. +survey#:#svy_anonymous_participants#:#Teilnahmeliste +survey#:#svy_anonymous_participants_info#:#Wenn aktiviert, kann eine Teilnahmeliste bei anonymen Umfragen erzeugt werden. +survey#:#svy_anonymous_participants_min#:#Mindestteilnehmerzahl +survey#:#svy_anonymous_participants_min_info#:#Die Anzeige der Liste erfolgt erst ab dieser Anzahl an Teilnehmer*innen. +survey#:#svy_anonymous_participants_svy#:#Teilnahmeliste +survey#:#svy_anonymous_participants_svy_info#:#Wenn aktiviert, ist eine Teilnahmeliste nach dem Enddatum verfügbar. +survey#:#svy_appraisses_cannot_be_raters#:#Benutzer*innen können sich nicht selbst als Feedback-Geber zuordnen. Nutzen Sie stattdessen die Option "Selbsteinschätzung" in den Einstellungen der Umfrage. +survey#:#svy_check_evaluation_access_introduction#:#Da diese Auswertung nur für Teilnehmende der Umfrage verfügbar ist, müssen Sie Ihren Zugangsschlüssel für die Umfrage angeben, um die Auswertung zu öffnen. +survey#:#svy_evaluation_access_all_info#:#Alle registrierten Benutzer*innen, welche Zugriff auf die Umfrage haben, können auch deren Ergebnisse einsehen. +survey#:#svy_evaluation_access_off_info#:#Nur Benutzer*innen, welche die Umfrage bearbeiten können (Recht "Einstellungen bearbeiten") haben Zugriff auf die Ergebnisse der Umfrage. +survey#:#svy_evaluation_access_participants_info#:#Alle Benutzer*innen, die an der Umfrage teilgenommen haben, können deren Ergebnisse einsehen nachdem sie die Umfrage abgeschlossen haben. +survey#:#svy_mail_context_reminder_info#:#Erinnert Benutzer, an einer Umfrage teilzunehmen +survey#:#svy_notification_tutor_results_info#:#Nach dem Ablauf des Enddatum wird eine E-Mail mit den detaillierten Umfrageergebnissen versendet. +survey#:#svy_result_mail_notification_info#:#Nach Beenden einer Umfrage werden die Antworten der Teilnehmende an die eingetragen Empfänger*innen gesendet. +survey#:#svy_results_mail_confirm_info#:#Teilnehmende können sich nach Beendigung der Umfrage eine Teilnahmebestätigung per E-Mail zusenden lassen. +survey#:#svy_results_view_own_info#:#Teilnehmende können sich eine Übersicht mit den eigenen Antworten anzeigen lassen, nachdem sie die Umfrage beendet haben. Sie können die Antworten nicht mehr ändern. +survey#:#svy_search_users#:#Benutzerkonten suchen +survey#:#svy_selected_user_data_deleted#:#Die Umfragedatensätze der ausgewählten Teilnehmende wurden erfolgreich gelöscht +survey#:#svy_skl_comp_assignm_not_supported#:#Die Zuordnung von Kompetenzen ist für diesen Fragentyp nicht möglich. +survey#:#users_invited#:#Es wurden %s Benutzer*innen eingeladen. +svy#:#svy_codes#:#Zugriffscodes +svy#:#svy_invite_participants#:#Teilnehmende einladen +svy#:#svy_remove_all_participants#:#Alle Teilnehmende entfernen +svy#:#svy_remove_participants#:#Teilnehmende entfernen +svy#:#svy_users_invited#:#Die Benutzer*innen wurden eingeladen. +taa#:#tad_active#:#Aktiv? +taa#:#tad_active_description#:#Dateien können nur von aktiven Zielen aus heruntergeladen werden. +taa#:#tad_cancel#:#Abbrechen +taa#:#tad_cannot_delete_target_files_present#:#Ziel kann nicht gelöscht werden, denn es sind Dateien für dieses Ziel vorhanden. +taa#:#tad_clean_files_title#:#Vom Download per Token erzeugte Dateien löschen +taa#:#tad_clean_files_description#:#Löscht Dateien, die durch Abfrage über Download per Token erzeugt wurden. +taa#:#tad_delete#:#Löschen +taa#:#tad_delete_confirm#:#Möchten Sie dieses Ziel wirklich löschen? +taa#:#tad_delete_target#:#Löschen +taa#:#tad_edit_target#:#Bearbeiten +taa#:#tad_edit_target_header#:#Ziel bearbeiten +taa#:#tad_file_date#:#Datum +taa#:#tad_file_name#:#Dateiname +taa#:#tad_file_target#:#Ziel +taa#:#tad_new_target#:#Neues Ziel +taa#:#tad_no_targetid_given#:#Keine ID übermittelt. +taa#:#tad_service#:#Dienst +taa#:#tad_service_description#:#Die Dateien sind diesem Dienst zugeordnet. +taa#:#tad_tab_files#:#Dateien +taa#:#tad_tab_logs#:#Log +taa#:#tad_tab_targets#:#Ziele +taa#:#tad_table_files#:#Dateien +taa#:#tad_table_logs#:#Log +taa#:#tad_table_targets#:#Ziele +taa#:#tad_target#:#Name +taa#:#tad_target_deleted#:#Ziel wurde gelöscht. +taa#:#tad_target_description#:#Bezeichnung des Ziels (frei wählbar) +taa#:#tad_target_updated#:#Ziel wurde gespeichert. +taa#:#tau_active#:#Aktiv? +taa#:#tau_active_description#:#Dateien können nur von aktiven Quellen aus hochgeladen werden. +taa#:#tau_cannot_delete_source_files_present#:#Quelle kann nicht gelöscht werden, denn es sind Dateien von dieser Quelle vorhanden. +taa#:#tau_delete_file#:#Löschen +taa#:#tau_delete_source#:#Löschen +taa#:#tau_edit_source#:#Bearbeiten +taa#:#tau_edit_source_header#:#Quelle bearbeiten +taa#:#tau_file_date#:#Datum +taa#:#tau_file_flag#:#Flag +taa#:#tau_file_name#:#Dateiname +taa#:#tau_file_resourceid#:#Resource-ID +taa#:#tau_file_size#:#Größe +taa#:#tau_file_source#:#Quelle +taa#:#tau_new_source#:#Neue Quelle +taa#:#tau_no_sourceid_given#:#Keine ID übermittelt. +taa#:#tau_service#:#Dienst +taa#:#tau_service_description#:#Die Dateien sind diesem Dienst zugeordnet. +taa#:#tau_source#:#Name +taa#:#tau_source_deleted#:#Quelle wurde gelöscht. +taa#:#tau_source_description#:#Bezeichnung der Quelle (frei wählbar) +taa#:#tau_source_updated#:#Quelle wurde gespeichert. +taa#:#tau_tab_files#:#Dateien +taa#:#tau_tab_logs#:#Log +taa#:#tau_tab_sources#:#Quellen +taa#:#tau_table_actions#:#Aktionen +taa#:#tau_table_files#:#Dateien +taa#:#tau_table_logs#:#Log +taa#:#tau_table_sources#:#Quellen +tms#:#abort#:#abbrechen +tms#:#aborted#:#Vorgang abgebrochen +tms#:#abu_aggregate_by_user#:#Nach Benutzern aggregiert +tms#:#abu_currently_valid_qualification#:#Aktuell gültige Qualifikation: +tms#:#abu_filter_all#:#Alle +tms#:#abu_filter_currently_valid_qualification#:#Aktuell gültige Qualifikation: +tms#:#abu_filter_no#:#Aktuell nicht gültig +tms#:#abu_filter_yes#:#Aktuell gültig +tms#:#abu_no#:#Nein +tms#:#abu_prg_assign_date#:#Hinzugefügt am +tms#:#abu_prg_expiry_date#:#Ablaufdatum der Qualifikation +tms#:#abu_prg_status_accredited#:#Akkreditiert +tms#:#abu_prg_status_completed#:#Abgeschlossen +tms#:#abu_prg_status_failed#:#Nicht bestanden +tms#:#abu_prg_status_in_progress#:#In Bearbeitung +tms#:#abu_prg_status_not_relevant#:#Nicht relevant +tms#:#abu_prg_validity#:#Gültigkeit der Qualifikation +tms#:#abu_yes#:#Ja +tms#:#April#:#April +tms#:#August#:#August +tms#:#available_slots#:#freie Plätze +tms#:#book_and_configure_payment#:#Verbindlich buchen mit Zahlungsinformation +tms#:#book_and_configure_payment_and_forward#:#Verbindlich buchen mit Zahlungsinformation und direkt ins Training +tms#:#book_course#:#Buchen +tms#:#book_waiting_confirm#:#Verbindlich auf Warteliste buchen +tms#:#book_waiting_for#:#Buchung auf Warteliste für %s +tms#:#book_waiting_with_approval_confirm#:#Buchen mit Genehmigung abschließen +tms#:#book_with_approval_confirm#:#Buchen (mit Genehmigung) +tms#:#booked_as_member#:#gebucht +tms#:#booked_on_waitinglist#:#gebucht auf Warteliste +tms#:#booked_user#:#Gebuchte Teilnehmende +tms#:#booking#:#Buchung +tms#:#booking_confirm#:#Verbindlich buchen +tms#:#booking_confirm_and_forward#:#Verbindlich buchen und direkt ins Training +tms#:#booking_confirm_with_approval#:#Verbindliche Buchungsanfrage stellen +tms#:#booking_for#:#Buchung für %s +tms#:#booking_not_available#:#Sie haben nicht die Berechtigung dieses Training zu buchen. In der „Trainingssuche“ finden Sie die für Sie verfügbaren Trainings. +tms#:#booking_not_possible#:#Ihre Buchung ist nicht möglich. +tms#:#booking_overview_description#:#Bitte prüfen Sie die Angaben und schließen Sie die Buchung ab. +tms#:#booking_request_created#:#Für das Training "%s" wurde eine Buchungsanfrage für %s gestellt. +tms#:#booking_waiting#:#Buchung auf Warteliste +tms#:#booking_waiting_with_approval_for#:#Mitarbeiter %s auf die Warteliste buchen (mit Genehmigung) +tms#:#booking_waiting_with_approve#:#Buchung auf Warteliste (mit Genehmigung) +tms#:#booking_with_approval#:#Buchung +tms#:#booking_with_approval_confirm#:#Verbindlich buchen +tms#:#booking_with_approval_for#:#Mitarbeiter %s buchen (mit Genehmigung) +tms#:#booking_with_approve#:#Buchung (mit Genehmigung) +tms#:#cancel_confirm#:#Verbindlich stornieren +tms#:#cancel_course#:#Training absagen +tms#:#cancel_overview_description#:#Bitte prüfen Sie die Angaben und schließen Sie die Stornierung ab. +tms#:#canceling#:#Stornierung +tms#:#canceling_for#:#Stornierung für %s +tms#:#canceling_for_waiting#:#Stornierung für %s (Wartelistenplatz) +tms#:#canceling_waiting#:#Stornierung (Wartelistenplatz) +tms#:#choose_course_template#:#Vorlage auswählen +tms#:#city#:#Ort +tms#:#context_recommendation#:#Trainingsempfehlung +tms#:#context_recommendation_desc#:#Empfehlung einer Trainingsteilnahme (manuell versendbar aus Bildungsbiografie oder Trainingssuche, falls dort aktiviert) +tms#:#course_creation_message#:#Derzeit werden folgende Trainings für Sie angelegt. Die Anlage wird einige Minuten dauern. In dieser Zeit können keine weiteren Trainings angelegt werden. Sobald der Vorgang abgeschlossen ist, werden Sie per E-Mail informiert. Das Training ist im Anschluss unter "Meine Trainingsorganisation" enthalten. +tms#:#course_creation_multi_message#:#Derzeit werden folgende Trainings für Sie angelegt. Die Anlage wird einige Minuten dauern. In dieser Zeit können weitere Trainings angelegt werden. +tms#:#course_has_allready_begun#:#Das Training hat bereits begonnen. Eine Buchung ist nicht mehr möglich. +tms#:#course_has_allready_begun_no_cancel#:#Das Training hat bereits begonnen. Eine Stornierung ist nicht mehr möglich. +tms#:#course_overbooked#:#Sie konnten leider nicht auf das Training gebucht werden, da dieser in der Zwischenzeit ausgebucht wurde. +tms#:#create_course#:#Training anlegen +tms#:#create_course_from_template#:#Training aus Vorlage erzeugen +tms#:#create_course_overview_description#:#Bitte prüfen Sie die Angaben und starten Sie die Anlage des Trainings. +tms#:#crs_affiliation#:#Zugehörigkeit +tms#:#crs_affiliation_to_prg#:#Zugehörigkeit zu Qualifizierungsprogrammen +tms#:#crs_language#:#Sprache +tms#:#crs_reject#:#Trainingsabsage +tms#:#crs_template#:#Vorlage +tms#:#current_open_approval#:#Genehmigungsverfahren für dieses Training bereits gestartet +tms#:#cutting_trainings#:#Folgendes, bereits gebuchte Training überschneidet sich mit dem Training: +tms#:#date#:#Datum +tms#:#December#:#Dezember +tms#:#deleted_crs_template#:#Gelöschte Trainingsvorlage (Obj-Id = %s, Ref-Id = %s) +tms#:#detail_information#:#Details +tms#:#duplicate_course_booked#:#Ein Training dieser Vorlage ist bereits gebucht und noch nicht beendet. Sie dürfen dieses Angebot daher nicht buchen. Sie können die Buchungen in der Übersicht ihrer gebuchten Trainings einsehen und dort ggf. Stornierungen vornehmen. +tms#:#duration#:#Zeitraum +tms#:#email_exists#:#Die E-Mail ist bereits vergeben. +tms#:#employees#:#Mitarbeiter +tms#:#February#:#Februar +tms#:#fee#:#Kosten +tms#:#filter#:#Erweiterte Suche +tms#:#filter_period_from#:#Von +tms#:#filter_period_to#:#Bis +tms#:#form_hours#:#Stunden +tms#:#form_minutes#:#Minuten +tms#:#form_seconds#:#Sekunden +tms#:#goals#:#Ziele und Nutzen +tms#:#header#:#Trainingssuche +tms#:#hide_breadcrumb#:#Navigation einschränken +tms#:#hide_breadcrumb_info#:#Mit dieser Einstellung wird die Navigation nur bis zum Kurs angezeigt. +tms#:#hide_menu_tree#:#Navigationsbaum ausblenden +tms#:#hide_menu_tree_info#:#Mit dieser Einstellung wird der Navigationsbaum für Benutzer*innen ausgeblendet. +tms#:#idd_relevant#:#Nur weiterbildungszeit-relevante Trainings +tms#:#info_can_storno#:#Hinweis: Über "Meine Trainings" können Sie eine Stornierung des bereits gebuchten Trainings durchführen. +tms#:#January#:#Januar +tms#:#July#:#Juli +tms#:#June#:#Juni +tms#:#location#:#Ort +tms#:#March#:#März +tms#:#max_member#:#maximale Teilnehmerzahl +tms#:#May#:#Mai +tms#:#member#:#Teilnehmer +tms#:#min_member#:#Mindestanzahl an Teilnehmenden +tms#:#msg_input_char_limit_max#:#Sie müssen die festgelegte Höchstzahl von Zeichen beachten. Ihr Beitrag ist zu lang. +tms#:#my_training_seach_options#:#Mein Angebot +tms#:#no_approvers_for_user#:#In der Organisationsstruktur sind keine übergeordneten Benutzer*innen mit der benötigten Position vorhanden. Die Buchungsanfrage kann nicht bearbeitet werden. +tms#:#no_detail_infos#:#Es liegen keine weiteren Informationen zu diesem Angebot vor. +tms#:#no_document_available#:#Das von Ihnen angeforderte Dokument ist nicht verfügbar. +tms#:#no_permissions_to_book#:#Sie haben keine Berechtigung dieses Training für sich oder eine*n andere*n Benutzer*in zu buchen. +tms#:#no_permissions_to_book_with_approval#:#Sie besitzen nicht das Recht, dieses Training für den/die Benutzer*in zu buchen. +tms#:#no_reject_possible#:#Ihre Teilnahme am Training konnte nicht abgesagt werden. +tms#:#no_reject_possible_because_booked#:#Absage nicht möglich, denn Sie sind bereits angemeldet. Um Ihre Buchung zu stornieren, gehen Sie bitte in die Übersicht Ihrer Buchungen. +tms#:#no_results#:#Keine Ergebnisse +tms#:#no_search_object_found#:#Sie haben keinen Zugriff auf die Trainingssuche. +tms#:#no_steps_available#:#Sie können dieses Training leider nicht buchen, da dieser ausgebucht ist. +tms#:#no_trainings_available#:#Derzeit stehen für Sie keine Trainings zur Buchung zur Verfügung. +tms#:#no_venue_selected#:#Da Sie keinen Veranstaltungsort ausgewählt haben, konnten die Eingaben zu den Details zum Veranstaltungsort nicht gespeichert werden. +tms#:#not_in_booking_period#:#Eine Buchung ist nicht möglich, da Sie sich außerhalb des Buchungszeitraums befinden. +tms#:#not_min_member#:#Nur Trainings anzeigen, deren Mindestteilnehmerzahl noch nicht erreicht wurde. +tms#:#November#:#November +tms#:#oclock#:#Uhr +tms#:#October#:#Oktober +tms#:#only_bookable#:#Nur buchbare Trainings +tms#:#overnights#:#Übernachtungstage (x) = Selbstzahler +tms#:#overview_header#:#Zusammenfassung +tms#:#period#:#Zeitplan +tms#:#pl_course_content_certificate#:#Inhalte des Trainings, die im Trainingssteckbrief angegeben sind +tms#:#pl_course_end_date#:#Enddatum des Trainings +tms#:#pl_course_start_date#:#Startdatum des Trainings +tms#:#pl_course_type#:#Trainingstyp +tms#:#pl_course_type_preview#:#Trainingstyp-Platzhalter +tms#:#pl_idd_learning_time#:#Weiterbildungszeit +tms#:#pl_idd_learning_time_preview#:#0,458333333333333 +tms#:#pl_idd_learning_time_user#:#Weiterbildungszeit des Benutzers +tms#:#pl_idd_learning_time_user_preview#:#0,440972222222222 +tms#:#placeholder_desc_crs_admin_firstname#:#Vorname des Admins am Training +tms#:#placeholder_desc_crs_admin_lastname#:#Nachname des Admins am Training +tms#:#placeholder_desc_crs_admin_mail#:#E-Mail des Admins am Training +tms#:#placeholder_desc_crs_admin_phone#:#Telefonnummer des Admins am Training +tms#:#placeholder_desc_crs_all_trainers#:#Vor- und Nachnamen aller Referenten am Training +tms#:#placeholder_desc_crs_booking_link#:#Link zur Trainingsbuchung +tms#:#placeholder_desc_crs_enddate#:#Enddatum des Trainings +tms#:#placeholder_desc_crs_important_information#:#Wichtige Informationen des Trainings +tms#:#placeholder_desc_crs_link#:#Link zum Training +tms#:#placeholder_desc_crs_members_count#:#Anzahl Teilnehmer (Referenten + Teilnehmer) +tms#:#placeholder_desc_crs_provider#:#Trainingsanbieter +tms#:#placeholder_desc_crs_schedule#:#Zeitplan des Trainings +tms#:#placeholder_desc_crs_startdate#:#Startdatum des Trainings +tms#:#placeholder_desc_crs_title#:#Trainingstitel +tms#:#placeholder_desc_crs_trainer_assignments#:#Die Einsatztage des Trainers, der diese Mail erhält, an diesem Training. +tms#:#placeholder_desc_crs_trainer_firstname#:#Vorname des Referenten am Training (Verwendung nur bei max. 1 gebuchten Referenten möglich) +tms#:#placeholder_desc_crs_trainer_lastname#:#Nachname des Referenten am Training (Verwendung nur bei max. 1 gebuchten Referenten möglich) +tms#:#placeholder_desc_crs_venue_additionalinfo#:#Zusätzliche Infos zum Veranstaltungsort +tms#:#placeholder_desc_crs_venuename#:#Name des Veranstaltungsorts +tms#:#placeholder_desc_current_user_email#:#Aktuelles Benutzerkonto, Mail +tms#:#placeholder_desc_current_user_firstName#:#Aktuelles Benutzerkonto, Vorname +tms#:#placeholder_desc_current_user_lastName#:#Aktuelles Benutzerkonto, Nachname +tms#:#placeholder_desc_current_user_login#:#Aktuelles Benutzerkonto, Login +tms#:#placeholder_desc_current_user_salutation#:#Aktuelles Benutzerkonto, Anrede +tms#:#placeholder_desc_current_user_title#:#Aktuelles Benutzerkonto, Titel (mit vorangestelltem Leerzeichen) +tms#:#placeholder_desc_ilias_client_name#:#Name der Instanz +tms#:#placeholder_desc_ilias_ilias_url#:#URL +tms#:#placeholder_desc_oac_reminder#:#Für Übernachtungsliste - wird nur bei Erinnerungen gesetzt. +tms#:#placeholder_desc_prg_desc#:#Beschreibung des Qualifizierungsprogramms +tms#:#placeholder_desc_prg_link#:#Link zum Studienprogramm +tms#:#placeholder_desc_prg_points#:#Benötigte Punkte am Qualifizierungsprogramm +tms#:#placeholder_desc_prg_title#:#Titel des Qualifizierungsprogramms +tms#:#placeholder_desc_target_user_email#:#Referenziertes Benutzerkonto, Mail +tms#:#placeholder_desc_target_user_firstName#:#Referenziertes Benutzerkonto, Vorname +tms#:#placeholder_desc_target_user_lastName#:#Referenziertes Benutzerkonto, Nachname +tms#:#placeholder_desc_target_user_login#:#Referenziertes Benutzerkonto, Login +tms#:#placeholder_desc_target_user_salutation#:#Referenziertes Benutzerkonto, Anrede +tms#:#placeholder_desc_target_user_title#:#Referenziertes Benutzerkonto, Titel (mit vorangestelltem Leerzeichen) +tms#:#placeholder_desc_user_firstName#:#Vorname des Benutzers / der Benutzerin +tms#:#placeholder_desc_user_lastName#:#Nachname des Benutzers / der Benutzerin +tms#:#placeholder_desc_user_login#:#Anmeldename +tms#:#placeholder_desc_user_salutation#:#Anrede des Benutzers / der Benutzerin +tms#:#placeholder_desc_user_title#:#Titel des Benutzers / der Benutzerin (mit vorangestelltem Leerzeichen) +tms#:#placeholder_desc_usrprg_completiondate#:#Aktuelles Abschlussdatum des Benutzers am Studienprogramm +tms#:#placeholder_desc_usrprg_deadline#:#Ende der Bearbeitungsfrist des Benutzers im Studienprogramm +tms#:#placeholder_desc_usrprg_expires#:#Ablauf der Qualifikation des Benutzers am Studienprogramm +tms#:#placeholder_desc_usrprg_points#:#Erworbene Punkte des Benutzers / der Benutzerin am Qualifizierungsprogramm +tms#:#placeholder_firstname_lastname_superior#:#Kommaseparierte Liste mit den Vor- und Nachnamen der Vorgesetzten eines Benutzers +tms#:#placeholder_mailsubject_oac_reminder#:#Aktualisierung: +tms#:#pls_login_and_continue#:#Bitte melden Sie sich an, um den Vorgang fortzusetzen. +tms#:#process_aborted#:#Der Vorgang wurde abgebrochen. +tms#:#provider#:#Anbieter +tms#:#quickfilter_all_months#:#alle Monate +tms#:#report_filter#:#Filter +tms#:#request_book#:#Buchungsanfrage +tms#:#room_type#:#Zimmerart +tms#:#s_by_name_asc#:#Name: aufsteigend +tms#:#s_by_name_desc#:#Name: absteigend +tms#:#s_city_asc#:#Ort: aufsteigend +tms#:#s_city_desc#:#Ort: absteigend +tms#:#s_period_asc#:#Zeitraum: aufsteigend +tms#:#s_period_desc#:#Zeitraum: absteigend +tms#:#s_title_asc#:#Titel: aufsteigend +tms#:#s_title_desc#:#Titel: absteigend +tms#:#search#:#Suchen +tms#:#send_recommendation#:#Training empfehlen +tms#:#September#:#September +tms#:#show_all#:#Alle anzeigen +tms#:#show_in_cockpit#:#In Cockpit anzeigen +tms#:#sorting#:#Sortierung +tms#:#stripe_booking_cancelled#:#Der Buchungsprozess wurde abgebrochen. +tms#:#successfully_decline#:#Ihre Teilnahme am Training wurde erfolgreich abgesagt. +tms#:#superior_book_waiting_with_approval_confirm#:#Buchen auf Warteliste (mit Genehmigung) abschließen +tms#:#superior_book_with_approval_confirm#:#Mitarbeiter buchen (mit Genehmigung) abschließen +tms#:#superior_duplicate_course_booked#:#Ein Training dieser Vorlage ist für %s bereits gebucht. Eine Buchung dieses Angebots ist daher nicht möglich. Über "Buchungen meiner Mitarbeiter" können Sie bereits gebuchte Trainings stornieren. +tms#:#t_course#:#Ansicht: Training +tms#:#t_user#:#Ansicht: Mitarbeiter +tms#:#target_group#:#Zielgruppe +tms#:#target_groups#:#Zielgruppen +tms#:#time_suffix#:#Uhr +tms#:#title#:#Titel +tms#:#title_booking_with_approval#:#Buchen mit Genehmigung für %s +tms#:#tms_filter_period_from#:#Anfang: +tms#:#tms_filter_period_to#:#Ende: +tms#:#to_course#:#Zum Training +tms#:#to_course_member_tab#:#Buchungen vornehmen +tms#:#to_login#:#Zum Login +tms#:#topic#:#Trainingsthema +tms#:#topics#:#Trainingsthemen +tms#:#trainer#:#Referent +tms#:#training_type#:#Trainingstyp +tms#:#tutor_assignment_period#:#Trainereinsatztage +tms#:#user_booked_on_course#:#Sie haben dieses Training bereits gebucht. +tms#:#user_booked_on_waiting#:#Sie sind bei diesem Training bereits auf der Warteliste. +tms#:#user_bookings#:#Buchungen +tms#:#user_not_booked_on_course#:#Sie haben dieses Training nicht gebucht. +tms#:#user_not_booked_on_waiting#:#Sie sind bei diesem Trainings nicht auf der Warteliste. +tms#:#usr_has_status_on_course_no_cancel#:#Sie können diese Buchung nicht mehr stornieren, da bereits eine Teilnahme erfasst wurde. Wenn Sie die Seite neu laden, verschwindet der Eintrag. +tms#:#venue#:#Veranstalter +tms#:#waiting_user#:#Teilnehmende auf Warteliste +tms#:#waitinglist#:#Warteliste +tms#:#weblink#:#Weblink +tos#:#tos_accept_usr_agreement_anonymous_intro#:#Bevor Sie zu cate wechseln, akzeptieren Sie die folgenden Nutzungsvereinbarungen. +tos#:#tos_account_reg_not_possible#:#Eine Selbstregistrierung ist aktuell nicht möglich, da in dieser Installation keine Benutzervereinbarung angeboten wird. Bitte kontaktieren Sie Ihre*n Systemadministrator*in für weitere Informationen. +tos#:#tos_crit_type_usr_country#:#Land des Benutzerkontos +tos#:#tos_crit_type_usr_global_role_info#:#Das Dokument muss akzeptiert werden, wenn ein*e Benutzer*in beim ersten Login in diese Rolle eingetragen ist. Eine nachträgliche Änderung der Rolle führt nicht automatisch zur Vorlage eines neuen Dokuments. +tos#:#tos_form_document_content_changed#:#Der Inhalt der hochgeladenen Datei wurde durch das System bereinigt. Bitte prüfen Sie das Ergebnis und laden Sie im Zweifel eine neue Datei hoch. +tos#:#tos_reevaluate_on_login_desc#:#Falls aktiviert, wird nach erfolgreicher Anmeldung über die Weboberfläche geprüft, ob ein ggf. bereits akzeptiertes Dokument keine Gültigkeit mehr hat, da sich die Vorlagekriterien des Benutzers / der Benutzerin geändert haben. Ist dies der Fall und kann das System ein neues Dokument finden, so muss der/die Benutzer*in dieses neu akzeptieren. +tos#:#tos_status_desc#:#Benutzer*innen werden zum Unterzeichnen der Nutzungsvereinbarung aufgefordert, bevor sie cate nutzen können. +tos#:#tos_withdrawal_usr_deletion#:#Löschung des cate-Benutzerkontos beim Widerruf +tos#:#tos_withdrawal_usr_deletion_info#:#Wird die Zustimmung zur Nutzungsvereinbarung widerrufen, erfolgt automatisch die Löschung des cate-Benutzerkontos. +trac#:#info_valid_request#:#Finden zwei Anfragen von einem / einer Benutzer*in innerhalb dieser Zeitspanne statt, so wird die entsprechende Zeitspanne als "aktiv" gewertet. +trac#:#trac_filter_has_status#:#Zeige auch Objekte mit Status "Noch nicht begonnen" +trac#:#trac_lp_learner_access_info#:#Wenn aktiviert, können Benutzer*innen ihren eigenen Lernfortschritt einsehen. +trac#:#trac_maxed_out_counter#:#Abgewiesene Benutzerkonten +trac#:#trac_mode_cmix_compl_or_passed_with_failed#:#Bearbeitet, wenn "completed" oder "passed" oder "satisfied" gesendet wurde; "failed" setzt den Lernfortschritt auf "Nicht bestanden". +trac#:#trac_mode_cmix_compl_with_failed#:#Bearbeitet, wenn "completed" gesendet wurde; "failed" setzt den Lernfortschritt auf "Nicht bestanden". +trac#:#trac_mode_cmix_completed#:#Bearbeitet, wenn "completed" gesendet wurde; "failed" setzt den Lernfortschritt auf "in Bearbeitung". +trac#:#trac_mode_cmix_completed_or_passed#:#Bearbeitet, wenn "completed" oder "passed" oder "satisfied" gesendet wurde; "failed" setzt den Lernfortschritt auf "in Bearbeitung". +trac#:#trac_mode_cmix_passed#:#Bearbeitet, wenn "passed" oder "satisfied" gesendet wurde; "failed" setzt den Lernfortschritt auf "in Bearbeitung". +trac#:#trac_mode_cmix_passed_with_failed#:#Bearbeitet, wenn "passed" oder "satisfied" gesendet wurde; "failed" setzt den Lernfortschritt auf "Nicht bestanden". +trac#:#trac_mode_collection_manual#:#Der/die Benutzer*in entscheidet selbst über den Status des Lernfortschritts im jeweiligen Kapitel. +trac#:#trac_mode_collection_manual_info#:#Benutzer*innen entscheiden selbst, wann sie ein Kapitel des Lernmoduls erfolgreich durchgearbeitet haben. Sowie die Bearbeitung eines Kapitels abgeschlossen ist, setzen sie auf dem Reiter "Info" den Status dieses Kapitels auf "Bearbeitet".
Nach dem Speichern dieser Einstellungen, können auf dieser Seite Kapitel für den Lernfortschritt ausgewählt werden. +trac#:#trac_mode_collection_tlt_info#:#Der Status der Benutzer*innen wird entsprechend der Dauer, die diese*r Benutzer*in mit der Bearbeitung eines Kapitels verbringt, automatisch gesetzt. Der Status eines Kapitels auf "Bearbeitet" wird vergeben, wenn die "Typische Lernzeit" aller lernfortschritts-relevanten Kapitel überschritten wird.
Nach dem Speichern dieser Einstellungen, können auf dieser Seite Kapitel ausgewählt und für diese die "Typische Lernzeiten" festlegt werden. +tms#:#hide_breadcrumb_info#:#Mit dieser Einstellung wird die Navigation nur bis zum Training angezeigt. +tms#:#placeholder_desc_crs_venue#:#Veranstaltungsort des Trainings +tms#:#placeholder_desc_prg_type#:#Typ des Qualifizierungsprogramms +tms#:#send_re_assigned_mail_info#:#Versand einer E-Mail bei automatisierter erneuter Zuweisung zum Qualifizierungsprogramm, nachdem Gültigkeit der Qualifikation abgelaufen ist +tms#:#sorting_info_inherit#:#Wird die Sortierung des übergeordneten Trainings bzw. der Gruppe geändert, ändert sich auch diese Sortierung. +tms#:#survey_notification_target_group_parent_course_inactive#:#Kein übergeordneter Training/Gruppe - keine Erinnerung möglich! +tms#:#trac_view_crs#:#Zur Trainingsübersicht +tms#:#usr_filter_coursemember#:#Mitglied eines Trainings +trac#:#timings_reminder_notifications_info#:#Wenn aktiviert, werdas Trainingsteilnehmer über überschrittene Lernplanungsmaterialien informiert. +trac#:#trac_mode_course_reference#:#Vom Training übernommen +trac#:#trac_mode_course_reference_info#:#Der Lernfortschrittmodus wird automatisch von dem Training übernommen, auf den dieser Trainingslink verweist. +trac#:#trac_mode_event#:#Referenten erfassen Teilnahme +trac#:#trac_mode_event_info#:#Referenten prüfen, welche Teilnehmenden an dem Termin teilgenommen haben, und erfassen die Teilnahme händisch im Reiter "Terminteilnahmen verwalten". +trac#:#trac_mode_exercise_returned#:#Referent entscheidet über den Status +trac#:#trac_mode_exercise_returned_info#:#Referent*innen entscheiden anhand der Einreichungen, ob Teilnehmende die Übung gelöst haben. Referent*innen setzen manuell den Status auf "Bearbeitet" oder "Nicht bestanden". +trac#:#trac_mode_individual_assessment#:#Individuelle Bewertung durch Referent/Trainer +trac#:#trac_mode_individual_assessment_info#:#Der/die Teilnehmende muss abschließend bewertet werden, damit für diese*n der Lernfortschritt gesetzt wird. +trac#:#trac_mode_manual#:#Benutzer entscheidet selbst über den Status des Lernfortschritts für das gesamte Objekt +trac#:#trac_mode_manual_by_tutor#:#Referent/Trainer entscheidet über den Status des Lernfortschritts +trac#:#trac_mode_manual_by_tutor_info#:#Referent*innen entscheiden, ob Teilnehmende das Objekt erfolgreich bearbeitet haben. Referent*innen setzen händisch den Status auf "Bearbeitet" oder "Nicht bestanden". +trac#:#trac_mode_manual_info#:#Benutzer*in entscheiden selbst, wann sie das Objekt erfolgreich durchgearbeitet haben. Sowie die Bearbeitung abgeschlossen ist, setzen sie den Status im Reiter "Info" auf "Bearbeitet". +trac#:#trac_mode_questions_info#:#Benutzer*innen, die alle Fragen richtig beantwortet haben, erhalten automatisch den Status "Bearbeitet". Bitte nutzen Sie diese Option nur, wenn auch tatsächlich Fragen im Lernmodul vorliegen. +trac#:#trac_mode_scorm_package_info#:#Der Status des Benutzers / der Benutzerin wird automatisch auf "Bearbeitet" gesetzt, wenn das gesamte Lernmodul durchgearbeitet wurde. Alle im Paket enthaltenen SCOs werden im Lernfortschritt berücksichtigt. +trac#:#trac_mode_study_programme#:#Qualifizierungsprogramm abgeschlossen +trac#:#trac_mode_test_finished_info#:#Der Status des Benutzers / der Benutzerin wird automatisch auf "Bearbeitet" gesetzt, nachdem er/sie "Test beenden" geklickt hat. Dabei ist es gleichgültig, ob er/sie den Test bestanden hat oder nicht. +trac#:#trac_mode_test_passed_info#:#Der Status des Benutzers / der Benutzerin wird automatisch auf "Bearbeitet" gesetzt, nachdem er/sie den Test bestanden hat. Im Reiter "Einstellungen" können im Abschnitt "Notenschema" Schwellenwerte für das Bestehen des Tests festgelegt werden. +trac#:#trac_mode_tlt_info#:#Der Status des Benutzers / der Benutzerin wird automatisch entsprechend der Dauer gesetzt, die er/sie mit der Bearbeitung des Lernmoduls verbringt. Der Status "Bearbeitet" wird vergeben, sobald die "Typische Lernzeit" überschritten ist.
Die "Typische Lernzeit" des Lernmoduls wird im Reiter "Metadaten" festgelegt. +trac#:#trac_mode_visited_pages_info#:#Benutzer*innen, die alle Seiten des Lernmoduls besucht haben, erhalten automatisch den Status "Bearbeitet". +trac#:#trac_mode_visits_info#:#Der Status eines Benutzers / einer Benutzerin wird automatisch auf 'Bearbeitet' gesetzt, wenn diese*r das Lernmodul häufiger aufgerufen hat als die Mindestanzahl der Aufrufe fordert. Benutzer*innen wird die Anzahl ihrer Aufrufe angezeigt und zu welchem Prozentsatz sie die Mindestanforderungen erfüllen. +trac#:#trac_object_stat_lp#:#Lernstandstatistik Training +trac#:#trac_participants#:#Teilnehmende zeigen +trac#:#trac_sure_delete_data#:#Wollen Sie wirklich die Daten der folgenden Monate löschen? Dadurch werden folgende Statistiken für diesen Zeitraum entfernt: Nutzungsintensität, Tagesverlauf, Lernstandstatistik Training und Anzahl der Objekte. +user#:#tst_pass_overview_header_lo_qualifying_per_objective#:#Qualifizierende Testergebnisse
zum Lernziel %s im Training %s +trac#:#trac_view_crs#:#Zur Trainingsübersicht +trac#:#user_total#:#Anzahl Benutzerkonten +ui#:#datatable_multiaction_label#:#Sammelaktionen +ui#:#datatable_multiactionmodal_actionlabel#:#Aktion +ui#:#datatable_multiactionmodal_buttonlabel#:#Ausführen +ui#:#datatable_multiactionmodal_listentry#:#Pauschale Aktionen (keine Auswahl nötig) +ui#:#datatable_multiactionmodal_msg#:#Achtung!
  • Tabelle mit mehreren Seiten:
    Aktion erfasst auch Tabelleneinträge, die momentan nicht sichtbar sind
  • Tabelle mit Filter:
    Aktion erfasst alle gefilterten Einträge
+ui#:#datatable_multiactionmodal_title#:#Pauschale Aktionen (keine Auswahl möglich) +ui#:#drilldown_no_items#:#Keine passenden Elemente +ui#:#filter_nodes_in#:#Einträge in %s filtern +ui#:#ui_file_input_general_error#:#Es ist ein Fehler aufgetreten. Sie können in der JavaSkript-Konsole Ihres Browser nachschauen, ob es weitere Informationen zu diesem Fehler gibt, und/oder die Administration Ihrer cate-Installation über den Vorfall informieren. +ui#:#ui_md_input_edit#:#Bearbeiten +ui#:#ui_md_input_view#:#Vorschau +ui#:#ui_pagination_unlimited#:#Unbegrenzt +ui#:#ui_select_dropdown_label#:#Bitte auswählen +ui#:#ui_table_no_records#:#Keine Einträge +ui_uihk_xsso#:#ui_uihk_xsso_ilias_roles#:#Rollen +ui_uihk_xsso#:#ui_uihk_xsso_no_roles_failure#:#Es wurde keine cate Rolle ausgewählt. Bitte treffen Sie eine Auswahl. +ui_uihk_xsso#:#ui_uihk_xsso_role_ilias#:#Rollen +ui_uihk_xsso#:#ui_uihk_xsso_sso_ilias_authentication_failed_error_notice#:#Bei der Anmeldung in cate ist ein Fehler aufgetreten. +user#:#clipboard_user_added#:#Die ausgewählten Benutzer*innen wurden der Zwischenablage hinzugefügt. +user#:#del_mail_body#:#Guten Tag %1$s, %2$sSie haben sich seit längerer Zeit nicht mehr auf der Lernplattform %3$s angemeldet. Ihr Benutzerkonto wird daher voraussichtlich am %4$s gelöscht. Bitte melden Sie sich erneut an, damit Ihr Benutzerkonto erhalten bleibt. +user#:#del_mail_subject#:#Ihr Benutzerkonto wird bald gelöscht +user#:#inform_user_mail_info#:#Falls aktiviert, wird eine E-Mail an den/die Benutzer*in gesendet. Deren Inhalt kann in "Administration > Benutzerverwaltung > Einstellungen > Benachrichtigung über Neuanmeldung" definiert werden. +user#:#restrict_user_access_info#:#Aktivieren Sie diese Option nur, wenn Sie den Zugriff auf Benutzerkonten beschränken möchten. Wenn aktiviert, benötigen Benutzer*innen das Recht "Lesezugriff auf Benutzerkonten", um auf lokale Benutzerkonten in Kategorien und auf die globalen Benutzerkonten zugreifen zu können. +user#:#send_mail_to_inactive_users_desc#:#Bevor Benutzerkonten gelöscht werden, sendet das System eine Mail an die betroffenen Benutzer*innen. Durch ein erneutes Anmelden des Benutzers / der Benutzerin am System wird die Löschung um die eingestellte Zeitspanne aufgeschoben. Bitte stellen Sie sicher, dass ein externer Mail-Empfang möglich ist. Bei Aktivierung des Cron-Jobs mit Benachrichtigungsmail, kann es vorkommen, dass zu Beginn die Zeitspanne zwischen Benachrichtigung und Löschung geringer ist als die eingestellte Zeitspanne. +user#:#user_account_code_setting#:#Reaktivierung von cate-Benutzerkonten durch Codes ermöglichen +user#:#user_account_code_setting_info#:#Benutzer*innen können mithilfe eines Registrierungscodes ihr abgelaufenes Benutzerkonto reaktivieren. Entsprechende Codes für die Verlängerung zeitlich begrenzter Benutzerkonten werden in "Administration > Authentifizierung / Neuanmeldung > Auth/Selbstregistrierung > Registrierungscodes" erzeugt. Inaktive Benutzerkonten können mit Codes nicht reaktiviert werden. +user#:#user_account_deleted_confirmation#:#Ihr cate-Benutzerkonto wurde gelöscht. Eine E-Mail mit weiteren Informationen wurde an Sie versendet. +user#:#user_adm_enable_alpha_nav#:#Alphabetische Navigation für die Benutzerkontenverwaltung +user#:#user_allow_delete_own_account#:#Benutzer können eigenes Konto löschen +user#:#user_awrn_all_users#:#Alle Benutzerkonten +user#:#user_awrn_all_users_info#:#Alle Benutzerkonten in cate werden aufgelistet. Achtung: Wird die Option "Online und offline" gewählt, ist bei hoher Benutzerzahl mit erheblichen Performanzeinbußen zu rechnen. +user#:#user_chooses_starting_page#:#Benutzer setzt Startseite selbst +user#:#user_delete_own_account_logout_confirmation#:#Ihr cate-Benutzerkonto wurde zur Löschung markiert, bitte authentifizieren Sie sich, um den Vorgang fortzusetzen. +user#:#user_lv_keep_only_for_session#:#Einträge nach Sitzung löschen +user#:#user_member_of_course_group#:#Mitglied in Training/Gruppe +user#:#user_no_courses#:#Keinem Training zugeordnet +user#:#user_please_select_course_group#:#Bitte wählen Sie eine Gruppe oder ein Training aus. +wsp#:#usr_without_courses#:#Benutzer ohne Trainings zugewiesen +user#:#user_portfolios_desc#:#Benutzer*innen können Portfolios anlegen und als Profil verwenden. +user#:#user_profile_prompt_text_info#:#Dieser Text ersetzt den "Standard Infotext Benutzerprofil", falls der/die Benutzer*in zur Veröffentlichung des Profils aufgefordert wird. +user#:#user_prompt_incomplete_info#:#Der/die Benutzer*in wird niemals zur Veröffentlichung seines Profils aufgefordert. +user#:#user_prompt_once_after_login_info#:#Nach dieser Zeit wird der/die Benutzer*in aufgefordert, sein/ihr Profil zu veröffentlichen, falls es nicht bereits veröffentlicht ist. +user#:#user_prompt_repeat_info#:#Benutzer*innen werden wiederholt aufgefordert ihr Profil zu veröffentlichen, falls es nicht bereits veröffentlicht ist. +user#:#user_public_profile_info#:#Bitte wählen Sie aus, welche Daten in Ihrem Profil erscheinen sollen, und welche Benutzer*innen es betrachten können. +user#:#user_role_starting_point#:#Benutzer-Startseite +user#:#user_screen_reader_optimization_info#:#Passt das System an die Nutzung mit einem Screenreader / Bildschirmleseprogramm an. +user#:#user_select_course_group#:#Training/Gruppe auswählen +user#:#usr_letter_avatars_info#:#Wenn kein öffentliches Profilbild vorliegt, zeigt cate als Avatar die Initialen des Vor- und Nachnamens bzw. Anmeldenamens an. +user#:#usr_public_profile_disabled_info#:#Ihre Angaben sind nur für Systemadministrator*innen einsehbar. +user#:#usr_public_profile_global#:#WWW / offen im Internet sichtbar +user#:#usr_public_profile_logged_in#:#Für angemeldete Benutzerkonten sichtbar +usr#:#user_actions_activation_info#:#Die Aktionen werden nur angeboten, wenn die entsprechenden Dienste aktiviert sind und für die Benutzer*innen die notwendigen Voraussetzungen (z.B. Berechtigungen) gegeben sind. +validation#:#numeric_only#:#Bitte geben Sie eine ganze Zahl ein. +validation#:#tag_required#:#Bitte geben sie mindestens ein Tag ein. +webr#:#webr_link_title#:#Titel des Weblinks / Titel der Weblink-Sammlung +wiki#:#wiki_change_notification_salutation#:#Guten Tag %s, +wiki#:#wiki_feedback_from_tutor#:#Feedback des Referenten +wiki#:#wiki_number_users_notes_or_comments#:#Anzahl der Benutzerkonten, die Notizen oder Kommentare zu dieser Seite verfasst haben. +wiki#:#wiki_page_blocked#:#Der Schreibschutz ist aktiviert. Nur Benutzer*innen mit dem Recht "Einstellungen bearbeiten" haben Schreibzugriff. +wiki#:#wiki_stat_edit_pages_avg#:#Durchschnitt der Anzahl geänderter Seiten je Benutzerkonto +wiki#:#wiki_stat_new_pages_avg#:#Durchschnitt der Anzahl neuer Seiten je Benutzerkonto +wiki#:#wiki_stat_page_changes_avg#:#Durchschnitt der Anzahl Änderungen je Benutzerkonto +wiki#:#wiki_stat_page_user_edit#:#Anzahl der Benutzerkonten, die die Seite geändert haben +wiki#:#wiki_stat_user_edit_pages#:#Anzahl der Benutzerkonten, die Seiten geändert haben +wiki#:#wiki_stat_user_edit_pages_avg#:#Durchschnitt der Anzahl an Benutzerkonten, die Seiten geändert haben +wsp#:#wsp_list_crsv#:#Trainingszertifikat +wsp#:#wsp_set_permission_course#:#Trainingsmitglieder +wsp#:#wsp_shared_member_filter#:#Training-/Gruppenmitglieder +wsp#:#wsp_type_crsv#:#Zertifikat: Training \ No newline at end of file diff --git a/lang/customizing/ilias_de.lang.local b/lang/customizing/ilias_de.lang.local new file mode 100644 index 000000000000..f1e6807805c2 --- /dev/null +++ b/lang/customizing/ilias_de.lang.local @@ -0,0 +1,19 @@ +/* Copyright (c) 1998-2024 ILIAS open source eLearning e.V., Extended GPL, see docs/LICENSE */ +/** +* ILIAS language file (All entries) +* +* @module language file custom german +* @modulegroup language +* @author CaT +* @version $Id: ilias_de.cate.lang.local +*/ +// The language file starts beyond the HTML-comment below. DO NOT modify this line! +// To edit your language file with a spreadsheet (i.e. Excel or StarCalc) remove all lines +// from the first line to the HTML-comment. After editing paste the lines in place again. +// NOTICE: Character coding of all ILIAS lang files is UTF-8! Please set your editor +// to the corresponding mode! +// Language file names refer to ISO 639, see: http://www.oasis-open.org/cover/iso639a.html + +assessment#:#assKprimChoice#:#A NEW VALUE +assessment#:#assLongMenu#:#A NEW VALUE +assessment#:#NEW_ENTRY#:#A NEW VALUE diff --git a/lang/customizing/ilias_en.cate.lang.local b/lang/customizing/ilias_en.cate.lang.local new file mode 100644 index 000000000000..55a882c887f9 --- /dev/null +++ b/lang/customizing/ilias_en.cate.lang.local @@ -0,0 +1,865 @@ +/* Copyright (c) 1998-2024 ILIAS open source eLearning e.V., Extended GPL, see docs/LICENSE */ +/** +* ILIAS language file (All entries) +* +* @module language file custom english +* @modulegroup language +* @author CaT +* @version $Id: ilias_en.cate.lang.local +*/ +// The language file starts beyond the HTML-comment below. DO NOT modify this line! +// To edit your language file with a spreadsheet (i.e. Excel or StarCalc) remove all lines +// from the first line to the HTML-comment. After editing paste the lines in place again. +// NOTICE: Character coding of all ILIAS lang files is UTF-8! Please set your editor +// to the corresponding mode! +// Language file names refer to ISO 639, see: http://www.oasis-open.org/cover/iso639a.html + +acc#:#acc_form_document_content_changed#:#The contents of the uploaded file was purified by cate. Please check the result and upload a new file, if necessary. +adm#:#adm_support_contacts_info#:#Please enter the login names of the people who can be contacted with questions and technical problems here, separated by commas. They can be contacted by e-mail via the "Contact technical support" link in the cate footer. If the "Who is online?" display is active, these people will also be displayed there as technical support. +administration#:#adm_extending_ilias#:#Extending cate +administration#:#adm_rep_tree_limit_grp_crs#:#Show limited context tree in training events and groups. +administration#:#adm_rep_tree_limit_grp_crs_info#:#The Tree View shows all objects only within training events and groups. Outside training events and groups, only container objects are presented. +administration#:#adm_rep_tree_only_cntr_info#:#Only categories, training events and groups are listed. +administration#:#apache_auth_domains_description#:#Enter one domain per line to allow redirection to this target.
If cate is reachable by more than one domain please enter all target you want to allow.
Example: example.com allows the redirection to http://example.com and http://www.example.com and all pages located there. +administration#:#course_export#:#Visible in Training Events +administration#:#language_former_file_description#:#To compare your local changes with the changes of the last update, please copy the language file of the previously installed cate version to the path mentioned above. Before the next update you can do this with the option 'Backup the standard language file' on the maintenance tab. +administration#:#language_save_dist_failed#:#The backup of the standard cate language file could not be written. +administration#:#language_save_dist_info#:#Create a backup of the standard cate language file in the cate data directory. This helps after an cate update to find conflicst of own changes with updated language variables. +administration#:#language_saved_dist#:#The backup of the standard cate language file is created. +administration#:#language_scope_merged_info#:#Export the standard cate language file with all local changes merged in alphabetically by module and identifier. This can be used to update the standard language file on the cate git repository. +administration#:#prg_export#:#Visible in Qualification Programmes +administration#:#Training Event_export#:#Visible in Training Events +administration#:#user_criteria_desc#:#Unique user criteria that is used for test results import/export. This is needed to identify identical users on different cate systems. +administration#:#vc_information_not_determined#:#cate could not determine any version control information. +adn#:#administrative_notification_description#:#Provide system-wide notifications in topbar of cate +adve#:#advanced_editing_tst_editing_desc#:#Activates cate Page Editor for feedback and hint text editing. +adve#:#adve_grp_lm#:#cate Learning Modules +adve#:#adve_page_editor_settings#:#cate Page Editor +assessment#:#autosave_info#:#The answers of the participants to the last opened question are automatically saved by cate. These automatically saved answers are not considered to be answers that have been authorised by the participant. Therefore, they are not taken into account by cate during the automated evaluation. Automatically saved answers must always be evaluated manually! They are also not displayed in a participant's 'Results' tab. The automatic saving of answers is only intended for emergencies, e.g. if the browser window is closed by mistake! +assessment#:#back_to_objective_container#:#Go to Training Event +assessment#:#concatenation#:#Concatenation +assessment#:#duplicate#:#Duplicate +assessment#:#duplicate_matching_values_selected#:#You have selected duplicate matching values! +assessment#:#duplicate_order_values_entered#:#You have entered duplicate order values! +assessment#:#examid_in_test_res#:#cate Test Pass ID +assessment#:#examid_in_test_res_desc#:#The cate test pass ID will be included in the test results. +assessment#:#exp_type_certificate#:#Certificate (PDF) +assessment#:#qpl_imagemap_preview_missing#:#cate could not create the temporary preview file containing the image map areas. The original image is shown instead. This means that either the web server‘s ImageMagick tool isn‘t configured correctly or there are no write permissions in the temporary directory! Please contact your system administrator. +assessment#:#qpl_import_non_ilias_files#:#Error: The import file contains QTI files which are not created by an cate system. Please contact the cate team to get in import filter for your QTI file format. +assessment#:#qpl_import_verify_found_questions#:#cate found the following questions in the import file. Please select the questions you want to import. +assessment#:#redirect_after_finishing_tst_desc#:#After completing the test, each participant is automatically redirected to a specific webpage of your choosing. This will only happen if participants do not have direct access to their test results. When entering the address of an external webpage, use the complete URL (including 'https://'). When redirecting to an Object in cate, use the permalink that can be found in the footer of the Object in question. +assessment#:#tst_activation_limited_visibility_info#:#Before and after the indicated period it is only the test's title that will be displayed. The participants cannot take the test. +assessment#:#tst_add_quest_cont_edit_mode_IPE#:#Use plain text for questions and answers and cate page editor for feedback and hints +assessment#:#tst_add_quest_cont_edit_mode_IPE_info#:#No formatting of text in question and answers. No use of LaTex either. But feedback and hints can be reused when question is embedded in cate learning module. +assessment#:#tst_add_quest_cont_edit_mode_page_object#:#Use plain text for questions and answers and cate page editor for feedback and hints +assessment#:#tst_add_quest_cont_edit_mode_RTE_info#:#Allows text formatting of questions, answers, feedbacks and hints. But feedback and hints cannot be reused when question is embedded in cate learning module. +assessment#:#tst_allowed_users_desc#:#cate will monitor the number of participants taking the test at the same time. If more users than maximally allowed try to access cate will prevent them from starting the test. +assessment#:#tst_defaults_apply_not_possible#:#cate could not apply the selected test defaults to this test! Maybe this test already contains participant data sets. +assessment#:#tst_ending_time_desc#:#Point in time at which the test will be finished: Participants an no longer answer questions, the test is finished by cate. +assessment#:#tst_exp_sc_short_desc#:#In the ‘Statistics’-tab an additional export option is offered. It generates a spreadsheet for item analysis outside of cate. This option only works for tests purely composed of Single Choice Questions. +assessment#:#tst_hide_pagecontents_desc#:#cate content placed before and after the actual question text via the "Edit Page" button will not be displayed in the result views and print output. +assessment#:#tst_import_verify_found_questions#:#cate found the following questions in the test import file. Please select the questions you want to import with this test. +assessment#:#tst_instant_feedback_answer_generic_desc#:#If the answer provided is fully correct cate will show one type of feedback upon clicking the ‘Check’ button. If the answer provided is not fully correct, another type of feedback will be displayed. Both types of feedback have to be prepared in the tab ‘Feedback’ of the respective question. +assessment#:#tst_instant_feedback_answer_specific_desc#:#On clicking the ‘Check’-button, cate will show a specific feedback for every answer option selected by the participant. The feedback has to be prepared along with the question. This specific feedback is not supported for all question types. +assessment#:#tst_instant_feedback_results_desc#:#On clicking the ‘Check’ button cate will display how many points were attained by answering this question. +assessment#:#tst_instant_feedback_solution_desc#:#On clicking the ‘Check’ button cate will display the best possible answer to the question. +assessment#:#tst_notification_explanation_admin#:#You receive this mail from cate because you activated the notification. +assessment#:#tst_pass_overview_header_lo_initial_all_objectives#:#Initial Test Results
for the Learning Objectives within the Training Event %s +assessment#:#tst_pass_overview_header_lo_initial_per_objective#:#Initial Test Results
for the Learning Objectives %s within the Training Event %s +assessment#:#tst_pass_overview_header_lo_qualifying_all_objectives#:#Qualifying Test Results
for the Learning Objectives within the Training Event %s +assessment#:#tst_pass_overview_header_lo_qualifying_per_objective#:#Qualifying Test Results
for the Learning Objectives %s within the Training Event %s +assessment#:#tst_results_access_always_desc#:#Participants can access their results within the ‘Results’-tab immediately after starting the test pass and while still taking the test. Additionally cate will redirect to the 'Results'-tab after the test has been finished. +assessment#:#tst_results_access_finished_desc#:#cate displays the test results after the test pass is finished. After finishing the test pass participants can access their test results within the ‘Results’-tab at any time. +assessment#:#tst_results_access_passed_desc#:#cate displays the test results after the participant has passed the test. After passing the test participants can access their test results within the 'Results'-tab at any time. +assessment#:#tst_score_mcmr_use_scoring_system#:#Save and Score Empty Answers (Deprecated)###fau: testNav +assessment#:#tst_score_mcmr_use_scoring_system_desc#:#An additional option "None of the above" allows saving of empty answers. The unchecked options will be scored as defined in the question. This setting is only kept for existing tests and will be abandoned in a following cate version.###fau: testNav +assessment#:#tst_show_pass_details_desc#:#The summary of results will be appended at the point in time indicated in the setting above: A ‘Table of Detailed Test Results’ will show the title of the questions and the points scored in a particular test pass.
Other than that the table will be displayed after the last test pass possible (setting in link ‘General’, option ‘Limit Number of Test Passes’) or after the test is officially finished (setting in link ‘General’, option ‘Finishing Time’).
Further settings about the content of the ‘Table of Detailed Test Results’ can be made in the section ‘Further Details to be Included in Test Results’ of this form. +assessment#:#tst_show_solution_answers_only_desc#:#If is selected, the cate content you place around a question using the ‘Edit content’ tab page will not be visible in a print-out. If you want to save some paper space, select this option. +auth#:#auth_account_code_info#:#To re-activate your account you can use an cate account code. +auth#:#auth_account_migration#:#New cate Account +auth#:#auth_activation_code_success#:#Your account has been reactivated. You can now login to cate. +auth#:#auth_allow_local_info#:#If enabled a local authentication against the cate database is still possible (with a local login/password) for those user accounts, whose authentication mode is set to SAML. +auth#:#auth_info_add#:#Choose this option if you have never registered to cate. A new account will be created. +auth#:#auth_info_migrate#:#If you have already an cate account, enter username and password to migrate your personal data (mail, test results...). +auth#:#auth_saml_idps_info#:#Please check and edit the SimpleSAMLphp configuration in '%s' and '%s' (external data directory). Don't forget to add the paths to your private key and certificate in the authsources.php file. Please read the manual for further explanations %s.
Federation Metadata URL: %s +auth#:#auth_saml_migration_info#:#Activate this option to give new users the possibility to migrate their existing cate accounts to SAML authentication. +auth#:#auth_saml_uid_claim_info#:#Define the attribute cate uses to detect whether or not an incoming authentication request matches an existing cate user account. +auth#:#auth_saml_username_claim_info#:#Define the attribute cate uses to generate the username which will be visible in cate. +auth#:#login_page_switch_ipe#:#Use cate page editor +cert#:#cert_currently_no_certs#:#Currently you did not achieve any certificate, yet. +cert#:#cert_error_no_access#:#You have no access to this certificate. +cert#:#certificate_achievement_sub_obj#:#Certificate for %1$s +cert#:#certificate_migration_confirm_start#:#Since cate 5.4, certificates in cate are persistent. Even if training events, tests or learning modules are deleted, you are still able to access any certificate you might have earned by them. In order to use this new functionality, you need to migrate your old certificates once. +cert#:#certificate_same_not_saved#:#No new version of certificate template was saved, because the values didn't change. +cert#:#error_creating_certificate_pdf#:#The certificate could not be created. Please contact the administrator to check the certificate server. +cert#:#user_certificates#:#Certificates +certificate#:#cert_cron_task_desc#:#This job's responsibility is the creation of persisting certificate data based on learning achievements of users. +certificate#:#cert_cron_task_title#:#Certificates +certificate#:#certificate_edit#:#Create/Edit a Certificate Template +certificate#:#certificate_file_basename#:#Certificate +certificate#:#certificate_not_well_formed#:#The certificate text is not well formed. Please enter valid XHTML for the certificate text! +certificate#:#certificate_page_format_info#:#Please select the default page format for new certificates. +certificate#:#certificate_ph_no_sco#:#If items are selected to determine the overall learning progress status, titles and points for these items could be displayed in certificate. +certificate#:#certificate_settings#:#Certificate Settings +certificate#:#certificate_short_name#:#Certificate file short title +certificate#:#certificate_short_name_description#:#Please enter a short title for the certificate name. The short title will be part of the certificate name: YYMMDD_[surname]_[SHORT_TITLE]_certificate.pdf. +certificate#:#certificate_text#:#Certificate Text +certificate#:#certificate_text_info#:#Please enter the certificate text. If the WYSIWYG editor is disabled in the cate administration, you can still use valid XHTML to format the text. +certificate#:#certificate_usage#:#Please note that the usage of certificates is only available if the cate Java-Server is running. The configuration for Java-Server is available in Administration » General Settings » Server, sub-tab Java-Server. +certificate#:#certificate_var_user_institution#:#cate Open Source +certificate#:#certificate_visibility_introduction#:#Participants will be offered to download the certificate from the test results screen. +certificate#:#default_background_info#:#This background image will be chosen as default background for all certificates. If you need another background image in a certficiate, you have to upload one in the certificate editor. +certificate#:#download_certificate#:#Download Certificate +certificate#:#learning_progress_deactivated#:#The Learning Progress for this object is deactivated. To edit the certificate template and achieve user certificates the learning progress for this object must be activated. +certificate#:#persistent_certificate_mode#:#User Certificate Creation +certificate#:#persistent_certificate_mode_instant_info#:#This option is recommended for systems with low up to mediocre user interactions. Systems that tend to big loading times during creation for multiple user certificates should switch to the "Cron Job" option. +cmps#:#cmps_ilias_max_version#:#Max. Version of cate +cmps#:#cmps_ilias_min_version#:#Min. Version of cate +cmps#:#cmps_needs_newer_ilias_version#:#This plugin version only runs on newer cate versions. Please upgrade cate. +cmps#:#cmps_needs_newer_plugin_version#:#This cate version needs a newer plugin version. Please upgrade the plugin. +cmxv#:#cmxv_create#:#Create Certificate for xAPI/cmi5 Object +cntr#:#cntr_container_only_on_their_own#:#Categories, training events, groups, folders or qualification Programmes can only be copied as single objects. Please select one item only. +cntr#:#cntr_copy_crs_grp#:#My Training Events and Groups +cntr#:#cntr_old_editor_warning#:#The maintenance of this editor will be discontinued in a future major releases of cate. You may still use it to edit the content of this page now. But we recommend to switch to the standard page editor of cate when possible. +cntr#:#cntr_view_info_sessions#:#This content presentation groups all sessions first. After that the other training event content is listed. +cntr#:#container_import_zip_file_invalid#:#The uploaded file is not a valid cate export file. To upload a directory structure please use a file object. +common#:#accept_usr_agreement_intro#:#There are new terms of service. You need to accept them before proceeding with the use of cate. Read the following document carefully and give your consent or dissent at the bottom of the page. +common#:#accesscount_registered_users#:#Read by number of distinct cate users +common#:#account_expires_body#:#your account %s on %s will expire at %s. After this date, access to cate with this account will no longer be possible. To save your personal documents and certificates, please download them in good time. +common#:#account_expires_subject#:#Your cate account will expire soon! +common#:#activate_https#:#HTTPS handling by cate
(Login) +common#:#administrate_users_headline#:#Local cate Accounts of this Category +common#:#advanced_editing_assessment_settings#:#Allowed HTML Tags for the cate Test and Assessment tool +common#:#advanced_editing_rep_page_editing_desc#:#This feature allows adding text/media to pages of a category, training event, group or folder. If deactivated, existing content will be hidden. +common#:#advanced_editing_survey_settings#:#Allowed HTML Tags for the cate survey tool +common#:#assf_allowed_questiontypes_desc#:#All the checked question types will be available in this cate installation. If you don't want to allow the creation of a certain question type in this installation, you must remove the selection in the associated check box. +common#:#auth_cas_allow_local_desc#:#This allows CAS users to authenticate with their local cate username and a local password. +common#:#auth_ldap_migration_info#:#Activate this option to give new users the possibility to migrate their existing cate accounts to LDAP authentication. +common#:#auth_local#:#cate Auth +common#:#auth_remark_non_local_auth#:#When selecting another authentication mode than cate database, you may not change user's login name and password anymore. +common#:#auth_shib_instructions#:#Be sure to read the README for instructions on how to configure Shibboleth support for cate. +common#:#auth_soap_allow_local_desc#:#This allows SOAP users to authenticate with their local cate username and a local password. +common#:#auth_soap_auth_desc#:#This settings deal only with SOAP based user authentication, not with the cate SOAP interface. +common#:#auth_soap_create_users_desc#:#Creates automatically an cate user account, for users that successfully authenticated against SOAP, without having an cate account yet. +common#:#authenticate_ilias#:#cate Native Authentication +common#:#back_to_course#:#Back to Training Event +common#:#back_to_crs_content#:#Back to Training Event Content +common#:#bm_add_to_ilias#:#Add to cate Bookmarks +common#:#certificate#:#Certificate +common#:#certificate_file_already_exists_error#:#The certificate file already exists in the file system. +common#:#certificate_file_input_output_error#:#The certificate file was found but couldn't be deleted because of internal errors. Please contact your administrator. +common#:#certificate_file_not_found_error#:#The certificate file doesn't exist in the file system anymore. Die Zertikatsdatei wurde im Dateisystem nicht mehr gefunden. +common#:#certificate_persistent_option#:#Certificates of Achievements +common#:#certificate_selection#:#Origin of Certificates +common#:#certificate_workspace_option#:#Certificates of Personal Resources +common#:#check_link_desc#:#If enabled all external links in cate learning modules will be checked if they are active. +common#:#chg_ilias_password#:#Change cate Password +common#:#cld_abandoned#:#The Cloud Object has been abandoned as of cate 8. No data has been lost. Contact your System Administration for more information. +common#:#course#:#Training Event +common#:#courses#:#Training Events +common#:#cron_mail_notification_desc#:#On request, cate sends e-mail notifications about new mails. In contrast to the immediate forwarding of all mails, this cronjob collects the mails of one day and delivers them as a package. Please enable the option '%s' to use this feature. Additionally, the e-mail notifications for each cate account have to be activated in the personal mail settings. +common#:#cron_mail_notification_message_info#:#E-mail notifications contain the complete content of the mails received in cate. This means that they can be read without having to log in again. +common#:#crs#:#Training Event +common#:#crs_add#:#Add Training Event +common#:#crs_added#:#Training Event added +common#:#crs_cancel_waiting_list#:#Do you really want to remove yourself from the waiting list of training event "%s"? +common#:#crs_copy_threads_info#:#Please decide which training event materials should be copied, linked or even omitted. +common#:#crs_edit#:#Edit Training Event +common#:#crs_members_gallery#:#Training Event Members Gallery +common#:#crs_new#:#New Training Event +common#:#crs_removed_from_waiting_list#:#You have been detached from the waiting list of training event "%s". +common#:#crs_title#:#Training Event Title +common#:#crs_unsubscribe#:#Unsubscribe from Training Event +common#:#crs_wizard_page#:#Copy Training Event (Step 2/2) +common#:#crsr#:#Training Event Link +common#:#crsr_add#:#Add Training Event Link +common#:#crsr_edit_info#:#Please choose one training event for creating a new link. +common#:#crsr_new#:#Create Training Event Link +common#:#crsr_settings#:#Training Event Link Settings +common#:#download_with_uploaded_filename_info#:#Select this option exclusively for backwards compatibility with cate 3.9 and older versions: When this option is selected, the filename of a downloaded file is equal to the filename that was used for uploading the file into cate. If this option is not selected, the filename of a downloaded file is equal to the title of the file object in cate. This option does not affect WebDAV. For WebDAV the filename of a downloaded file is always equal to the title of the file object. +common#:#enable_course_group_notifications#:#Daily mail for group and training event news +common#:#enable_password_assistance#:#Enable Login Assistance +common#:#enable_Training Event_group_notifications#:#Daily Mail for Groups and Training Event News +common#:#err_auth_apache_failed#:#The authentication has failed. Maybe you have no valid user certificate or your smart card is not inserted. +common#:#err_auth_cas_no_ilias_user#:#Login failed. CAS authentication successful, but no corresponding cate user exists. Please contact your system administrator. +common#:#err_auth_ldap_no_ilias_user#:#Login failed. LDAP authentication successful, but no corresponding cate user exists. Please contact your system administrator. +common#:#err_auth_radius_no_ilias_user#:#Login failed. Radius authentication successful, but no corresponding cate user exists. +common#:#err_auth_soap_no_ilias_user#:#Login failed. SOAP authentication successful, but no corresponding cate user exists. Please contact your system administrator. +common#:#exercise_time_over#:#The time allocated for completing this exercise is over. Files cannot be submitted anymore! +common#:#file_not_found_sec#:#This file cannot be found in cate or has been blocked due to security reasons. +common#:#file_system_clean_temp_dir_cron_info#:#This job cleans the cate temp-directory of files, which are older than 10 days. This counteracts the accumulation of unused files and therefore prevents an increased use of disk space by the temp directory. +common#:#glo_mode_desc#:#A virtual glossary works like a normal glossary. Additionally it contains the terms from all glossaries that are located on the same level in the repository like the virtual glossary (level) respectively from all glossaries that are located downwards in the repository from the position of the virtual glossary (subtree). +common#:#groupings_assigned_obj_crs#:#Assigned Training Events +common#:#i2passwd#:#cate 2 password +common#:#il_astpl_loc_initial_desc#:#Settings template for initial tests of learning objective oriented Training Events +common#:#il_astpl_loc_qualified_desc#:#Settings template for qualifying tests of learning objective oriented Training Events +common#:#il_crs_admin#:#Training Event Administrator +common#:#il_crs_member#:#Training Event Member +common#:#il_crs_non_member#:#Training Event non-member +common#:#il_crs_tutor#:#Training Event Tutor +common#:#ilias_version#:#cate version +common#:#import_lm#:#Import cate Learning module +common#:#info_remark_interrupted#:#Role is interrupted at this position. The role's default permission settings in effect are located in that position. +common#:#lang_refresh_confirm_info#:#cate found changed language variables. Refreshing a language will read the standard language file and probably a custom language file to the database. A standard file will not affect your changes. A custom file will overwrite your changes that are older than the file date. +common#:#lang_uninstall_changes_confirm#:#Do you really want to clear all local changes of the selected languages and reset them to the default of the current cate version? +common#:#link_check_subject#:#[cate] Weblink check +common#:#links_dynamic_info#:#If enabled, it is possible to append dynamic parameters to Weblinks.
E.g. the cate user ID or the username. +common#:#links_session_id#:#cate session id +common#:#links_user_id#:#cate user id +common#:#links_user_name#:#cate username +common#:#lm#:#Learning Module cate +common#:#lm_add#:#Add cate Learning Module +common#:#lm_added#:#cate Learning Module added +common#:#lm_new#:#New cate Learning Module +common#:#login_to_ilias#:#Login to cate +common#:#login_to_ilias_via_cas#:#Login to cate via Central Authentication Service +common#:#login_to_ilias_via_saml#:#Login to cate via SAML Authentication +common#:#login_to_ilias_via_shibboleth#:#Login to cate via +common#:#logout_text#:#You logged off from cate. Your session has been closed. +common#:#mail_at_the_ilias_installation#:#You received %1$s new mail at the cate-Installation %2$s +common#:#mail_multiple_recipients_found#:#Enter a more specific mail address. cate found multiple possible recipients for this address: %s +common#:#mail_no_recipient_found#:#Enter a different mail address. cate couldn't find a recipient with this mail address. +common#:#mails_at_the_ilias_installation#:#You received %1$s new mails at the cate-Installation %2$s +common#:#mem_cron_min_members#:#Training Event/Group: Minimum Members Check +common#:#mm_certificates#:#Certificates +common#:#mm_enrolments#:#Training Event Memberships +common#:#msg_bt_download_started#:#cate is generating a ZIP archive of all available files. You can download them from the Notification Center (bell icon) on top right. +common#:#msg_copy_clipboard_source#:#Now, please select the desired training event or group, whose content should be copied and click the button ‘Continue’. +common#:#msg_obj_no_link#:#It is not possible to link container objects like categories, training events, groups or folder due to technical reasons. Instead you may link several single objects within such a container to other areas or create a category link, training event link or group link. +common#:#my_certificates#:#My Certificates +common#:#my_courses#:#My Training Events +common#:#my_courses_groups#:#My Training Events and Groups +common#:#no_mkisofs_configured#:#You have to configure mkisofs utility in cate setup to run ISO export +common#:#obj_adm_desc#:#Main system settings folder containing all panels to administrate your cate installation. +common#:#obj_adve_desc#:#Administration settings for cate page editor and TinyMCE. +common#:#obj_cert#:#Certificates +common#:#obj_crs#:#Training Event +common#:#obj_crs_duplicate#:#Copy Training Event +common#:#obj_crsr#:#Training Event Link +common#:#obj_crss#:#Training Event +common#:#obj_crss_desc#:#General settings for Training Events +common#:#obj_crsv#:#Training Event Certificate +common#:#obj_excv#:#Exercise Certificate +common#:#obj_extt_desc#:#Configure external software or services that are supported by cate +common#:#obj_file_duplicate#:#Duplicate File +common#:#obj_lm#:#Learning Module cate +common#:#obj_objf_desc#:#Manage cate object types and object permissions. (only for experts!) +common#:#obj_pecrs#:#Training Event +common#:#obj_pecrt#:#Certificate +common#:#obj_prg#:#Qualification Programme +common#:#obj_prg_duplicate#:#Copy Qualification Programme +common#:#obj_prg_select#:#-- Please select one Qualification Programme -- +prg#:#prg_acknowledge_all_completed_courses#:#Acknowledge All Completed Training Events +common#:#obj_prgr#:#Link to Qualification Programme +common#:#obj_prgrs#:#Links to Qualification Programmes +common#:#obj_prgs#:#Qualification Programmes +common#:#obj_prgs_desc#:#Qualification Programme Administration +common#:#obj_rcrs#:#ECS Training Event +common#:#obj_scov#:#SCORM Certificate +common#:#obj_tstv#:#Test Certificate +common#:#objs_crs#:#Training Events +common#:#objs_crsr#:#Training Event Link +common#:#objs_lm#:#cate Learning Modules +common#:#objs_prg#:#Qualification Programmes +common#:#objs_prgr#:#Links to Qualification Programmes +common#:#objs_rcrs#:#ECS Training Events +common#:#org_op_access_enrolments#:#View Training Event Membership Status +common#:#password_assistance_info#:#If login assistance is enabled, two links ‘Forgot Password?’ and ‘Forgot Username?’ are shown on the login page. Users can use this link to independently set a new password for their user Account, or to identify their username. +common#:#password_change_on_first_login_demand#:#You have to change your password before you can start using cate services. +common#:#preview_learner_info#:#If enabled, training event and Group administrators have the possibility to view the content form the perspective of a learner. +common#:#prg_copy_threads_info#:#Please decide which Qualification Program elements should be copied, linked or even omitted. +common#:#prg_wizard_page#:#Copy Qualification Program (Step 2/2) +common#:#prgr_add#:#Add Qualification Programme Link +common#:#prgr_edit_info#:#Please choose one qualification programme for creating a new link. +common#:#prgr_new#:#Create Qualification Programme Link +common#:#prgr_settings#:#Settings of Qualification Programme Link +common#:#profile_changed#:#cate eLearning - Your profile has changed +common#:#proxy_not_connectable#:#cate could not build a connection to the defined proxy. +common#:#proxy_status_info#:#To use a proxy in cate (e.g. for web feeds or to check web links) please activate the checkbox above. +common#:#referral_comment#:#How did you hear about cate? +common#:#reg_mail_body_text1#:#Welcome to cate eLearning! +common#:#reg_mail_body_text2#:#To access cate use the following data: +common#:#reg_mail_subject#:#cate eLearning - Your access data +common#:#reg_mail_subject_confirmation#:#cate eLearning - Your Confirmation Link +common#:#renderer_supported_repo_types#:#Supported cate Objects +common#:#rpc_pdf_font_info#:#Additional fonts for the generation of PDF files. Other fonts than ‘Helvetica’ and ‘unifont’ must be installed on the cate server. +common#:#sahs_export_file#:#cate exported SCORM archive file +common#:#saml_login_form_txt#:#Login to cate via SAML +common#:#scorm_login_as_learner_id#:#SCORM 2004: set cate Username as cmi.learner_id +common#:#scorm_without_session_info#:#This ensures the storage of SCORM 2004 learning data even if cate session expired. For SCORM 1.2, storage without session is always enabled. +common#:#shib_general_wayf_login_instructions#:#In case you are not associated with the given organizations and you need access to a Training Event on this server, please contact the %s +common#:#shib_idp_list#:#Provide a list of Identity Providers to let the user choose from on the cate login page.
On each line there must be a comma-separated tuple for providerID of IdP (see the Shibboleth metadata file) and Name of IdP as it shall be displayed in the drop-down list.
As an optional third parameter you can add the location of a Shibboleth session initiator that shall be used in case your cate installation is part of a multi federation setup. +common#:#shib_login_internal_wayf#:#Use cate WAYF service +common#:#short_inst_name_info#:#This title will appear in the browser header title bar. If no value is entered, ‘cate’ is used. +common#:#soap_user_administration_desc#:#If enabled, cate can be administrated via SOAP. +common#:#sorting_info_inherit#:#The sorting mode is adopted from a parent training event/group. +common#:#startpage#:#cate Login Page +common#:#take_over_structure_info#:#If activated, directories in the zip file will be mapped to categories or, if used in groups or training events, to folders. +common#:#Training Event#:#Training Event +common#:#Training Events#:#Training Events +common#:#txt_registered#:#You successfully registered to cate. Please click on the button below to login to cate with your user account. +common#:#txt_registered_passw_gen#:#You successfully registered to cate. You should receive an e-Mail including your generated password shortly. +common#:#txt_submitted#:#You successfully submitted an account request to cate. Your account request will be reviewed by the system administrators, and should be activated within 48 hours. You will not be able to log in until your account is activated. +common#:#ums_explanation#:#Your external account could not be mapped to an cate account. But cate has found an account with your e-mail address. If this is your account, please login with your cate password. +common#:#ums_explanation_3#:#Your external account could not be mapped to an cate account. But cate has found multiple accounts with your e-mail address. If one of those is your account, please login with your cate password. +common#:#usr_filter_coursemember#:#Member of training event +common#:#usr_without_courses#:#Users without training events assigned +common#:#usrimport_conflict_handling_info#:#When ‘Ignore on conflict’ is selected, cate ignores an action, if it can not be performed (e. g. an ‘Insert’ action is not done, if there is already a user with the same login in the database.) When ‘Update on conflict’ is selected, cate updates the database if an action can not be performed. (e. g. an ‘Insert’ action is replaced by an ‘Update’ action and the other way around, if a user with the same login exists in the database). +common#:#webfolder_instructions_text#:#[WINDOWS]

Instructions for connecting with Windows

  1. Open Windows-Explorer (e.g. key combination Windows + E).
  2. Rightclick on "This PC" and select "Map network drive...".
  3. Enter the following address as address (you may copy and paste the URL):

    [WEBFOLDER_URI]

  4. Click "Finish".
  5. Enter your login and password, and select "OK".
  6. You can now access the webfolder from the start menu "Computer".

Your login and password is identical to your local cate login and can be changed in your personal settings.[/WINDOWS] [MAC]

Instructions for Mac OS X

  1. Open the Finder.
  2. Choose the menu 'Goto to > Connect to server...'.
    This opens the window 'connect to server'.
  3. Enter this URL as server URL:
    [WEBFOLDER_URI]
    und click on 'Connect'.
  4. Enter your login and password, and select "OK".

Your login and password is identical to your local cate login and can be changed via "Personal Settings".[/MAC][LINUX]

Instructions for Linux with Konqueror

  1. Open Konqueror Browser.
  2. Enter this URL as server URL:
    [WEBFOLDER_URI_KONQUEROR]
    and press enter.
  3. Enter your login and password, and select "OK".

Instructions for Linux with Nautilus

  1. Open Nautilus Browser.
  2. Enter this URL as server URL:
    [WEBFOLDER_URI_NAUTILUS]
    and press enter.
  3. Enter your login and password, and select "OK".

Your login and password is identical to your local cate login and can be changed in your personal settings.[/LINUX]

Tips & Support

  • These steps need to be done only once. You may access your connection again later.
  • Connect to a higher folder. You can always navigate down the tree, but nut upwards.
  • If your computer can not open the WebDAV Connection, please contact cate Support.
+common#:#withdraw_consent_description_external#:#Please return to your cate installation and log in again to complete the process of withdrawing your consent to the Terms of Service. +common#:#withdrawal_mail_text#:#Dear Sir or Madam,[BR][BR]I hereby withdraw my consent to your cate installations terms of service. Please update/remove my account accordingly.[BR][BR]Name: %1$s[BR]Login: %2$s[BR]External Account: %3$s[BR][BR]Kind regards[BR]%1$s +common#:#wizard_title_info#:#Search for the object you want to duplicate. Please enter the object's title or a part of it and click on 'Continue' to get matching search results. +common#:#zip_test_failed#:#Zip-Test failed. Please contact you cate administrator. +cont#:#cont_page_type_cstr#:#Training Event Start Page (Learning Objectives View) +content#:#cont_check_values_info#:#The Test Tool will check whether the values sent from the SCOs adhere to the SCORM standard.
The SCORM Standard is very demanding concerning the saving of values. Not all learning modules meet the requirements of the standard. This Options allows checking if the module adheres to the Standard or not. Do not check this option if you just want to check if cate can run this module or not. +content#:#cont_could_not_determine_resource_size#:#cate could not automatically determine the resource size. +content#:#cont_could_not_save_duplicate_pc_ids#:#Page could not be saved (duplicate PC IDs). +content#:#cont_debug_deactivate#:#A Test Tool will be displayed in the presentation mode of the learning module. Based on the data provided by it the interaction of the learning module and cate can be evaluated. To use the Test Tool, the navigation tree has to be switched on. +content#:#cont_debug_deactivate12#:#A Test Tool will be displayed in the presentation mode of the learning module. Based on the data provided by it the interaction of the learning module and cate can be evaluated. +content#:#cont_debug_deactivated#:#The test tool is currently globally deactivated in the cate administration (Administration » Repository and Objects » Learning Modules). +content#:#cont_ed_insert_mcrs#:#Insert My Training Events +content#:#cont_ed_insert_vrfc#:#Insert Certificate +content#:#cont_ed_plachverification#:#Placeholder Certificate +content#:#cont_html_export_ids_info#:#Allows maintaining extra IDs for cate learning modules that are used for naming HTML files when HTML export is done. +content#:#cont_insert_my_courses#:#Insert My Training Events +content#:#cont_insert_verification#:#Add Certificate +content#:#cont_layout_fullscreen_desc#:#Content in the main frame. FAQ, glossary and media links open in separate window. No cate main menu and no navigation bar. +content#:#cont_layout_presentation_desc#:#Content in the main frame. FAQ, glossary and media links open in separate window. No cate main menu. +content#:#cont_link_to_internal#:#Link to cate Resource +content#:#cont_lm_starting_point#:#Starting Point for cate Learning Modules +content#:#cont_mytraining events_sortorder_info#:#This is a default setting. Every user can choose a personal order which affects all "My training events"-elements of any portfolio. +content#:#cont_open_iframe#:#Opens in the Same Window Underneath the cate Main Menu +content#:#cont_open_normal#:#Opens in a New Tab or Alternatively in a New Window, Without cate Main Menu +content#:#cont_open_window#:#Enforced to Open in New Window , Without cate Main Menu +content#:#cont_pc_vrfc#:#Certificate +content#:#cont_sc_id_setting_info#:#In the case that a numeric id for student_id (SCORM 1.2) or learner_id (SCORM 2004) causes problems for the learning module, use the option 'cate user name'. The addition RefId or ObjId may be useful for learning modules that connect to an external server. +content#:#cont_sc_id_setting_user_id#:#cate User Id (Standard) +content#:#cont_sc_id_setting_user_id_plus_obj_id#:#cate User Id plus ObjId of the Learning Module +content#:#cont_sc_id_setting_user_id_plus_ref_id#:#cate User Id plus RefId of the Learning Module +content#:#cont_sc_id_setting_user_login#:#cate Login Name +content#:#cont_sc_id_setting_user_login_plus_obj_id#:#cate Login Name plus ObjId of the Learning Module +content#:#cont_sc_id_setting_user_login_plus_ref_id#:#cate Login Name plus RefId of the Learning Module +content#:#cont_sc_usession_info#:#Periodical requests will be sent to cate to keep the session alive. Otherwise cate will categorize working on the learning module as idleness, terminate the session and loose the tracking data. +content#:#cont_time_from_lms#:#Processing Time Determination by cate +content#:#cont_time_from_lms_info#:#Frequently SCORM learning modules are returning faulted data on processing time. To avoid this issue cate can determine the processing time adhering to the strict standards of SCORM. +content#:#cont_to_focus_return_crs#:#Back to Training Event +content#:#cont_update_my_courses#:#Edit My Training Events +content#:#cont_update_verification#:#Edit Certificate +content#:#cont_upload_dir_info#:#Server directory from which large SCORM and HTML packages can be copied instead of being uploaded. Only cate administrators will see a selection of files from this directory. Please enter a full server path without trailing slash. +content#:#cont_verification_object#:#Certificate +content#:#cont_verification_placehl#:#Certificate Placeholder +content#:#lm_import#:#Import cate Learning Module +content#:#mob_upload_dir_info#:#Server directory from which multiple files can be used to create media objects in media pools. Only cate administrators will see a selection of files from this directory. Please enter a full server path without trailing slash. +content#:#sahs_insert_pg_from_clip#:#Import Pages from cate Learning Module +content#:#sahs_insert_st_from_clip#:#Import Chapters from cate Learning Module +content#:#sahs_insert_st_from_clip_inside_chap#:#Import Chapters from cate Learning Module (inside chapter) +content#:#seq_endsession#:#The current training event session has ended. +content#:#seq_toc#:#From the Table Of Contents on the left, choose an activity to begin the training event. +copa#:#obj_copa_duplicate#:#Duplicate Content Page +copg_pgcp_coin#:#copg_pgcp_coin_no_valid_object_selected#:#No valid qualification programm selected +copg_pgcp_coin#:#copg_pgcp_coin_prg_deleted#:#No valid qualification programm selected +copg_pgcp_coin#:#copg_pgcp_coin_prg_ref_id#:#Qualification programm +copg_pgcp_cosi#:#copg_pgcp_cosi_no_valid_object_selected#:#No valid qualification programm selected +copg_pgcp_cosi#:#copg_pgcp_cosi_prg_deleted#:#No valid qualification programm selected +copg_pgcp_cosi#:#copg_pgcp_cosi_prg_ref_id#:#Qualification programm +cron_crnhk_datachanges#:#cron_crnhk_datachanges_change_course_types_desc#:#Note: Renaming the training types only affects the historised training types. The training types must also be renamed in the "CourseClassification" plug-in, if the training types are still used there. +cron_crnhk_datachanges#:#cron_crnhk_datachanges_error_same_courses#:#A transfer of the attendances is not possible. The training events with the following ref. IDs have been booked by both users:
%s. +crs#:#crs_accept_subscriber_body#:#we are pleased to confirm your registration for the training event "%s". +crs#:#crs_activation_limited_visibility_info#:#If chosen, the training event is visible even outside of the given availability but members cannot access the training event. +crs#:#crs_activation_online_info#:#Set the training event online to make it visible and available for training event members. If not, only training event administrators and tutors will have access to it. +crs#:#crs_add_remove_from_desktop_info#:#Objects within the training event can be added to favourites. +crs#:#crs_added#:#Added new Training Event +crs#:#crs_added_member#:#Your registration for Training Event "%s" +crs#:#crs_added_member_body#:#we are pleased to announce your registration for the training event "%s". +crs#:#crs_admission_link_failure_availability#:#Can't register: training event is not online. +crs#:#crs_admission_link_failure_membership_limited#:#Can't register: training event membership is limited. +crs#:#crs_admission_link_failure_offline#:#Can't register: training event is offline. +crs#:#crs_admission_link_failure_registration_period#:#Can't register: training event is out of registration period. +crs#:#crs_admission_link_success_registration#:#Successfully registered to training event "%s". +crs#:#crs_agreement_required#:#You have to accept the user agreement, if you want to register to this training event. +crs#:#crs_at_least_one_admin#:#There has to be at least one training event administrator. +crs#:#crs_auto_notification_info#:#New members get a mail notification when added to the training event. +crs#:#crs_awrn_current_course#:#Current Training Event +crs#:#crs_awrn_current_course_info#:#If the user navigates to a training event in the repository, all members of the training event are listed. +crs#:#crs_awrn_support_contacts_info#:#All tutorial support contacts of training events with membership of the current user are listed. Users are defined as tutorial support contacts in the Members tab of the respective training event. +crs#:#crs_blocked_member#:#Membership blocked in Training Event "%s" +crs#:#crs_blocked_member_body#:#your membership for training event "%s" has been blocked. +crs#:#crs_breadcrumb_crs_only#:#Start with Training Event +crs#:#crs_cancel_subscription#:#User left Training Event "%s" +crs#:#crs_cancel_subscription_body#:#%s has cancelled his/her membership for the training event "%s". +crs#:#crs_cancel_subscription_body2#:#There might be other members on a waiting list of your training event. You should check for the waiting list now. To view the members of your training event, click here: +crs#:#crs_cancellation_end#:#Limit 'Unsubscribe from Training Event' +crs#:#crs_cancellation_end_info#:#Until the date selected members can unsubscribe from the training event. +crs#:#crs_cdf_edit_member#:#Edit Training Event Relevant User Data +crs#:#crs_cdf_tbl_last_edit#:#Updated (Training Event-specific Data) +crs#:#crs_content#:#Training Event Content +crs#:#crs_copy#:#Copy Training Event +crs#:#crs_course_status_of_users#:#Passing the Training Event +crs#:#crs_custom_user_fields#:#Training Event Relevant User Data +crs#:#crs_custom_user_fields_infobox#:#Create additional data fields for training event members to fill in when joining. You can show this information as an additional column in the "Members" tab. +crs#:#crs_details#:#Training Event Details +crs#:#crs_dismiss_member_body#:#your membership has been terminated in training event "%s". +crs#:#crs_enable_map#:#Enable Training Event Map +crs#:#crs_export#:#Training Event export +crs#:#crs_grouping_deleted#:#Deleted training event grouping. +crs#:#crs_grouping_select_one#:#Please select a training event grouping. +crs#:#crs_groupings#:#Training Event groupings +crs#:#crs_grp_already_assigned#:#You are already member of this grouping of training events. +crs#:#crs_grp_assign_crs#:#Assign Training Event +crs#:#crs_grp_assignments#:#Assignments of Training Event Members to Groups +crs#:#crs_grp_info_reg#:#You can only register to one of this Training Events: +crs#:#crs_grp_matriculation_required#:#This training event grouping requires an unique matriculation number.
Please insert this value in your personal settings. +crs#:#crs_grp_no_courses_assigned#:#No assigned training events. +crs#:#crs_grp_table_assigned_courses#:#Assigned training events +crs#:#crs_header_archives#:#Training Event Archives +crs#:#crs_header_delete_members#:#Would you like to remove the following members from this training event? +crs#:#crs_import#:#Import Training Event +crs#:#crs_info_agree#:#I accept, that the above data types are visible for training event administrators. +crs#:#crs_info_agreement#:#The following data types are visible for Training Event administrators: +crs#:#crs_info_reg_confirmation#:#You have to request for membership to access this training event. Please describe your interest for becoming member in the message form. You will be notified as soon as an administrator has accepted or declined your request. +crs#:#crs_info_reg_deactivated#:#training event admittance is closed. +crs#:#crs_info_reg_direct#:#You can join this training event directly. +crs#:#crs_info_reg_password#:#If a training event administrator has given you the training event password, you can join this training event. +crs#:#crs_info_settings#:#Training Event Information +crs#:#crs_info_start#:#Please work through all of the training event items stated below.
After you have processed all marked objects new training event items will be activated. +crs#:#crs_intro_course_group_notification_for#:#this is the news digest for your training events and groups, which have an active notification. +crs#:#crs_intro_course_group_notification_index#:#There are news for the period of %1$s to %2$s for the following training events and groups: +crs#:#crs_intro_training event_group_notification_for#:#this is the news digest for your training events and groups, which have an active notification. +crs#:#crs_intro_Training Event_group_notification_index#:#There are news for the period of %1$s to %2$s for the following Training Events and groups: +crs#:#crs_lim_assigned#:#Already assigned to associated training event "%s". +crs#:#crs_loc_confirm_delete_tst#:#Do you really want to deassign the test of this learning objective oriented training event? +crs#:#crs_loc_err_stat_no_materials#:#No Training Event Materials available +crs#:#crs_loc_form_assign_initial_info#:#Select a test from this Training Event to serve as Initial Test +crs#:#crs_loc_settings_err_qstart#:#The option "Final Test as Start Object" has been deactivated, since it can only be chosen for training events without initial test. +crs#:#crs_loc_settings_reset_enable_info#:#If activated, all users are able to reset their individual test results and start the training event again. +crs#:#crs_loc_settings_tbl#:#Settings for the Learning Objectives-Driven Training Event +crs#:#crs_loc_settings_type_it_none_info#:#training event members work self-directed through the learning objectives. They can take the final test to assess whether they mastered the learning objectives already or if additional learning and training is needed. +crs#:#crs_loc_type_initial_all_info#:#Based on individual results of the initial test, cate recommends learning content for the not-yet-sufficient learning objectives. The final achievement test assesses whether a test participant already mastered the learning objectives or if additional learning and training is needed. +crs#:#crs_loc_type_qualified_info#:#The training event starts with a test to assess if a training event member already mastered the learning objectives. For all passed learning objectives, users do not have to work through any of the learning content or take more tests. For all not-yet-sufficient learning objectives, cate recommends learning content. The mastery of the remaining learning objectives is tested in an additional test run. +crs#:#crs_mail_context_member_info#:#For the contact e-mails on the info screen of a Training Event +crs#:#crs_mail_context_member_title#:#Training Event: Info Page +crs#:#crs_mail_context_tutor_info#:#For the participant e-mails on the member and learning progress screens of a Training Event +crs#:#crs_mail_context_tutor_title#:#Training Event: Mail to Member +crs#:#crs_mail_permanent_link#:#Click on the following link to find all of the information you need regarding the Training Event: +crs#:#crs_map_location#:#Training Event Map Location +crs#:#crs_mem_tbl_header#:#Training Event Participants +crs#:#crs_members_deleted#:#Selected members were successfully removed from training event. +crs#:#crs_members_map#:#Training Event Members Map +crs#:#crs_members_print_title#:#Training Event members +crs#:#crs_min_one_admin#:#There has to be at least one administrator assigned to this training event. +crs#:#crs_my_courses_groups_enabled#:#My Training Events and Groups +crs#:#crs_my_courses_groups_enabled_info#:#If activated, the section 'My Training Events and Groups' is visible. +crs#:#crs_new_subscription#:#User registered for Training Event "%s" +crs#:#crs_new_subscription_body#:#%s has registered for training event "%s". +crs#:#crs_new_subscription_request#:#Request to join Training Event "%s" +crs#:#crs_new_subscription_request_body#:#%s has requested membership for training event "%s". +crs#:#crs_news#:#Training Event News +crs#:#crs_no_objective_lms_found#:#This training event does not contain learning material that could be assigned to the learning objective. +crs#:#crs_no_objectives_created#:#No Training Event Materials created +crs#:#crs_notification_explanation_admin#:#You receive mail from cate because you are training event administrator / tutor with notification enabled. +crs#:#crs_notification_salutation#:#Dear Training Event participant, +crs#:#crs_number_users_added#:#The following number of users has been assigned to the Training Event: +crs#:#crs_obj_initial_req_info#:#If this number of points is achieved, no training event materials will be recommended for further editing. +crs#:#crs_objective_status_configure#:#Checklist for Training Event +crs#:#crs_objective_status_materials#:#Create Training Event Content +crs#:#crs_objective_status_materials_info#:#The training event is currently empty. Add training event materials that can be assigned to learning objectives. +crs#:#crs_objective_status_settings#:#Training Event Settings +crs#:#crs_objective_wiz_materials#:#Assign Training Event Material +crs#:#crs_objective_wiz_materials_info#:#You can assign training event materials that are recommended for processing the learning objective. +crs#:#crs_objective_wiz_self_info#:#Please define the initial test questions. Initial tests are intended to examine the previous knowledge of the training event participants. +crs#:#crs_objectives_reset_sure#:#You want to delete all results of this training event.
All test results will be deleted. +crs#:#crs_open#:#Open Training Event +crs#:#crs_period_info#:#Information about the start and end date of the event, which is supported by the Training Event +crs#:#crs_ref_delete_confirmation_info#:#Would you like to remove the following members from this training event? If these members are to be removed from training events linked into this training event, please activate the respective checkboxes. +crs#:#crs_ref_member_update_info#:#All new members of the parent training event are automatically entered in the training event to which this training event link refers. +crs#:#crs_ref_missing_access#:#The option cannot be selected because you do not have "Manage Members" permission for either training event. +crs#:#crs_ref_missing_parent_crs#:#The option cannot be selected because this training event link does not have a parent training event. +crs#:#crs_reg_max_info#:#Define the maximum number of users that can be assigned to this training event. +crs#:#crs_reg_password_info#:#Users need to type in this password when joining the training event. +crs#:#crs_reg_user_already_subscribed#:#You have already requested membership for this Training Event +crs#:#crs_registration#:#Training Event Registration +crs#:#crs_registration_confirmation_info#:#Interested users can send a request/message to training event administrator. +crs#:#crs_registration_deactivated#:#Only training event administrators can add users to the training event. +crs#:#crs_registration_limited_info#:#Members can only register for this training event during a specific period of time. +crs#:#crs_reject_subscriber_body#:#we regret to say that your registration has been refused for the training event "%s". +crs#:#crs_settings#:#Training Event Settings +crs#:#crs_show_member_export_info#:#training event Members may print a list of participants. +crs#:#crs_show_members_info#:#If activated, training event members can access the members gallery. +crs#:#crs_sort_timing_info#:#Sort training event items be their activation time or timings settings. +crs#:#crs_status_changed_body#:#your status in training event "%s" has been changed. +crs#:#crs_status_determination_lp_info#:#When the learning progress changes to ‘Completed’, the training event status ‘Passed’ will be set automatically. Tutors still can overwrite the status manually. +crs#:#crs_status_determination_sync#:#The training event status will be automatically set to 'passed' once a learner completed all activities which determine the learning progress. Progress that was made before the change of settings will be accounted for, manually set 'passed' training event status remain unchanged. Do you want to set the training event status of all members based on their current learning progress now? +crs#:#crs_structure#:#Training Event structure +crs#:#crs_subscribe_member#:#Your registration for Training Event "%s" +crs#:#crs_subscribe_member_body#:#we are pleased to confirm your registration for the training event "%s". +crs#:#crs_subscribe_wl#:#Your registration for Training Event "%s" +crs#:#crs_subscribe_wl_body#:#you have been assigned to the waiting list of training event "%s". You are assigned to position %s on the list. You will receive a message from a training event administrator when your request has been approved or rejected. +crs#:#crs_subscription_min_members_info#:#Define the number of users that is minimally required for this training event to be held at all. If this number is not met either after the date until which users can register or unsubscribe from the training event a mail will be send to those training event administrators or tutors that have activated the 'Notification' flag in the 'Members'-tab. +crs#:#crs_subscription_options_password#:#Join with Training Event Password +crs#:#crs_subscription_successful#:#You have joined the Training Event +crs#:#crs_timings_activate_optional#:#Optional mode for Training Event timings +crs#:#crs_timings_activate_optional_own#:#Optional mode for my Training Event timings +crs#:#crs_timings_days_after_subsription#:#Day(s) after Training Event subscription +crs#:#crs_timings_short_limit_start_end_tt_rel#:#Latest end in days after Training Event subscription +crs#:#crs_timings_short_start_end_tt_rel#:#Suggested start after Training Event subscription +crs#:#crs_timings_update_error#:#Your settings are not valid, please verify the timings for the following Training Event materials: +crs#:#crs_Training Event_status_of_users#:#Passing the Training Event +crs#:#crs_unblocked_member#:#Access granted in Training Event "%s" +crs#:#crs_unblocked_member_body#:#your membership in training event "%s" has been restored. +crs#:#crs_unsubscribe_member#:#Your cancellation of membership in Training Event "%s" +crs#:#crs_unsubscribe_member_body#:#We confirm your cancellation of membership in training event "%s". +crs#:#crs_unsubscribe_member_explanation#:#You receive this message because you unsubscribed from the training event mentioned above. +crs#:#crs_unsubscribe_sure#:#Are you sure you want to unsubscribe from this training event? +crs#:#crs_unsubscribed_from_crs#:#You have been unsubscribed from this training event. +crs#:#crs_user_agreement_info#:#Visible Personal Data for Training Event Administrators +crs#:#crs_user_already_assigned#:#The chosen user is already assigned to this training event. +crs#:#crs_users_added#:#Added user to the Training Event +crs#:#crs_users_already_assigned#:#The user is already assigned to this Training Event +crs#:#crs_view_info_objective#:#training event for individualised studying: Performance on learning objectives organises the training event work. Content might be recommended based on individual performance in an initial test. A final test can be used to prove learning objective mastery. +crs#:#crs_view_mode#:#Training Event Presentation +crs#:#crs_view_objective#:#Learning Objectives-Driven Training Event +crs#:#crs_visibility_until_info#:#The training event will be visible to it's members in a specific period of time. +crs#:#crs_visibility_unvisible#:#The training event is not visible. +crs#:#crs_warn_no_max_set_on_waiting_list#:#The maximum number of training event members is exceeded. You can set yourself on the waiting list. You will receive a message from a training event administrator when your request has been approved or rejected. +crs#:#crs_warn_wl_set_on_waiting_list#:#Some users are already assigned to the waiting list. You can add your join request to the waiting list. You will receive a message from a training event administrator when your request has been approved or rejected. +crs#:#mem_cron_min_members_intro#:#The following training events and groups do not meet the minimum number of members (yet). +crs#:#mem_cron_min_members_subject#:#Training Event/Group: Minimum Members Check +crs#:#mem_cron_min_members_task#:#Please inform the participants if the training event will not take place because of not enough attendants. Adjust the settings afterwards. +crs#:#timing_tutor_visible#:#Remark is visible for Training Event tutors +crs#:#timings_reminder_notifications#:#Training Event Timings Notifications +crs#:#timings_reminder_notifications_info#:#If enabled, training event participants will be notified about exceeded timing materials. +crsv#:#crsv_create#:#Create Training Event Certificate +crsv#:#crsv_create_info#:#Select a completed Training Event to generate a certificate for it +dateplaner#:#back_to_crs#:#Go to Training Event +dateplaner#:#cal_adm_notification_info#:#Choose this option, to send optional mail notifications to training event/group participants about changed appointments. +dateplaner#:#cal_cg_notification#:#Training Event/Group Notification +dateplaner#:#cal_cg_registration_info#:#Gives users the possibility to register to training event and group appointments. +dateplaner#:#cal_cg_registrations#:#Registration for Training Event/Group Appointments +dateplaner#:#cal_ch_target_object_info#:#Consultation hours will be displayed in a block to the right of the training event / group content. To restrict the display of consultation hours to specific training events or groups, please enter the Ref-ID of the said objects. You find the Ref-ID in the URL of the respective objects. Add more than one Ref-ID separated by comma. Regardless of that, consultation hours may also appear in your e-portfolios. +dateplaner#:#cal_crs_info#:#Training Event Information +dateplaner#:#cal_crs_new_notification_body#:#a new appointment has been created in training event "%s". +dateplaner#:#cal_crs_new_notification_sub#:#New Appointment in Training Event "%s" +dateplaner#:#cal_crs_notification_body#:#an appointment has been changed in training event "%s". +dateplaner#:#cal_crs_notification_sub#:#Changed Appointment in Training Event "%s" +dateplaner#:#cal_download_files_started#:#cate is generating a ZIP archive of all available files. You can download them from the Notification Center (bell icon) on top right. +dateplaner#:#cal_err_invalid_notification_rcps#:#The list of notification recipients is not valid. Please choose only cate user account names or valid e-mail addresses. +dateplaner#:#cal_export_timezone_tz#:#Use cate-Timezone +dateplaner#:#cal_grp_curr_crs#:#Current Training Event +dateplaner#:#cal_notification_crsgrp#:#Notification for Training Event/Group Participants +dateplaner#:#cal_notification_info#:#If enabled, all training event/group participants will be notified per mail about this appointment. +dateplaner#:#cal_setting_global_crs_act#:#Activation in Training Events +dateplaner#:#cal_setting_global_crs_act_info#:#If selected, the calendar is active in training events by default. In any case the calendar activation can be enabled/disabled in the training event settings. +dateplaner#:#cal_setting_global_crs_vis#:#Show in Training Events +dateplaner#:#cal_setting_global_crs_vis_info#:#If enabled, a calendar block is shown in training events by default. In any case the calendar block can be enabled/disabled in the training event settings. +dateplaner#:#cal_timezone_info#:#Please choose the nearest city in your time zone to make sure that appointments within cate are displayed properly in your local time. +dateplaner#:#cal_type_crs#:#Training Event Calendar +dateplaner#:#cal_type_info#:#Please choose one calendar type. ‘Public Calendars’ are visible for all cate users. +dateplaner#:#cal_user_notification_info#:#Selected users will be notified about this appointment by e-mail. Please enter cate user names or e-mail addresses. +dateplaner#:#cal_user_timezone#:#cate-Timezone +dateplaner#:#crs_cal_activation_end#:#Training Event Availability ends +dateplaner#:#crs_cal_activation_start#:#Training Event Availability starts +dateplaner#:#crs_cal_end#:#Training Event ends +dateplaner#:#crs_cal_start#:#Training Event starts +dcl#:#dcl_ilias_reference#:#Link to an cate module +dcl#:#dcl_ilias_reference_desc#:#Searchfield to select an cate object. +dcl#:#dcl_prop_expression_info#:#Supported operators: %s
Supported functions: %s
Use brackets ‘(’, ‘)’ to group calculations.
Concatenate strings and placeholders with &: ‘The result is ’ & [[Int 1]] * [[Int2]]
Using functions: SUM([[Int 1]];[[Int 2]])

Available fields (click on title to copy field inside expression):
%s +exc#:#exc_reminder_start_info#:#All members of the parent training event/group will be sent reminders.
No parent training event/group given - no reminder will be sent! +exc#:#exc_team_by_random_info#:#cate will allocate participants to a set number of teams. +exc#:#exc_team_by_tutors_info#:#Tutors allocate participants to teams, participants cannot self-organize. +exc#:#exc_team_by_tutors_manual_info#:#Tutors manually allocate participants to teams. +exc#:#exc_team_member_container_add#:#Add Team Member from Training Event/Group +form#:#form_link_internal#:#Inside cate +forum#:#fmr_copy_threads_info#:#You have the possibility to copy single threads. Only the beginning of the chosen threads will be duplicated. +forum#:#forums_notification_intro#:#This mail was automatically sent to you by the cate installation %s, %s +forum#:#frm_noti_obj_crs#:#Training Event +grp#:#grp_notification_explanation_admin#:#You receive mail from cate because you are group administrator with notification enabled. +grp#:#grp_view_inherit_info#:#The group presentation type is adopted from a parent training event. +lng#:#lng_download_deprecated#:#Download Deprecated List +lso#:#lso_notification_explanation_admin#:#You receive mail from cate because you are learning sequence administrator with notification enabled. +mail#:#chat_users_without_login#:#The following users don't have an cate account and can't be invited to a chat room: +mail#:#mail_auto_generated_info#:#This mail was automatically sent to you by the cate installation %s, %s +mail#:#mail_crs_list_members_not_available#:#It is not possible to list the members of the marked training events. +mail#:#mail_crs_list_members_not_available_for_at_least_one_crs#:#The members of at least one selected training event can not be listed. +mail#:#mail_crs_roles#:#Send Mail to Training Event Roles +mail#:#mail_enable_crs_admin_notification#:#Notify Training Event Administrators +mail#:#mail_enable_crs_admin_notification_info#:#In new training events the setting 'Notification About New Members' will be activated by default. It is set in the 'Member'-tab of training events. training event administrators will receive an e-mail when a member joins the training event or leaves it or if the minimally required number of participants is not met the training event needs to take place. +mail#:#mail_enable_crs_member_notification#:#Notify Training Event Members +mail#:#mail_enable_crs_member_notification_info#:#cate will automatically send an e-mail to every training event member if his or her membership status is changed. This setting applies to all training events on the platform. +mail#:#mail_enable_grp_admin_notification_info#:#In new groups the setting 'Notification' will be activated by default. It is set in the 'Member'-tab of groups. training event administrators will receive an e-mail when a member joins the group or leaves it or if the minimally required number of participants is not met the group needs to take place. +mail#:#mail_enable_grp_member_notification_info#:#cate will automatically send an e-mail to every group member if his or her membership status is changed. This setting applies to all groups on the platform. +mail#:#mail_enable_lso_member_notification_info#:#cate will automatically send an e-mail to every member if his or her membership status is changed. This setting applies to all Learning Sequences on the platform. +mail#:#mail_my_courses#:#My Training Events +mail#:#mail_nacc_ilias_url#:#URL of cate system +mail#:#mail_nacc_target#:#URL of target item, e.g. a linked training event that is passed to cate from outside. +mail#:#mail_nacc_target_title#:#Title of target item, e.g. training event title. +mail#:#mail_nacc_target_type#:#Type of target item, e.g. ‘training event’ for a training event item. +mail#:#mail_notify_orphaned_info#:#If you enter a value here is larger than or equal to 1, cate will send an e-mail to the user before an internal mail is deleted. Please make sure that an external e-mail reception is possible. +mail#:#mail_select_course#:#Please select at least one training event. +mail#:#mail_smtp_status_info#:#If enabled, cate will dispatch external e-mails to an SMTP server instead of using the the internal functionality provided by the PHP runtime (mail() function, sendmail). +mail#:#mail_system_usr_from_addr_info#:#Please enter the e-mail address to be put in the 'FROM' header. The 'FROM' header is used to display the sender in the recipient e-mail client. The e-mail address of the user sending an e-mail via cate will be automatically put in the 'Reply-To' header.

Examples: info@institution.de or no-reply@institution.de +mail#:#mail_template_no_context_available#:#There is no context provided by any cate service or module. Thus it is not possible to create or edit a text template. +mail#:#only_inbox_trash_info#:#If enabled, e-mails are only deleted if they are located in the Inbox and Trash of the respective user. Otherwise, all messages are deleted regardless of the folder. +mail#:#show_mail_settings_info#:#Mail Settings' are visible via the 'Personal Settings' or 'Mail' section. The permission to change these settings depends on the configuration of the user profile in cate. If users do not have the permission to change these profile settings the global default is applied even if users were able to and did change their personal mail settings in the past. +maps#:#maps_enable_maps_info#:#Activates Maps in user profiles, groups and training events. +mcst#:#mcst_duration_info#:#If no value is entered, cate tries do determine the play time automatically. +mcst#:#mcst_news_item_visibility_info#:#Public news can be accessed without authentication outside of cate via RSS. Please do not include any confidential information. +meta#:#meta_training#:#Training +mmbr#:#mmbr_awrn_my_groups_courses#:#My Groups and Training Events +mmbr#:#mmbr_awrn_my_groups_courses_info#:#All members of groups or training events of the current user are listed. +mme#:#field_ref_id#:#cate Reference-ID +mme#:#field_ref_id_info#:#The Reference-ID of the desired cate-Object from the Repository, you find the Reference-ID in the URL of a object (...?ref_id=123) +mob#:#mob_upload_multi_srt_howto#:#The .zip file should contain no subdirectory, all .srt files should be located on the top level. The file names should end with "_<lang code>.srt" where lang code is e.g. "en", "it", "de". +mst#:#mst_courses_of#:#Training Event Memberships of %s +mst#:#mst_download_certificate#:#Download Certificate +mst#:#mst_list_certificates#:#Certificates +mst#:#mst_list_courses#:#Training Event Memberships +mst#:#mst_please_select_course#:#Please select a training event. +mst#:#mst_select_course#:#Select Training Event +mst#:#mst_show_courses#:#Training Event Memberships +news#:#news_enable_internal_news_info#:#Activates news blocks for categories, training events, groups and other objects. Users can subscribe to news and news are presented on the dashboard. +news#:#news_enable_private_feed_info#:#If this option is enabled, public and private news can be obtained by personal RSS feeds outside of cate. Authentication is provided by password. +news#:#news_news_item_def_visibility_users_info#:#Only authenticated users have access to current news. +news#:#news_news_item_visibility_info#:#Public news can be accessed without authentication outside of cate via RSS. Please do not include any confidential information. +news#:#news_notifications_public_info#:#If this option is enabled, notifications can be obtained by personal RSS feeds outside of cate. Please note that this makes notifications accessible without authentication. +news#:#news_nr_of_items_info#:#Number of news items that are kept for an object (e.g. a file or a learning module) in the database. Please note, that container objects (e.g. categories, training events) may list more items, because they aggregate news of sub-objects. +news#:#news_visibility_users#:#Authenticated Users +news#:#passwd_equals_ilpasswd#:#Please enter a password different from your cate-password. +note#:#note_comment_notification_reason#:#You receive this message because your account is listed as a global recipient for all comments in the cate administration. +obj#:#obj_import_file_error#:#This file could not be imported. Please make sure that this is a valid cate export file (XML Export), of the same object type. The filename must not be modified after export. Error Message: +obj#:#obj_tile_image_info#:#The tile image will be used, if the container (training event, folder, group, ...) activates the tile view presentation. +obj#:#obj_tool_ext_mail_subject_prefix_info#:#Entered text is included in the subject line of external emails. This makes it easier to identify and filter e-mails from different trainings or groups. +orgu#:#org_op_access_enrolments#:#View Training Event Memberships +orgu#:#orgu_enable_my_staff_info#:#A main menu entry is presented that may comprise Staff List, Training Event Memberships, Certficates, Competences, Talks. +pd#:#pd_my_memberships_intro2#:#This is your personal space for all training events and groups you participate in. Currently, there aren't any memberships assigned to you. To become a member of a training event or group, there are two ways:
  1. You can join training events or groups provided that joining them has been allowed by their administrators.
  2. An administratrator of a training event or group can assign a membership to you.

In any case, the respective objects will appear automatically in this place. +prg#:#content_automation_title#:#Automatically add and remove training event from these categories +prg#:#crs_affiliation_to_prg#:#Affiliation to Qualification Programmes +prg#:#info_to_re_assign_mail_body#:#%s %s,

The validity of your qualification in the qualification programm '%s' will soon expire. Please sign in again. +prg#:#info_to_re_assign_mail_subject#:#Reminder to process the Qualification Programme once more +prg#:#label_crs#:#Training Event Name +prg#:#mails_foreign_assignment_failed#:#Selected assignments are not in current context. Mails should be sent from Qualification Programme's top node. +prg#:#msg_acknowledge_courses#:#Completed training events have been acknowledged. +prg#:#obj_prg_select#:#-- Please select a Qualification Programme -- +prg#:#prg_acknowledge_completed_courses#:#Acknowledge Training Events Already Completed +prg#:#prg_add#:#Add Qualification Programme +prg#:#prg_added_course_ref_successful#:#New training event link was added successfully +prg#:#prg_added_Training Event_ref_successful#:#New Training Event link added successfully +prg#:#prg_assessment#:#Qualification Programme Assessment +prg#:#prg_auto_member_select_crs#:#Training Events +prg#:#prg_can_not_manage_in_repo#:#You're not allowed to change this qualification programme because of existing enrolments. +prg#:#prg_copy_threads_info#:#Please decide which qualification programme elements are to be copied, linked or omitted. +prg#:#prg_create_new_leaf#:#Create new Training Event link +prg#:#prg_deadline_date_desc#:#The qualification programme must be completed until the date specified here, which applies equally to all enrolments. +prg#:#prg_deadline_period_desc#:#After enrolment, the qualification programme must be completed within the period (in days) specified here. +prg#:#prg_edit#:#Edit Qualification Programme +prg#:#prg_invalidate_expired_progresses_desc#:#Marks expired qualifications in qualification programmes 'invalid'. +prg#:#prg_invalidate_expired_progresses_title#:#Limited validity of qualifications in qualification programmmes +prg#:#prg_mail_context_info#:#For e-mails to enrolled users from a qualification programme +prg#:#prg_mail_context_title#:#Qualification Programme: Mail to Enrolled Users +prg#:#prg_mail_permanent_link#:#Click on the following link to find all of the information you need regarding the qualification programm: +prg#:#prg_manage_members#:#Manage Enrolments of a Qualification Programme +prg#:#prg_mark_accredited_success#:#Accredited user in qualification programme successfully. +prg#:#prg_mark_not_relevant_multi_success#:#Declare Qualification Programme Not Relevant For Selected Users +prg#:#prg_mark_relevant_multi_success#:#Declare Qualification Programme Relevant For Selected Users +prg#:#prg_more_objects_without_read_permission#:#The qualification programme contains more objects than you can see because of lacking permissions. +prg#:#prg_new#:#New Qualification Programme +prg#:#prg_no_members_not_active#:#You cannot add enrolments because this qualification programme is not active. +prg#:#prg_open_node#:#Switch to this Qualification Programme +prg#:#prg_please_select_a_course_for_creating_a_leaf#:#Please select a training event for creating a training event link leaf +prg#:#prg_please_select_a_Training Event_for_creating_a_leaf#:#Please select a Training Event for creating a Training Event link leaf +prg#:#prg_points_byline#:#When users have successfully completed this qualification programme or have been accredited, they achieve this amount of points. The qualification programme passes these points on to a superordinated programme levels, if there is one. If there are subordinate programme levels, users must achieve this minimum amount of points in those programme levels. +prg#:#prg_prg_type#:#Qualification Programme Type +prg#:#prg_progress_info#:#You have %1$d points. The qualification programme is completed with %2$d points. +prg#:#prg_restart_assignments_temporal_progress_desc#:#Enrols users to the Qualification Programme once more after validity of qualification expires +prg#:#prg_restart_assignments_temporal_progress_title#:#Automatically repeat Qualification Programme enrolments +prg#:#prg_show_programmes_on_pd_always#:#qualification programmes are always visible on Dashboard. +prg#:#prg_show_programmes_on_pd_only_read#:#Qualification programmes are only visible on Dashboard with ‘read’ permissions. +prg#:#prg_type#:#Qualification Programme Type +prg#:#prg_type_add#:#Qualification Programme Type +prg#:#prg_type_msg_unable_delete#:#Unable to delete type because it is still assigned to the following Qualification Programmes: %s +prg#:#prg_user_not_restarted_desc#:#Sends users a warning e-mail when the validity of a qualification in a qualification programme expires and they have not started the qualification programme once more. +prg#:#prg_user_risky_to_fail_desc#:#Sends users a warning mail if they are at the risk to fail a qualification programme due to a deadline. +prg#:#prgr_may_not_create_circular_reference#:#This qualification programme may not be linked here since the parent object is alredy linked within the target. +prg#:#re_assigned_mail_body#:#%s %s,

you were enrolled to qualification programme '%s' once more. +prg#:#re_assigned_mail_subject#:#Repeated enrolment to the qualification programme +prg#:#restart_information#:#Notification on being automatically enrolled once more to a Qualification Programme when expiry date of qualification validity approaches +prg#:#risky_to_fail_mail_body#:#%s %s,

the due date for completing the qualification programme '%s' is approaching. +prg#:#risky_to_fail_mail_subject#:#Reminder of approaching end of processing period in the Qualification Programme +prg#:#select_crs#:#Search for Training Events +prg#:#send_info_to_re_assign_mail_info#:#Send an e-mail to remind the user to restart the qualification program. +prg#:#send_re_assigned_mail_info#:#Sends an e-mail notification when users are automatically enrolled to the qualification programme once more. +prg#:#send_risky_to_fail_mail_info#:#Sends an e-mail when the end of the processing period approaches while the qualification programme has not been completed yet. +prg#:#sp_certificate_description#:#Description of the Qualification Programme +prg#:#sp_certificate_title#:#Title of the Qualification Programme +prg#:#sp_certificate_type#:#Type of the Qualification Programme +prg#:#validity_qualification_period_desc#:#After the qualification programme has been completed, the qualification will expire after the number of days specified here. +prtf#:#prtf_allow_my_courses#:#Page Element 'My Training Events' +prtf#:#prtf_allow_my_courses_info#:#Portfolios may include a list showing which training events the user is currently a member of. +prtf#:#prtf_page_element_my_courses_info#:#This is a list of all my training events which are currently online and where I have a membership. +prtf#:#prtf_page_element_my_courses_title#:#Training Event Memberships +prtf#:#prtf_page_element_teaser_my_courses#:#The portfolio will display a list of your current training events here. +ps#:#crs_ps_cdf_info#:#Further Training Event-Specific Data: +ps#:#crs_ps_required_info#:#Further Events-Specific fields are required for accessing the training event content. +ps#:#ps_auto_https_description#:#If enabled, cate tries to detect the HTTPs Status by analysing the header value specified below. +ps#:#ps_cdf_warning_modify#:#Attention: Minimum one user has accepted the user agreement. Modifying these training event specific fields will reset all user agreements. +ps#:#ps_crs_user_fields#:#Training Event-Specific User Fields +ps#:#ps_export_confirm#:#User Confirmation when Entering Training Events +ps#:#ps_export_course#:#Allow export of user profile data in training events +ps#:#ps_login_max_attempts_info#:# Sets the maximum number of unsuccessful attempts to login. After the maximum number of unsuccessful attempts is exceeded, the respective user will be set to 'inactive' and would require re-activation in User Management. Leave the field empty to disable this option and cate will not count failed login attempts. +ps#:#ps_participants_list_courses#:#Allow Activation of Participant Lists in the Member Gallery of Training Events +ps#:#ps_show_crs_access#:#Show last access time of Training Event participants +pwassist#:#password_assistance#:#Login Assistance +pwassist#:#pwassist_disabled_no_access#:#Login assistance is not enabled. Please contact the system administration for further assistance: %s +pwassist#:#pwassist_enter_email#:#Please enter an e-mail address and submit the form. cate will send an e-mail to that address. The e-mail contains all user names which have registered this e-mail address. Choose a suitable username and use the password service to retrieve a new password. If you do not retrieve any e-mail by this service please contact your training event admin or %1$s. +pwassist#:#pwassist_enter_username_and_email#:#Enter a username and the associated e-mail address in the fields shown below. cate will send a message to that e-mail address. The message contains an address for a web page, where you can enter a new password for the user account. In case you are unable to assign a password to your user account using this form, contact your training event administration or send an e-mail to %1$s. +pwassist#:#pwassist_enter_username_and_new_password#:#Enter the username for which you asked for login assistance and the new password. +pwassist#:#pwassist_login_not_match#:#Please enter another username. The username you have entered does not match the username for which you asked for login assistance. +pwassist#:#pwassist_mail_body#:#Hello,\n\nTo reset your password, proceed as follows:\n\n1. Copy the following address into your browser:\n%6$s\n\n2. In the next step, reset your password.\n\nPlease note:\nFor security reasons, you can only carry out this process exactly once and within a limited time. After that, the address will become invalid and you will have to request login support again.\n\nIf you have not requested a password reset, please contact the system administrators.\n +pwassist#:#pwassist_mail_sent_generic#:#A message has been sent to the email address defined in cate. Please check your mail box. +pwassist#:#pwassist_mail_subject#:#Login Assistance +pwassist#:#pwassist_session_expired#:#Please request login support again. The validity of the address for performing login support has expired. This may have happened because you have tried to use the address that was sent to you by e-mail more than once, or because too much time has passed since the address was sent to you. +pwassist#:#pwassist_username_mail_body#:#Hello,\n\nYou have just requested your user name.\n\nThese are the active username found for the given e-mail address: %s\n\nIf you didn't request your username being sent to you, please contact user service.\n +rbac#:#cals_edit_event#:#User can create and edit public calendars and events in cate +rbac#:#cert_edit_permission#:#User can change permission settings of Certificates administration +rbac#:#cert_read#:#User has read access to Certificates Administration +rbac#:#cert_visible#:#Certificates Administration is visible +rbac#:#cert_write#:#User can edit settings in Certificates Administration +rbac#:#crs_copy#:#User can copy Training Event +rbac#:#crs_delete#:#User can move or delete Training Event +rbac#:#crs_grade#:#Grade Members of Training Event +rbac#:#crs_join#:#User can join Training Event +rbac#:#crs_leave#:#User can unsubscribe from Training Event +rbac#:#crs_manage_members#:#Manage Members of Training Event +rbac#:#crs_news_add_news#:#Add and edit own news entries in Training Event +rbac#:#crs_read#:#User has read access to Training Event +rbac#:#crs_visible#:#Training Event is visible +rbac#:#crs_write#:#User can edit Training Event settings and manage content +rbac#:#crsr_copy#:#User can copy Training Event link +rbac#:#crsr_delete#:#User can move or delete Training Event link +rbac#:#crsr_visible#:#Training Event link is visible +rbac#:#crsr_write#:#User can edit settings of Training Event link +rbac#:#crss_edit_permission#:#User can change permission settings in Training Event administration +rbac#:#crss_read#:#User has read access to Training Event administration +rbac#:#crss_visible#:#Training Event administration is visible +rbac#:#crss_write#:#Edit settings in Training Event administration +rbac#:#ilias_id#:#cate-ID +rbac#:#lm_copy#:#User can copy cate learning module +rbac#:#lm_delete#:#User can move or delete cate learning module +rbac#:#lm_read#:#User can read cate learning module +rbac#:#lm_visible#:#cate Learning Module is visible +rbac#:#lm_write#:#User can edit content and settings of cate learning module +rbac#:#mail_internal_mail#:#User can use internal mail system (cate) +rbac#:#prg_copy#:#User can copy Qualification Programme +rbac#:#prg_delete#:#User can delete Qualification Programme +rbac#:#prg_manage_members#:#Manage members of Qualification Programme +rbac#:#prg_read#:#User has read access to Qualification Programme +rbac#:#prg_visible#:#Qualification Programme is visible +rbac#:#prg_write#:#User can edit settings of Qualification Programme +rbac#:#prgr_copy#:#User can copy links to Qualification Programmes +rbac#:#prgr_delete#:#User can move or delete links to Qualification Programmes +rbac#:#prgr_visible#:#Links to Qualification Programmes are visible and can be used +rbac#:#prgr_write#:#User can edit settings of links to Qualification Programmes +rbac#:#prgs_edit_permission#:#Change permission settings in Qualification Programme administration +rbac#:#prgs_read#:#User has read access to Qualification Programme administration +rbac#:#prgs_visible#:#Qualification Programme administration is visible +rbac#:#prgs_write#:#Edit settings in Qualification Programme administration +rbac#:#ps_export_member_data#:#User can export member data in Training Events and groups +rbac#:#rbac_create_crs#:#Create Training Event +rbac#:#rbac_create_crsr#:#Create Training Event Link +rbac#:#rbac_create_lm#:#Create cate Learning Module +rbac#:#rbac_create_prg#:#Create Qualification Programme +rbac#:#rbac_create_prgr#:#Create link to Qualification Programme +rbac#:#rbac_create_rcrs#:#Create ECS Training Event +rbac#:#rbac_role_delete_self#:#Attention: You are assigned to this role. If you continue this delete operation, you may loose access to some cate materials. +rbac#:#rbac_unprotected_delete_local_policies_info#:#If activated, all local policies will be deleted. Permissions in training events and groups will be newly initialized. +rbac#:#rcrs_delete#:#User can move or delete ECS Training Event +rbac#:#rcrs_read#:#User can use ECS Training Event +rbac#:#rcrs_visible#:#ECS Training Event is visible +rbac#:#rcrs_write#:#User can edit settings of ECS Training Event +rbac#:#seas_search#:#User can use the global search in cate +registration#:#reg_allowed_domains_info#:#Use * as a wildcard and ; as a separator, e.g. "*@cate.de". Registration codes override these rules. +registration#:#reg_confirmation_link_successful#:#You successfully submitted an account request to cate. You will receive a confirmation e-mail in the next minutes. Please confirm your registration by clicking the confirmation link in this mail.
You will be redirected to the login screen after 20 seconds. +registration#:#reg_mail_body_approve#:#You already have registered to cate eLearning and received a e-mail with your account data. Now your account has been activated by an administrator. +registration#:#reg_mail_body_confirmation#:#To confirm this registration enter the cate user administration and activate the account. +registration#:#reg_mail_body_reason#:#You receive mail from cate because notifications about new registrations are enabled for your account in the cate administration. +registration#:#reg_type_confirmation_info#:#This type allows self-registration of users but requires an e-mail confirmation to activate the account. This avoids self-registration to cate with wrong or non-existent e-mail addresses. +registration#:#registration_settings#:#cate Auth / Self-Registration +rep#:#rep_breadcr_crs#:#Breadcrumb starts with Training Event +rep#:#rep_breadcr_crs_overwrite#:#Setting is changeable on Training Event level +rep#:#rep_breadcr_crs_overwrite_not#:#Setting is not changeable on Training Event level +rep#:#rep_export_limitation_info#:#Limits the number of objects for container exports (training events, categories, ...) in the repository. +rep#:#rep_mo_mem_dash#:#You are currently not yet a member of a training event or group. +rep_robj_xbkm#:#rep_robj_xbkm_not_below_course#:#This object is not located inside training event and is therefore restricted in its functionality. +rep_robj_xpay#:#rep_robj_xpay_not_below_course#:#This object is not located inside training event and is therefore restricted in its functionality. +rep_robj_xpay#:#rep_robj_xpay_placeholder_desc_cancellation_fee#:#Effective cancellation fee for the respective training event in EUR +sahs#:#sahs_authoring_mode_info#:#The SCORM ZIP package must have been created with the cate SCORM editor and it must have been exported as SCORM 1.2/2004 package. +sahs#:#sahs_std_sequencing_info#:#Use cate standard sequencing behaviour. +scormdebug#:#cmi.completion_status#:#Indicates whether the learner has completed the SCO +scormdebug#:#cmi.credit#:#Indicates whether the learner will be credited for performance in the SCO +scormdebug#:#cmi.exit#:#Indicates how or why the learner left the SCO +scormdebug#:#cmi.objectives.n.completion_status#:#Indicates whether the learner has completed the associated objective +scormdebug#:#cmi.objectives.n.success_status#:#Indicates whether the learner has mastered the objective +scormdebug#:#cmi.success_status#:#Indicates whether the learner has mastered the SCO +scormdebug#:#cmi.time_limit_action#:#Indicates what the SCO should do when cmi.max_time_allowed is exceeded +scormdebug#:#i_gray#:#gray: error corrected by cate +search#:#lucene_prefix_wildcard_info#:#Supports prefix wildcard queries: ‘*LIAS’ finds ‘cate’ +search#:#search_add_members_from_container_crs#:#Add Users of Current Training Event +search#:#search_crs_title#:#Training Event Name +search#:#search_for_crs_members#:#Search for Training Events +sess#:#objs_crs_role#:#Training Event Roles +sess#:#sess_notification_option_inherit_info#:#Use the parent notification settings (e.g. notification settings from training event or group) for members of this session +sess#:#sess_reg_cannot_participate_info#:#Users can indicate that they cannot participate in the session. +style#:#enable_system_styles_management_no_write_perm#:#System styles management is enabled but cate does not have write permission on the Customizing/global/skin folder. No new styles can therefore be created/edited. +style#:#less_compile_failed#:#Something in the compilation of the less file went wrong. Is lessc installed and the path set correctly in cate setup? Original error: +style#:#style_page_layout_module_learning_module#:#cate Learning Module +survey#:#concatenation#:#Concatenation +survey#:#duplicate#:#Duplicate +survey#:#survey_notification_target_group_parent_course#:#All members of parent training event / group +survey#:#survey_notification_target_group_parent_course_inactive#:#No parent training event / group given - no reminders will be sent! +survey#:#svy_activation_limited_visibility_info#:#Outside the indicated period, only the title of the survey will be displayed while the question are not accessible. +sysc#:#sysc_task_tree_duplicates#:#Duplicate Entries in Repository Tree +sysc#:#sysc_task_tree_duplicates_desc#:#Search for duplicate entries in the repository tree structure. +sysc#:#sysc_tree_duplicate_failures#:#Found duplicate entries in tree structure. Number of duplicate entries +taa#:#tad_clean_files_title#:#Delete Files Created on Download by Token +taa#:#tad_clean_files_description#:#Deletes files created by retrieval via download by token. +tms#:#crs_affiliation_to_prg#:#Allocation in Qualification Programmes +tms#:#current_open_approval#:#Approval process for this training event already started +tms#:#not_min_member#:#Only display training events for which the minimum number of participants has not yet been reached. +tms#:#t_course#:#View: Training Event +tms#:#usr_has_status_on_course_no_cancel#:#You can no longer cancel this booking, because a participation has already been recorded. When you reload the page, the entry disappears. +tos#:#tos_form_document_content_changed#:#The contents of the uploaded file was purified by cate. Please check the result and upload a new file, if necessary. +tos#:#tos_reevaluate_on_login_desc#:#If enabled, cate checks if the user has to accept a new document after successful login. This applies for the cased, where the criteria of a signed document do not match anymore, and a new document can be determined based on the current user criteria. +tos#:#tos_status_desc#:#If activated, users are forced to accept the terms of service before they can enter cate. +trac#:#trac_crs_objects#:#Training Event Participants +trac#:#trac_defaults_info#:#Set the completion status determination mode for supported object types. Used by certain badge types and certificates. +trac#:#trac_mode_course_reference#:#Adopted from Training Event +trac#:#trac_mode_course_reference_info#:#The mode is automatically adopted from the training event this training event link points to. +trac#:#trac_mode_study_programme#:#Qualification Programme Completed +trac#:#trac_mode_Training Event_reference#:#Adopted from Training Event +trac#:#trac_mode_training event_reference_info#:#The mode is automatically adopted from the training event this training event link points to. +trac#:#trac_object_stat_lp#:#Learning Progress Statistics Training Event +trac#:#trac_sure_delete_data#:#Are you sure you want to delete the complete data for the following months? This will remove all statistics for that period incl. Usage Intensity, Daily Usage, Learning Progress Statistics Training Events and Number of Objects. +trac#:#trac_view_crs#:#Back to Training Event +tstv#:#tstv_create#:#Create Test Certificate +tstv#:#tstv_create_info#:#Select a completed test to generate a certificate for it. +ui#:#datatable_multiaction_label#:#Bulk Actions +ui#:#datatable_multiactionmodal_actionlabel#:#Action +ui#:#datatable_multiactionmodal_buttonlabel#:#Apply +ui#:#datatable_multiactionmodal_listentry#:#Overall Actions (no selection required) +ui#:#datatable_multiactionmodal_msg#:#Attention!
  • Table with multiple pages: Action also captures table entries that are currently not visible
  • Table with filter:
    Action captures all filtered entries
+ui#:#datatable_multiactionmodal_title#:#Overall Actions (no selection possible) +ui#:#ui_file_input_general_error#:#An error occurred! You can check the JavaScript console of your browser for more information and/or contact your cate system administration about this incident. +ui#:#ui_pagination_unlimited#:#Unlimited +user#:#del_mail_body#:#Hello %1$s, %2$s You have not logged in to %3$s for a long time. Therefore, your cate account is expected to be deleted on %4$s. In order to keep your cate account, you must log in again before the aforementioned date. +user#:#del_mail_subject#:#(cate) – Your account will be deleted +user#:#user_account_code_setting_info#:#Users can re-activate their expired user account with a pre-defined code. Corresponding codes for the renewal of temporary cate accounts are generated in 'Administration " Users and Roles " Authentication and Registration', tab 'cate Auth / Self-Registration : Registration Codes'. Inactive accounts cannot be re-activated by codes. +user#:#user_delete_own_account_final_confirmation#:#Please confirm for the last time to remove your user account from cate! +user#:#user_delete_own_account_logout_confirmation#:#Your account has been flagged for deletion. Please authenticate to continue the process. +user#:#user_member_of_course_group#:#Member of Training Event/Group +user#:#user_member_of_Training Event_group#:#Member of Training Event/Group +user#:#user_no_courses#:#No Training Events Assigned +user#:#user_please_select_course_group#:#Please select a training event or a group. +user#:#user_please_select_training event_group#:#Please select a training event or a group. +user#:#user_screen_reader_optimization_info#:#Improve cate for usage with screen readers. +user#:#user_select_course_group#:#Select Training Event/Group +user#:#user_select_Training Event_group#:#Select Training Event/Group +user#:#usr_public_profile_logged_in#:#Visible to logged-in users of cate \ No newline at end of file diff --git a/lang/customizing/ilias_en.lang.local b/lang/customizing/ilias_en.lang.local new file mode 100644 index 000000000000..f1e6807805c2 --- /dev/null +++ b/lang/customizing/ilias_en.lang.local @@ -0,0 +1,19 @@ +/* Copyright (c) 1998-2024 ILIAS open source eLearning e.V., Extended GPL, see docs/LICENSE */ +/** +* ILIAS language file (All entries) +* +* @module language file custom german +* @modulegroup language +* @author CaT +* @version $Id: ilias_de.cate.lang.local +*/ +// The language file starts beyond the HTML-comment below. DO NOT modify this line! +// To edit your language file with a spreadsheet (i.e. Excel or StarCalc) remove all lines +// from the first line to the HTML-comment. After editing paste the lines in place again. +// NOTICE: Character coding of all ILIAS lang files is UTF-8! Please set your editor +// to the corresponding mode! +// Language file names refer to ISO 639, see: http://www.oasis-open.org/cover/iso639a.html + +assessment#:#assKprimChoice#:#A NEW VALUE +assessment#:#assLongMenu#:#A NEW VALUE +assessment#:#NEW_ENTRY#:#A NEW VALUE diff --git a/lang/ilias_ar.lang b/lang/ilias_ar.lang index a3378ec00ca4..efc115353534 100644 --- a/lang/ilias_ar.lang +++ b/lang/ilias_ar.lang @@ -214,7 +214,7 @@ administration#:#language_former_file_equal#:#The file %s is identical to administration#:#language_former_file_missing#:#The file %s is missing. administration#:#language_import_file#:#استيراد ملف لغة administration#:#language_load_local_changes#:#تحميل ملف اللغة المحلي في قاعدة البيانات -administration#:#language_load_local_changes_info#:#Load the file Customizing/global/lang/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten.###07 11 2014 new variable +administration#:#language_load_local_changes_info#:#Load the file lang/customizing/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten.###07 11 2014 new variable administration#:#language_loaded_local#:#The local language file was loaded into the database. administration#:#language_local_file_deleted#:#The local language file was deleted. administration#:#language_maintain#:#الصيانة @@ -235,12 +235,12 @@ administration#:#language_mode_existing_replace_info#:#Import new entries and re administration#:#language_note_translation#:#تم تفعيل طريقة ترجمة الصفحة لكل لغة على حدا. بالاضافة الى ان المستخدم يحتاج لقراءة وكتابة الصلاحية على مجلد اللغة. administration#:#language_process_maintenance#:#تنفيذ الصيانة administration#:#language_remove_local_file#:#حذف ملف اللغة المحلية -administration#:#language_remove_local_file_info#:#Remove the file Customizing/global/lang/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched.###07 11 2014 new variable +administration#:#language_remove_local_file_info#:#Remove the file lang/customizing/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched.###07 11 2014 new variable administration#:#language_save_dist#:#Backup the standard language file###25 10 2016 new variable administration#:#language_save_dist_failed#:#The backup of the standard ILIAS language file could not be written.###25 10 2016 new variable administration#:#language_save_dist_info#:#Create a backup of the standard ILIAS language file in the ILIAS data directory. This helps after an ILIAS update to find conflicst of own changes with updated language variables.###25 10 2016 new variable administration#:#language_save_local_changes#:#حفظ جميع التغيرات على ملف اللغة المحلي -administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file Customizing/global/lang/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation.###07 11 2014 new variable +administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file lang/customizing/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation.###07 11 2014 new variable administration#:#language_saved_dist#:#The backup of the standard ILIAS language file is created.###25 10 2016 new variable administration#:#language_scope_added#:#اضافات محلية فقط administration#:#language_scope_added_info#:#Export all entries that are locally added in the database. This can be used to backup additional development entries before local changes are deleted on the tab "Maintain".###07 11 2014 new variable diff --git a/lang/ilias_bg.lang b/lang/ilias_bg.lang index 1a5cea802ace..f0e8f866099a 100644 --- a/lang/ilias_bg.lang +++ b/lang/ilias_bg.lang @@ -214,7 +214,7 @@ administration#:#language_former_file_equal#:#The file %s is identical to administration#:#language_former_file_missing#:#The file %s is missing.###19 09 2008 new variable administration#:#language_import_file#:#Import Language File###23 08 2007 new variable administration#:#language_load_local_changes#:#Load local language file into the database###23 08 2007 new variable -administration#:#language_load_local_changes_info#:#Load the file Customizing/global/lang/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten.###07 11 2014 new variable +administration#:#language_load_local_changes_info#:#Load the file lang/customizing/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten.###07 11 2014 new variable administration#:#language_loaded_local#:#The local language file was loaded into the database.###23 08 2007 new variable administration#:#language_local_file_deleted#:#The local language file was deleted.###10 09 2010 new variable administration#:#language_maintain#:#Maintain###23 08 2007 new variable @@ -235,12 +235,12 @@ administration#:#language_mode_existing_replace_info#:#Import new entries and re administration#:#language_note_translation#:#Page translation mode is activated for each language separately. Additionally the user needs visible and read permission on the language folder.###23 08 2007 new variable administration#:#language_process_maintenance#:#Process Maintenance###23 08 2007 new variable administration#:#language_remove_local_file#:#Delete the local language file###10 09 2010 new variable -administration#:#language_remove_local_file_info#:#Remove the file Customizing/global/lang/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched.###07 11 2014 new variable +administration#:#language_remove_local_file_info#:#Remove the file lang/customizing/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched.###07 11 2014 new variable administration#:#language_save_dist#:#Backup the standard language file###25 10 2016 new variable administration#:#language_save_dist_failed#:#The backup of the standard ILIAS language file could not be written.###25 10 2016 new variable administration#:#language_save_dist_info#:#Create a backup of the standard ILIAS language file in the ILIAS data directory. This helps after an ILIAS update to find conflicst of own changes with updated language variables.###25 10 2016 new variable administration#:#language_save_local_changes#:#Save all changes to the local language file###23 08 2007 new variable -administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file Customizing/global/lang/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation.###07 11 2014 new variable +administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file lang/customizing/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation.###07 11 2014 new variable administration#:#language_saved_dist#:#The backup of the standard ILIAS language file is created.###25 10 2016 new variable administration#:#language_scope_added#:#Local additions only###10 09 2010 new variable administration#:#language_scope_added_info#:#Export all entries that are locally added in the database. This can be used to backup additional development entries before local changes are deleted on the tab "Maintain".###07 11 2014 new variable diff --git a/lang/ilias_da.lang b/lang/ilias_da.lang index 5f9a4588cece..6f7d89f8983e 100644 --- a/lang/ilias_da.lang +++ b/lang/ilias_da.lang @@ -214,7 +214,7 @@ administration#:#language_former_file_equal#:#Filen %s er identisk med de administration#:#language_former_file_missing#:#Filen %s mangler. administration#:#language_import_file#:#Importer sprogfil administration#:#language_load_local_changes#:#Indlæs lokal sprogfil til databasen -administration#:#language_load_local_changes_info#:#Load the file Customizing/global/lang/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten.###07 11 2014 new variable +administration#:#language_load_local_changes_info#:#Load the file lang/customizing/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten.###07 11 2014 new variable administration#:#language_loaded_local#:#Den lokale sprogfil blev indlæst i databasen. administration#:#language_local_file_deleted#:#The local language file was deleted.###10 09 2010 new variable administration#:#language_maintain#:#Vedligehold @@ -235,12 +235,12 @@ administration#:#language_mode_existing_replace_info#:#Import new entries and re administration#:#language_note_translation#:#Sideoversættelse er aktiveret for sprog separart. Brugeren har derudover brug for læseadgang til mappen med sprog. administration#:#language_process_maintenance#:#Udfør administration#:#language_remove_local_file#:#Delete the local language file###10 09 2010 new variable -administration#:#language_remove_local_file_info#:#Remove the file Customizing/global/lang/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched.###07 11 2014 new variable +administration#:#language_remove_local_file_info#:#Remove the file lang/customizing/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched.###07 11 2014 new variable administration#:#language_save_dist#:#Backup the standard language file###25 10 2016 new variable administration#:#language_save_dist_failed#:#The backup of the standard ILIAS language file could not be written.###25 10 2016 new variable administration#:#language_save_dist_info#:#Create a backup of the standard ILIAS language file in the ILIAS data directory. This helps after an ILIAS update to find conflicst of own changes with updated language variables.###25 10 2016 new variable administration#:#language_save_local_changes#:#Gem alle ændringer i den lokale sprogfil -administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file Customizing/global/lang/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation.###07 11 2014 new variable +administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file lang/customizing/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation.###07 11 2014 new variable administration#:#language_saved_dist#:#The backup of the standard ILIAS language file is created.###25 10 2016 new variable administration#:#language_scope_added#:#Local additions only###10 09 2010 new variable administration#:#language_scope_added_info#:#Export all entries that are locally added in the database. This can be used to backup additional development entries before local changes are deleted on the tab "Maintain".###07 11 2014 new variable diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index 70eff0a5dffb..aab22efb5db9 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -215,7 +215,7 @@ administration#:#language_former_file_equal#:#Die Datei %s stimmt mit der administration#:#language_former_file_missing#:#Die Datei %s existiert nicht. administration#:#language_import_file#:#Sprachdatei importieren administration#:#language_load_local_changes#:#Custom-Sprachdatei in die Datenbank laden -administration#:#language_load_local_changes_info#:#Lädt die Datei Customizing/global/lang/ilias_%s.lang.local in die Datenbank. Neue Einträge aus der Datei werden hinzugefügt und vorhandene Einträge in der Datenbank werden überschrieben. +administration#:#language_load_local_changes_info#:#Lädt die Datei lang/customizing/ilias_%s.lang.local in die Datenbank. Neue Einträge aus der Datei werden hinzugefügt und vorhandene Einträge in der Datenbank werden überschrieben. administration#:#language_loaded_local#:#Die Custom-Sprachdatei wurde in die Datenbank geladen. administration#:#language_local_file_deleted#:#Die Custom-Sprachdatei wurde gelöscht. administration#:#language_maintain#:#Wartung @@ -236,12 +236,12 @@ administration#:#language_mode_existing_replace_info#:#Importiert neue Einträge administration#:#language_note_translation#:#Die Seitenübersetzung wird für jede Sprache separat aktiviert. Zusätzlich muss ein Benutzer die Rechte "Lesen" und "Schreiben" im Sprachordner haben. administration#:#language_process_maintenance#:#Wartung durchführen administration#:#language_remove_local_file#:#Custom-Sprachdatei löschen -administration#:#language_remove_local_file_info#:#Entfernt die Datei Customizing/global/lang/ilias_%s.lang.local und setzt den Status der Sprache von "Mit lokaler Version installiert" auf "Installiert". Die Einträge in der Datenbank sind davon nicht betroffen. +administration#:#language_remove_local_file_info#:#Entfernt die Datei lang/customizing/ilias_%s.lang.local und setzt den Status der Sprache von "Mit lokaler Version installiert" auf "Installiert". Die Einträge in der Datenbank sind davon nicht betroffen. administration#:#language_save_dist#:#Backup der Standard-Sprachdatei erzeugen administration#:#language_save_dist_failed#:#Das Backup der Standard-Sprachdatei konnte nicht geschrieben werden. administration#:#language_save_dist_info#:#Erzeugt ein Backup der Standard-Sprachdatei im externen ILIAS-Datenverzeichnis. Dies hilft nach einem ILIAS-Update, Konflikte von eigenen Änderungen mit aktualisierten Sprachvariablen zu finden. administration#:#language_save_local_changes#:#Alle Änderungen in der Custom-Sprachdatei speichern -administration#:#language_save_local_changes_info#:#Speichert alle lokalen Änderungen oder Ergänzungen in der Datei Customizing/global/lang/ilias_%s.lang.local und setzt den Status der Sprache auf "Mit lokaler Version installiert". Der Web-Server muss Schreibrecht in dem Verzeichnis besitzen. Beachten Sie, dass diese Datei für alle Mandanten der Installation dieselbe ist. +administration#:#language_save_local_changes_info#:#Speichert alle lokalen Änderungen oder Ergänzungen in der Datei lang/customizing/ilias_%s.lang.local und setzt den Status der Sprache auf "Mit lokaler Version installiert". Der Web-Server muss Schreibrecht in dem Verzeichnis besitzen. Beachten Sie, dass diese Datei für alle Mandanten der Installation dieselbe ist. administration#:#language_saved_dist#:#Das Backup der Standard-Sprachdatei wurde erzeugt und im externen ILIAS-Datenverzeichnis abgelegt. administration#:#language_scope_added#:#Nur lokale Ergänzungen administration#:#language_scope_added_info#:#Exportiert alle Einträge, die in der Datenbank lokal hinzugefügt wurden. Dies kann genutzt werden, um zusätzliche Entwicklungs-Einträge zu sichern, bevor die lokalen Änderungen auf dem Reiter "Wartung" zurückgesetzt werden. diff --git a/lang/ilias_el.lang b/lang/ilias_el.lang index 91ef5990d018..2b207cfde557 100644 --- a/lang/ilias_el.lang +++ b/lang/ilias_el.lang @@ -215,7 +215,7 @@ administration#:#language_former_file_equal#:#Το αρχείο %s είν administration#:#language_former_file_missing#:#The file %s is missing administration#:#language_import_file#:#Εισαγωγή αρχείων γλώσσας administration#:#language_load_local_changes#:#Φορτώστε τα αρχελια της τοπικής γλώσσας στη βάση -administration#:#language_load_local_changes_info#:#Load the file Customizing/global/lang/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten.###07 11 2014 new variable +administration#:#language_load_local_changes_info#:#Load the file lang/customizing/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten.###07 11 2014 new variable administration#:#language_loaded_local#:#Τα αρχεία της τοπικής γλώσσας φορτώθηκαν στη βάση administration#:#language_local_file_deleted#:#The local language file was deleted.###10 09 2010 new variable administration#:#language_maintain#:#Διατηρείστε @@ -236,12 +236,12 @@ administration#:#language_mode_existing_replace_info#:#Import new entries and re administration#:#language_note_translation#:#Η επιλογή μετάφρασης σελίδας ενεργοποιείται ξεχωριστά για την κάθε γλώσσα. Επιπροσθέτως ο χρήστης χρειάζεται να έχει δικαιώματα προβολής και ανάγνωσης στα αρχεία γλώσσας administration#:#language_process_maintenance#:#Διαδικασία διατήρησης administration#:#language_remove_local_file#:#Delete the local language file###10 09 2010 new variable -administration#:#language_remove_local_file_info#:#Remove the file Customizing/global/lang/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched.###07 11 2014 new variable +administration#:#language_remove_local_file_info#:#Remove the file lang/customizing/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched.###07 11 2014 new variable administration#:#language_save_dist#:#Backup the standard language file###25 10 2016 new variable administration#:#language_save_dist_failed#:#The backup of the standard ILIAS language file could not be written.###25 10 2016 new variable administration#:#language_save_dist_info#:#Create a backup of the standard ILIAS language file in the ILIAS data directory. This helps after an ILIAS update to find conflicst of own changes with updated language variables.###25 10 2016 new variable administration#:#language_save_local_changes#:#Αποθηκεύστε όλες τις αλλαγές στον φάκελο αρχείων της τοπικής γλώσσας -administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file Customizing/global/lang/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation.###07 11 2014 new variable +administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file lang/customizing/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation.###07 11 2014 new variable administration#:#language_saved_dist#:#The backup of the standard ILIAS language file is created.###25 10 2016 new variable administration#:#language_scope_added#:#Local additions only###10 09 2010 new variable administration#:#language_scope_added_info#:#Export all entries that are locally added in the database. This can be used to backup additional development entries before local changes are deleted on the tab "Maintain".###07 11 2014 new variable diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index 6f1971475401..932982d767ca 100755 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -215,7 +215,7 @@ administration#:#language_former_file_equal#:#The file %s is identical to administration#:#language_former_file_missing#:#The file %s is missing. administration#:#language_import_file#:#Import Language File administration#:#language_load_local_changes#:#Load custom language file into the database -administration#:#language_load_local_changes_info#:#Load the file Customizing/global/lang/ilias_%s.lang.local to the database. New entries of this file are added to the database and existing entries are overwritten. +administration#:#language_load_local_changes_info#:#Load the file lang/customizing/ilias_%s.lang.local to the database. New entries of this file are added to the database and existing entries are overwritten. administration#:#language_loaded_local#:#The custom language file was loaded into the database. administration#:#language_local_file_deleted#:#The custom language file was deleted. administration#:#language_maintain#:#Maintain @@ -236,12 +236,12 @@ administration#:#language_mode_existing_replace_info#:#Import new entries and re administration#:#language_note_translation#:#Page translation mode is activated for each language separately. Additionally the user needs read and write permission on the language folder. administration#:#language_process_maintenance#:#Process Maintenance administration#:#language_remove_local_file#:#Delete the custom language file -administration#:#language_remove_local_file_info#:#Remove the file Customizing/global/lang/ilias_%s.lang.local and change the language status from ‘Installed With Local’ to ‘Installed’. The changes in the database are not touched. +administration#:#language_remove_local_file_info#:#Remove the file lang/customizing/ilias_%s.lang.local and change the language status from ‘Installed With Local’ to ‘Installed’. The changes in the database are not touched. administration#:#language_save_dist#:#Backup the standard language file administration#:#language_save_dist_failed#:#The backup of the standard ILIAS language file could not be written. administration#:#language_save_dist_info#:#Create a backup of the standard ILIAS language file in the ILIAS data directory. This helps after an ILIAS update to find conflicst of own changes with updated language variables. administration#:#language_save_local_changes#:#Save all changes to the custom language file -administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file Customizing/global/lang/ilias_%s.lang.local and set the language status to ‘Installed With Local’. The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation. +administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file lang/customizing/ilias_%s.lang.local and set the language status to ‘Installed With Local’. The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation. administration#:#language_saved_dist#:#The backup of the standard ILIAS language file is created. administration#:#language_scope_added#:#Local additions only administration#:#language_scope_added_info#:#Export all entries that are locally added in the database. This can be used to backup additional development entries before local changes are deleted on the tab ‘Maintain’. diff --git a/lang/ilias_es.lang b/lang/ilias_es.lang index a1fbb2b9b259..6d93e5b4867e 100644 --- a/lang/ilias_es.lang +++ b/lang/ilias_es.lang @@ -216,7 +216,7 @@ administration#:#language_former_file_equal#:#El Archivo %s es idéntico administration#:#language_former_file_missing#:#El archivo %s no se encuentra. administration#:#language_import_file#:#Importar Archivo de idioma administration#:#language_load_local_changes#:#Cargar Archivo de idioma local en la base de datos -administration#:#language_load_local_changes_info#:#Carga el archvio Customizing/global/lang/ilias_%s_lang.local en la base de datos. Las nuevas entradas de este archivo se añaden a la base de datos y las entradas que existan se sobreescriben. +administration#:#language_load_local_changes_info#:#Carga el archvio lang/customizing/ilias_%s_lang.local en la base de datos. Las nuevas entradas de este archivo se añaden a la base de datos y las entradas que existan se sobreescriben. administration#:#language_loaded_local#:#El Archivo de idioma local fue cargado en la base de datos administration#:#language_local_file_deleted#:#El Archivo local de idioma ha sido eliminado. administration#:#language_maintain#:#Mantener @@ -237,12 +237,12 @@ administration#:#language_mode_existing_replace_info#:#Importa las nuevas entrad administration#:#language_note_translation#:#El modo de traducción de página se activa para cada idioma por separado. Además el usuario necesita permisos de lectura y visibilidad en la carpeta de idioma. administration#:#language_process_maintenance#:#Mantenimiento de proceso administration#:#language_remove_local_file#:#Eliminar el Archivo local de idioma -administration#:#language_remove_local_file_info#:#Borra el archivo Customizing/global/lang/ilias_%s_lang.local y cambia el estado del idioma de "Instalado En Local" a "Instalado". Los cambios en la base de datos no se tocan. +administration#:#language_remove_local_file_info#:#Borra el archivo lang/customizing/ilias_%s_lang.local y cambia el estado del idioma de "Instalado En Local" a "Instalado". Los cambios en la base de datos no se tocan. administration#:#language_save_dist#:#Copia de seguridad del archivo de lenguaje estándar administration#:#language_save_dist_failed#:#No se ha podido escribir la copia de seguridad del archivo de lenguaje ILIAS estándar. administration#:#language_save_dist_info#:#Cree una copia de seguridad del archivo de lenguaje ILIAS en el directorio de datos ILIAS. Esto es útil después de una actualización de ILIAS para buscar conflictos entre los propios cambios y las variables del lenguaje actualizadas. administration#:#language_save_local_changes#:#Guardar todos los cambios al Archivo de idioma local -administration#:#language_save_local_changes_info#:#Guarda todas las entradas añadidas o cambiadas en la base de datos en el fichero Customizing/global/lang/ilias_%s_lang.local y establece el estado del idioma a "Instalado En Local". El servidor web debe tener permiso de escritura en esta carpeta. Tenga en cuenta que este fichero es el mismo para todos los clientes de la instalación. +administration#:#language_save_local_changes_info#:#Guarda todas las entradas añadidas o cambiadas en la base de datos en el fichero lang/customizing/ilias_%s_lang.local y establece el estado del idioma a "Instalado En Local". El servidor web debe tener permiso de escritura en esta carpeta. Tenga en cuenta que este fichero es el mismo para todos los clientes de la instalación. administration#:#language_saved_dist#:#Se ha creado la copia de seguridad del archivo de lenguaje ILIAS estándar. administration#:#language_scope_added#:#Solamente cambios locales administration#:#language_scope_added_info#:#Exportar todas las entradas que se han añadido localmente. Esto se puede usar para hacer un backup adicional de las entradas en desarrollo antes de borrar los cambios locales con la pestaña "Mantener". diff --git a/lang/ilias_et.lang b/lang/ilias_et.lang index bfe40eaee811..00aec238ed07 100644 --- a/lang/ilias_et.lang +++ b/lang/ilias_et.lang @@ -214,7 +214,7 @@ administration#:#language_former_file_equal#:#Fail %s on identne praeguse administration#:#language_former_file_missing#:#Fail %s puudub. administration#:#language_import_file#:#Impordi keelefail administration#:#language_load_local_changes#:#Lae kohalik keelefail andmebaasi -administration#:#language_load_local_changes_info#:#Load the file Customizing/global/lang/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten. +administration#:#language_load_local_changes_info#:#Load the file lang/customizing/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten. administration#:#language_loaded_local#:#Kohalik keelefail on laetud andmebaasi. administration#:#language_local_file_deleted#:#The local language file was deleted. administration#:#language_maintain#:#Hoolda @@ -235,12 +235,12 @@ administration#:#language_mode_existing_replace_info#:#Import new entries and re administration#:#language_note_translation#:#Lehe tõlge on aktiveeritud igale keelele eraldi. Lisaks vajab kasutaja nähtavuse ja lugemise õigusi keelekaustas. administration#:#language_process_maintenance#:#Protsessi hooldus administration#:#language_remove_local_file#:#Kustuta kohalik keelefail -administration#:#language_remove_local_file_info#:#Remove the file Customizing/global/lang/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched. +administration#:#language_remove_local_file_info#:#Remove the file lang/customizing/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched. administration#:#language_save_dist#:#Backup the standard language file###25 10 2016 new variable administration#:#language_save_dist_failed#:#The backup of the standard ILIAS language file could not be written.###25 10 2016 new variable administration#:#language_save_dist_info#:#Create a backup of the standard ILIAS language file in the ILIAS data directory. This helps after an ILIAS update to find conflicst of own changes with updated language variables.###25 10 2016 new variable administration#:#language_save_local_changes#:#Salvesta kõik muudatused kohalikku keelefaili -administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file Customizing/global/lang/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation. +administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file lang/customizing/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation. administration#:#language_saved_dist#:#The backup of the standard ILIAS language file is created.###25 10 2016 new variable administration#:#language_scope_added#:#Local additions only administration#:#language_scope_added_info#:#Export all entries that are locally added in the database. This can be used to backup additional development entries before local changes are deleted on the tab "Maintain". diff --git a/lang/ilias_fa.lang b/lang/ilias_fa.lang index 1221f95e83ed..b056eeaf0d3f 100644 --- a/lang/ilias_fa.lang +++ b/lang/ilias_fa.lang @@ -214,7 +214,7 @@ administration#:#language_former_file_equal#:#The file %s is identical to administration#:#language_former_file_missing#:#The file %s is missing. administration#:#language_import_file#:#Import Language File administration#:#language_load_local_changes#:#Load local language file into the database -administration#:#language_load_local_changes_info#:#Load the file Customizing/global/lang/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten.###07 11 2014 new variable +administration#:#language_load_local_changes_info#:#Load the file lang/customizing/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten.###07 11 2014 new variable administration#:#language_loaded_local#:#The local language file was loaded into the database. administration#:#language_local_file_deleted#:#The local language file was deleted. administration#:#language_maintain#:#نگهداری @@ -235,12 +235,12 @@ administration#:#language_mode_existing_replace_info#:#Import new entries and re administration#:#language_note_translation#:#Page translation mode is activated for each language separately. Additionally the user needs read and write permission on the language folder. administration#:#language_process_maintenance#:#نگهداری پردازش administration#:#language_remove_local_file#:#Delete the local language file -administration#:#language_remove_local_file_info#:#Remove the file Customizing/global/lang/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched.###07 11 2014 new variable +administration#:#language_remove_local_file_info#:#Remove the file lang/customizing/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched.###07 11 2014 new variable administration#:#language_save_dist#:#Backup the standard language file###25 10 2016 new variable administration#:#language_save_dist_failed#:#The backup of the standard ILIAS language file could not be written.###25 10 2016 new variable administration#:#language_save_dist_info#:#Create a backup of the standard ILIAS language file in the ILIAS data directory. This helps after an ILIAS update to find conflicst of own changes with updated language variables.###25 10 2016 new variable administration#:#language_save_local_changes#:#Save all changes to the local language file -administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file Customizing/global/lang/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation.###07 11 2014 new variable +administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file lang/customizing/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation.###07 11 2014 new variable administration#:#language_saved_dist#:#The backup of the standard ILIAS language file is created.###25 10 2016 new variable administration#:#language_scope_added#:#Local additions only administration#:#language_scope_added_info#:#Export all entries that are locally added in the database. This can be used to backup additional development entries before local changes are deleted on the tab "Maintain".###07 11 2014 new variable diff --git a/lang/ilias_fr.lang b/lang/ilias_fr.lang index 67087158d311..4100235f9b59 100644 --- a/lang/ilias_fr.lang +++ b/lang/ilias_fr.lang @@ -199,7 +199,7 @@ administration#:#language_former_file_equal#:#Le fichier %s est identique administration#:#language_former_file_missing#:#Le fichier %s est manquant. administration#:#language_import_file#:#Importer Fichier de Langue administration#:#language_load_local_changes#:#Télécharger le fichier de langue locale dans la base -administration#:#language_load_local_changes_info#:#Load the file Customizing/global/lang/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten. +administration#:#language_load_local_changes_info#:#Load the file lang/customizing/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten. administration#:#language_loaded_local#:#Le fichier de langage local a été téléchargé dans la base de donnée. administration#:#language_local_file_deleted#:#Le fichier de langage local a été supprimé. administration#:#language_maintain#:#Maintenance @@ -220,12 +220,12 @@ administration#:#language_mode_existing_replace_info#:#Importer de nouvelles ent administration#:#language_note_translation#:#La traduction des pages fonctionne pour chaque langue séparément. Il faut que les utilisateurs aient les permissions « Lire » et « Visible » sur le dossier langues administration#:#language_process_maintenance#:#Procéder à la Maintenance administration#:#language_remove_local_file#:#Supprimer le fichier local de langage -administration#:#language_remove_local_file_info#:#Remove the file Customizing/global/lang/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched. +administration#:#language_remove_local_file_info#:#Remove the file lang/customizing/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched. administration#:#language_save_dist#:#Sauvegarder le fichier de langue standard administration#:#language_save_dist_failed#:#La sauvegarde du fichier de langue ILIAS standard n’a pas pu être créée. administration#:#language_save_dist_info#:#Créer une sauvegarde du fichier de langue standard ILIAS dans le répertoire de données ILIAS. Cela permettra de trouver des conflits entre les modifications et les variables de langues mises à jour après une mise à jour ILIAS. administration#:#language_save_local_changes#:#Enregistrer toutes les modifications apportées au fichier de langue locale -administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file Customizing/global/lang/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation. +administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file lang/customizing/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation. administration#:#language_saved_dist#:#La sauvegarde du fichier de langue ILIAS standard est créée. administration#:#language_scope_added#:#Ajouts locaux uniquement administration#:#language_scope_added_info#:#Export all entries that are locally added in the database. This can be used to backup additional development entries before local changes are deleted on the tab "Maintain". diff --git a/lang/ilias_hr.lang b/lang/ilias_hr.lang index fb9c243e95b1..a9ebfac62367 100644 --- a/lang/ilias_hr.lang +++ b/lang/ilias_hr.lang @@ -214,7 +214,7 @@ administration#:#language_former_file_equal#:#The file %s is identical to administration#:#language_former_file_missing#:#The file %s is missing. administration#:#language_import_file#:#Import Language File administration#:#language_load_local_changes#:#Load custom language file into the database -administration#:#language_load_local_changes_info#:#Load the file Customizing/global/lang/ilias_%s.lang.local to the database. New entries of this file are added to the database and existing entries are overwritten. +administration#:#language_load_local_changes_info#:#Load the file lang/customizing/ilias_%s.lang.local to the database. New entries of this file are added to the database and existing entries are overwritten. administration#:#language_loaded_local#:#The custom language file was loaded into the database. administration#:#language_local_file_deleted#:#The custom language file was deleted. administration#:#language_maintain#:#Maintain @@ -235,12 +235,12 @@ administration#:#language_mode_existing_replace_info#:#Import new entries and re administration#:#language_note_translation#:#Page translation mode is activated for each language separately. Additionally the user needs read and write permission on the language folder. administration#:#language_process_maintenance#:#Process Maintenance administration#:#language_remove_local_file#:#Delete the custom language file -administration#:#language_remove_local_file_info#:#Remove the file Customizing/global/lang/ilias_%s.lang.local and change the language status from ‘Installed With Local’ to ‘Installed’. The changes in the database are not touched. +administration#:#language_remove_local_file_info#:#Remove the file lang/customizing/ilias_%s.lang.local and change the language status from ‘Installed With Local’ to ‘Installed’. The changes in the database are not touched. administration#:#language_save_dist#:#Backup the standard language file administration#:#language_save_dist_failed#:#The backup of the standard ILIAS language file could not be written. administration#:#language_save_dist_info#:#Create a backup of the standard ILIAS language file in the ILIAS data directory. This helps after an ILIAS update to find conflicst of own changes with updated language variables. administration#:#language_save_local_changes#:#Save all changes to the custom language file -administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file Customizing/global/lang/ilias_%s.lang.local and set the language status to ‘Installed With Local’. The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation. +administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file lang/customizing/ilias_%s.lang.local and set the language status to ‘Installed With Local’. The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation. administration#:#language_saved_dist#:#The backup of the standard ILIAS language file is created. administration#:#language_scope_added#:#Local additions only administration#:#language_scope_added_info#:#Export all entries that are locally added in the database. This can be used to backup additional development entries before local changes are deleted on the tab ‘Maintain’. diff --git a/lang/ilias_hu.lang b/lang/ilias_hu.lang index 5e99b4de2c65..5ff982824e17 100644 --- a/lang/ilias_hu.lang +++ b/lang/ilias_hu.lang @@ -214,7 +214,7 @@ administration#:#language_former_file_equal#:#%s fájl azonos a jelenlegi administration#:#language_former_file_missing#:#%s fájl hiányzik. administration#:#language_import_file#:#Nyelvi fájl importálása administration#:#language_load_local_changes#:#Egyéni nyelvi fájl betöltése az adatbázisba -administration#:#language_load_local_changes_info#:#A Customizing/global/lang/ilias_%s.lang.local fájl betöltése az adatbázisba. A már meglévő bejegyezések felülíródnak, az újak hozzáadódnak az adatbázishoz. +administration#:#language_load_local_changes_info#:#A lang/customizing/ilias_%s.lang.local fájl betöltése az adatbázisba. A már meglévő bejegyezések felülíródnak, az újak hozzáadódnak az adatbázishoz. administration#:#language_loaded_local#:#Az egyéni nyelvi fájlt sikeresen betöltötte az adatbázisba. administration#:#language_local_file_deleted#:#Az egyéni nyelvi fájlt sikeresen törölte. administration#:#language_maintain#:#Karbantartás @@ -235,12 +235,12 @@ administration#:#language_mode_existing_replace_info#:#Új bejegyzések importá administration#:#language_note_translation#:#Az oldalfordító az egyes nyelvekhez külön-külön kapcsolható be. A felhasználónak olvasási és írási jogosultsággal is rendelkeznie kell az egyes nyelvi fájlokhoz. administration#:#language_process_maintenance#:#Karbantartás futtatása administration#:#language_remove_local_file#:#Egyéni nyelvi fájl törlése -administration#:#language_remove_local_file_info#:#A Customizing/global/lang/ilias_%s.lang.local fájl törlése és a nyelv 'Helyi nyelvi fájllal telepítve' cseréje 'Telepítve' állapotra. Az adatbázisban nem történik változtatás. +administration#:#language_remove_local_file_info#:#A lang/customizing/ilias_%s.lang.local fájl törlése és a nyelv 'Helyi nyelvi fájllal telepítve' cseréje 'Telepítve' állapotra. Az adatbázisban nem történik változtatás. administration#:#language_save_dist#:#A standard nyelvi fájl biztonsági mentése administration#:#language_save_dist_failed#:#A standard nyelvi fájl biztonsági mentése nem sikerült (írási hiba). administration#:#language_save_dist_info#:#Az ILIAS adatmappájában lévő standard ILIAS nyelvi fájlról biztonsági másolat készül. Ez segítségére lehet ILIAS frissítés után a saját módosítások és a frissített nyelvi változók közötti ütközések keresésékor. administration#:#language_save_local_changes#:#Az összes változtatást egyéni nyelvi fájlba mentése -administration#:#language_save_local_changes_info#:#Az összes helyileg hozzáadott vagy adatbázisban megváltoztatott bejegyzés mentése a Customizing/global/lang/ilias_%s.lang.local fájlban, és a nyelv átállítása 'Helyi nyelvi fájllal telepítve' állapotúra. A webszerver futtatójának írási jog szükséges a mappába. Figyeljen arra, hogy a telepítés összes kliense ezt a fájlt használja. +administration#:#language_save_local_changes_info#:#Az összes helyileg hozzáadott vagy adatbázisban megváltoztatott bejegyzés mentése a lang/customizing/ilias_%s.lang.local fájlban, és a nyelv átállítása 'Helyi nyelvi fájllal telepítve' állapotúra. A webszerver futtatójának írási jog szükséges a mappába. Figyeljen arra, hogy a telepítés összes kliense ezt a fájlt használja. administration#:#language_saved_dist#:#Sikeresen létrehozta a standard nyelvi fájl biztonsági mentését. administration#:#language_scope_added#:#Csak helyi felvétel administration#:#language_scope_added_info#:#Az összes, az adatbázisba helyiként hozzáadott bejegyzés exportálása. A fejlesztés alatt lévő változatok biztonsági mentésére lehet felhasználni a 'Karbantartás' fülön történő helyi változatok törlése előtt. diff --git a/lang/ilias_it.lang b/lang/ilias_it.lang index f400d419ccd5..75221120ad5c 100644 --- a/lang/ilias_it.lang +++ b/lang/ilias_it.lang @@ -214,7 +214,7 @@ administration#:#language_former_file_equal#:#Il file %s è identico al f administration#:#language_former_file_missing#:#Il file %s non esiste. administration#:#language_import_file#:#Importazione file lingua administration#:#language_load_local_changes#:#Caricare il file lingua locale nel database -administration#:#language_load_local_changes_info#:#Load the file Customizing/global/lang/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten. +administration#:#language_load_local_changes_info#:#Load the file lang/customizing/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten. administration#:#language_loaded_local#:#Il file lingua locale è stato caricato nel database. administration#:#language_local_file_deleted#:#The local language file was deleted. administration#:#language_maintain#:#Manutenzione @@ -235,12 +235,12 @@ administration#:#language_mode_existing_replace_info#:#Importa nuove voci e sost administration#:#language_note_translation#:#La modalità traduzione pagina si attiva separatamente per ogni lingua. E' necessario che l'utente abbia i permessi di scrittura e lettura nella sezione lingue. administration#:#language_process_maintenance#:#Processo di manutenzione administration#:#language_remove_local_file#:#Cancella il file di lingua locale -administration#:#language_remove_local_file_info#:#Remove the file Customizing/global/lang/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched. +administration#:#language_remove_local_file_info#:#Remove the file lang/customizing/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched. administration#:#language_save_dist#:#Backup del file di lingua standard administration#:#language_save_dist_failed#:#Il backup del file di lingua ILIAS standard non può essere scritto. administration#:#language_save_dist_info#:#Creare un backup del file di lingua ILIAS standard nella directory dei dati ILIAS. Questo aiuta dopo un aggiornamento ILIAS per trovare contrasti di proprie modifiche con variabili linguistiche aggiornate. administration#:#language_save_local_changes#:#Salvare tutti i cambiamenti nel file lingua locale -administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file Customizing/global/lang/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation. +administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file lang/customizing/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation. administration#:#language_saved_dist#:#Il backup del file di lingua ILIAS standard è stato creato. administration#:#language_scope_added#:#Solo integrazioni locali administration#:#language_scope_added_info#:#Export all entries that are locally added in the database. This can be used to backup additional development entries before local changes are deleted on the tab "Maintain". diff --git a/lang/ilias_ja.lang b/lang/ilias_ja.lang index e9afb1268669..cb3579528c8a 100644 --- a/lang/ilias_ja.lang +++ b/lang/ilias_ja.lang @@ -214,7 +214,7 @@ administration#:#language_former_file_equal#:#ファイル %sは現在の administration#:#language_former_file_missing#:#ファイル %sがありません。 administration#:#language_import_file#:#言語ファイルのインポート administration#:#language_load_local_changes#:#ローカル言語ファイルをデータベースへ読込む -administration#:#language_load_local_changes_info#:#Customizing/global/lang/ilias_%s_lang.localファイルをデータベースへロードします。 このファイルの新しいエントリーはデータベースへ追加されて既存のエントリーは上書きされます。 +administration#:#language_load_local_changes_info#:#lang/customizing/ilias_%s_lang.localファイルをデータベースへロードします。 このファイルの新しいエントリーはデータベースへ追加されて既存のエントリーは上書きされます。 administration#:#language_loaded_local#:#ローカル言語ファイルがデータベースへ読込まれました。 administration#:#language_local_file_deleted#:#ローカル言語ファイルが削除されました。 administration#:#language_maintain#:#メンテナンス @@ -235,12 +235,12 @@ administration#:#language_mode_existing_replace_info#:#新しいエントリー administration#:#language_note_translation#:#ページ送信モードは各言語毎に使用可能になります。なお、ユーザは言語フォルダへの読み書き権利が必要です。 administration#:#language_process_maintenance#:#プロセスメンテナンス administration#:#language_remove_local_file#:#ローカル言語ファイルを削除します -administration#:#language_remove_local_file_info#:#Customizing/global/lang/ilias_%s_lang.localを削除して言語ステータスを"ローカルをインストール済み"から "インストール済み"へ変更します。データベース内の変更はされません。 +administration#:#language_remove_local_file_info#:#lang/customizing/ilias_%s_lang.localを削除して言語ステータスを"ローカルをインストール済み"から "インストール済み"へ変更します。データベース内の変更はされません。 administration#:#language_save_dist#:#標準言語ファイルをバックアップ administration#:#language_save_dist_failed#:#標準ilias言語ファイルのバックアップを書き込みできませんでした。 administration#:#language_save_dist_info#:#iliasデータディレクトリ内に標準ilias言語ファイルのバックアップを作成。これはilias更新後に更新した言語変更自体のコンフリクトを発見する際に役立ちます。 administration#:#language_save_local_changes#:#全ての変更をローカル言語ファイルへ保存 -administration#:#language_save_local_changes_info#:#Customizing/global/lang/ilias_%s_lang.localファイルへローカルに追加または変更されたデータベースエントリーを保存して言語ステータスを "ローカルへインストール済み"に設定します。Webサーバはこのフォルダの書き込み権が必要です。このファイルはこのシステムの全クライアント用として同じであることに注意願います。 +administration#:#language_save_local_changes_info#:#lang/customizing/ilias_%s_lang.localファイルへローカルに追加または変更されたデータベースエントリーを保存して言語ステータスを "ローカルへインストール済み"に設定します。Webサーバはこのフォルダの書き込み権が必要です。このファイルはこのシステムの全クライアント用として同じであることに注意願います。 administration#:#language_saved_dist#:#標準ILIAS言語ファイルのバックアップが作成されます。 administration#:#language_scope_added#:#ローカル追加のみ administration#:#language_scope_added_info#:#データベースへローカルに追加された全てのエントリーをエクスポートします。ローカル変更が"保守"タブで削除される前に追加の開発エントリーのバックアップ用として利用できます。 diff --git a/lang/ilias_ka.lang b/lang/ilias_ka.lang index c9faebcebd8d..3f63514dd24b 100644 --- a/lang/ilias_ka.lang +++ b/lang/ilias_ka.lang @@ -214,7 +214,7 @@ administration#:#language_former_file_equal#:#ფაილი %s იდ administration#:#language_former_file_missing#:#ფაილი %s არ იძებნება administration#:#language_import_file#:#ენის ფაილიც იმპორტირება administration#:#language_load_local_changes#:#ადგილობრივი ენის ფაილის მონაცემთა ბაზაში ჩატვირთვა -administration#:#language_load_local_changes_info#:#Load the file Customizing/global/lang/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten.###07 11 2014 new variable +administration#:#language_load_local_changes_info#:#Load the file lang/customizing/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten.###07 11 2014 new variable administration#:#language_loaded_local#:#ადგილობრივი ენის ფაილი ჩაიტვირთა მონაცემთა ბაზაში administration#:#language_local_file_deleted#:#ადგილობრივი ენის ფაილი წაიშალა! administration#:#language_maintain#:#შენარჩუნება @@ -235,12 +235,12 @@ administration#:#language_mode_existing_replace_info#:#Import new entries and re administration#:#language_note_translation#:#გვერდის გადათარგმნის რეჟიმი გააქტიურებულია თითოეული ენისთვის ცალცალკე. დამატებით მომხარებელს სჭირდება კითხვისა და წერის ნებართვა ენის საქაღალდეში. administration#:#language_process_maintenance#:#პროცესის შენარჩუნება administration#:#language_remove_local_file#:#ადგილობრივი ენის ფაილის წაშლა -administration#:#language_remove_local_file_info#:#Remove the file Customizing/global/lang/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched.###07 11 2014 new variable +administration#:#language_remove_local_file_info#:#Remove the file lang/customizing/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched.###07 11 2014 new variable administration#:#language_save_dist#:#Backup the standard language file###25 10 2016 new variable administration#:#language_save_dist_failed#:#The backup of the standard ILIAS language file could not be written.###25 10 2016 new variable administration#:#language_save_dist_info#:#Create a backup of the standard ILIAS language file in the ILIAS data directory. This helps after an ILIAS update to find conflicst of own changes with updated language variables.###25 10 2016 new variable administration#:#language_save_local_changes#:#შეინახეთ ყველა ცვლილება ადგილობრივ ენის ფაილში -administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file Customizing/global/lang/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation.###07 11 2014 new variable +administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file lang/customizing/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation.###07 11 2014 new variable administration#:#language_saved_dist#:#The backup of the standard ILIAS language file is created.###25 10 2016 new variable administration#:#language_scope_added#:#მხოლოდ ადგილობრივი დამატებები administration#:#language_scope_added_info#:#Export all entries that are locally added in the database. This can be used to backup additional development entries before local changes are deleted on the tab "Maintain".###07 11 2014 new variable diff --git a/lang/ilias_lt.lang b/lang/ilias_lt.lang index b559c55d7a3a..cf1c0f4427f0 100644 --- a/lang/ilias_lt.lang +++ b/lang/ilias_lt.lang @@ -214,7 +214,7 @@ administration#:#language_former_file_equal#:#The file %s is identical to administration#:#language_former_file_missing#:#The file %s is missing.###19 09 2008 new variable administration#:#language_import_file#:#Import Language File###23 08 2007 new variable administration#:#language_load_local_changes#:#Load local language file into the database###23 08 2007 new variable -administration#:#language_load_local_changes_info#:#Load the file Customizing/global/lang/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten.###07 11 2014 new variable +administration#:#language_load_local_changes_info#:#Load the file lang/customizing/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten.###07 11 2014 new variable administration#:#language_loaded_local#:#The local language file was loaded into the database.###23 08 2007 new variable administration#:#language_local_file_deleted#:#The local language file was deleted.###10 09 2010 new variable administration#:#language_maintain#:#Maintain###23 08 2007 new variable @@ -235,12 +235,12 @@ administration#:#language_mode_existing_replace_info#:#Import new entries and re administration#:#language_note_translation#:#Page translation mode is activated for each language separately. Additionally the user needs visible and read permission on the language folder.###23 08 2007 new variable administration#:#language_process_maintenance#:#Process Maintenance###23 08 2007 new variable administration#:#language_remove_local_file#:#Delete the local language file###10 09 2010 new variable -administration#:#language_remove_local_file_info#:#Remove the file Customizing/global/lang/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched.###07 11 2014 new variable +administration#:#language_remove_local_file_info#:#Remove the file lang/customizing/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched.###07 11 2014 new variable administration#:#language_save_dist#:#Backup the standard language file###25 10 2016 new variable administration#:#language_save_dist_failed#:#The backup of the standard ILIAS language file could not be written.###25 10 2016 new variable administration#:#language_save_dist_info#:#Create a backup of the standard ILIAS language file in the ILIAS data directory. This helps after an ILIAS update to find conflicst of own changes with updated language variables.###25 10 2016 new variable administration#:#language_save_local_changes#:#Save all changes to the local language file###23 08 2007 new variable -administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file Customizing/global/lang/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation.###07 11 2014 new variable +administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file lang/customizing/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation.###07 11 2014 new variable administration#:#language_saved_dist#:#The backup of the standard ILIAS language file is created.###25 10 2016 new variable administration#:#language_scope_added#:#Local additions only###10 09 2010 new variable administration#:#language_scope_added_info#:#Export all entries that are locally added in the database. This can be used to backup additional development entries before local changes are deleted on the tab "Maintain".###07 11 2014 new variable diff --git a/lang/ilias_nl.lang b/lang/ilias_nl.lang index 54350df193c3..9276a43fe287 100644 --- a/lang/ilias_nl.lang +++ b/lang/ilias_nl.lang @@ -214,7 +214,7 @@ administration#:#language_former_file_equal#:#Het bestand %s is identiek administration#:#language_former_file_missing#:#het bestand %s is niet aanwezig. administration#:#language_import_file#:#Taalbestand importeren administration#:#language_load_local_changes#:#Bestand met lokale taal in de database laden -administration#:#language_load_local_changes_info#:#Laad het bestand Customizing/global/lang/ilias_%s_lang.local in de database. Nieuwe termen worden toegevoegd en bestaande termen worden overschreven. +administration#:#language_load_local_changes_info#:#Laad het bestand lang/customizing/ilias_%s_lang.local in de database. Nieuwe termen worden toegevoegd en bestaande termen worden overschreven. administration#:#language_loaded_local#:#Het lokale taalbestand werd geladen in de database. administration#:#language_local_file_deleted#:#Het lokale taalbestand werd verwijderd. administration#:#language_maintain#:#Onderhoud @@ -235,12 +235,12 @@ administration#:#language_mode_existing_replace_info#:#Importeer nieuwe termen e administration#:#language_note_translation#:#Vertaling per pagina wordt voor elke taal afzonderlijk ingeschakeld. Daarnaast heeft de gebruiker lees- en schrijfrechten nodig in de talen map. administration#:#language_process_maintenance#:#Beheer uitvoeren administration#:#language_remove_local_file#:#Verwijderen lokaal taalbestand -administration#:#language_remove_local_file_info#:#Verwijder het bestand Customizing/global/lang/ilias_%s_lang.local en verander de taalstatus van "Geïnstalleerd met Lokaal" naar "Geïnstalleerd". De wijzigingen in de database blijven hetzelfde. +administration#:#language_remove_local_file_info#:#Verwijder het bestand lang/customizing/ilias_%s_lang.local en verander de taalstatus van "Geïnstalleerd met Lokaal" naar "Geïnstalleerd". De wijzigingen in de database blijven hetzelfde. administration#:#language_save_dist#:#Backup the standard language file###25 10 2016 new variable administration#:#language_save_dist_failed#:#The backup of the standard ILIAS language file could not be written.###25 10 2016 new variable administration#:#language_save_dist_info#:#Create a backup of the standard ILIAS language file in the ILIAS data directory. This helps after an ILIAS update to find conflicst of own changes with updated language variables.###25 10 2016 new variable administration#:#language_save_local_changes#:#Alle wijzigingen van het lokale taalbestand opslaan. -administration#:#language_save_local_changes_info#:#Opslaan van alle lokaal toegevoegde of gewijzigde taaltermen naar bestand Customizing/global/lang/ilias_%s_lang.local en zet status op "Geïnstalleerd met Lokaal". De web server moet schrijftoegang hebben tot deze folder. Let erop dat ditzelfde bestand wordt gebruikt voor alle clients van deze installatie. +administration#:#language_save_local_changes_info#:#Opslaan van alle lokaal toegevoegde of gewijzigde taaltermen naar bestand lang/customizing/ilias_%s_lang.local en zet status op "Geïnstalleerd met Lokaal". De web server moet schrijftoegang hebben tot deze folder. Let erop dat ditzelfde bestand wordt gebruikt voor alle clients van deze installatie. administration#:#language_saved_dist#:#The backup of the standard ILIAS language file is created.###25 10 2016 new variable administration#:#language_scope_added#:#Alleen lokale versies administration#:#language_scope_added_info#:#Exporteer alle termen die lokaal zijn toegevoegd in de database. Dit kan worden gebruikt als backup voordat lokale wijzingen worden verwijderd vanaf tabblad "Onderhoud". diff --git a/lang/ilias_pl.lang b/lang/ilias_pl.lang index b0b3ffbfa298..660930370398 100644 --- a/lang/ilias_pl.lang +++ b/lang/ilias_pl.lang @@ -214,7 +214,7 @@ administration#:#language_former_file_equal#:#Plik %s jest identyczny z o administration#:#language_former_file_missing#:#Plik %s nie istnieje. administration#:#language_import_file#:#Importuj plik z wersją językową administration#:#language_load_local_changes#:#Wczytaj lokalny plik z wersją językową do bazy danych -administration#:#language_load_local_changes_info#:#Plik Customizing/global/lang/ilias_%s.lang.local wysyłany jest do bazy danych. Z pliku wstawiane są nowe wpisy, a istniejące wpisy są w bazie nadpisywane. +administration#:#language_load_local_changes_info#:#Plik lang/customizing/ilias_%s.lang.local wysyłany jest do bazy danych. Z pliku wstawiane są nowe wpisy, a istniejące wpisy są w bazie nadpisywane. administration#:#language_loaded_local#:#Plik lokalny z wersją językową został wczytany do bazy danych. administration#:#language_local_file_deleted#:#Plik lokalny z wersją językową został usunięty. administration#:#language_maintain#:#Zarządzaj @@ -235,12 +235,12 @@ administration#:#language_mode_existing_replace_info#:#Importowane są nowe i na administration#:#language_note_translation#:#Opcja tłumaczenia strony aktywowana jest dla każdego języka oddzielnie. Użytkownik musi ponadto posiadać kompetencje „Czytanie” i „Pisanie” w folderze językowym. administration#:#language_process_maintenance#:#Zarządzanie procesem administration#:#language_remove_local_file#:#Usuń plik językowy odbiorcy -administration#:#language_remove_local_file_info#:#Usuwany jest plik Customizing/global/lang/ilias_%s.lang.local, a następnie zmieniany status języka z "Zainstalowano za pomocą wersji lokalnej" na "Zainstalowane". Nie dotyczy to wpisów w bazie danych. +administration#:#language_remove_local_file_info#:#Usuwany jest plik lang/customizing/ilias_%s.lang.local, a następnie zmieniany status języka z "Zainstalowano za pomocą wersji lokalnej" na "Zainstalowane". Nie dotyczy to wpisów w bazie danych. administration#:#language_save_dist#:#Utwórz kopię zapasową domyślnego pliku językowego administration#:#language_save_dist_failed#:#Nie udało się zapisać kopii zapasowej domyślnego pliku językowego. administration#:#language_save_dist_info#:#Tworzy w zewnętrznym indeksie danych ILIAS kopię zapasową domyślnego pliku językowego. Ta funkcja jest przydatna po aktualizacji ILIAS, gdy należy znaleźć przypadku konfliktu własnych zmian i zaktualizowanych zmiennych języka. administration#:#language_save_local_changes#:#Zapisz wszystkie zmiany do lokalnego pliku z wersją językową -administration#:#language_save_local_changes_info#:#Zapisywane są wszystkie zmiany lokalne lub uzupełnienia w pliku Customizing/global/lang/ilias_%s.lang.local, a następnie aktywowany status języka "Zainstalowano za pomocą wersji lokalnej". Serwer internetowy musi posiadać prawo pisania dla tego indeksu. Pamiętaj, że ten plik jest identyczny dla wszystkich klientów instalacji. +administration#:#language_save_local_changes_info#:#Zapisywane są wszystkie zmiany lokalne lub uzupełnienia w pliku lang/customizing/ilias_%s.lang.local, a następnie aktywowany status języka "Zainstalowano za pomocą wersji lokalnej". Serwer internetowy musi posiadać prawo pisania dla tego indeksu. Pamiętaj, że ten plik jest identyczny dla wszystkich klientów instalacji. administration#:#language_saved_dist#:#Utworzono kopię zapasową domyślnego pliku językowego. administration#:#language_scope_added#:#Tylko lokalne zmiany administration#:#language_scope_added_info#:#Eksportowane są wszystkie wpisy, które zostały wstawione w bazie danych lokalnie. Tę funkcję można wykorzystać, aby zabezpieczyć dodatkowe wpisy początkowe, zanim zostaną zresetowane lokalne zmiany w zakładce "Konserwacja". diff --git a/lang/ilias_pt.lang b/lang/ilias_pt.lang index d8b8c58c6a60..d70d4e71c6bd 100644 --- a/lang/ilias_pt.lang +++ b/lang/ilias_pt.lang @@ -214,7 +214,7 @@ administration#:#language_former_file_equal#:#O ficheiro %s é idêntico administration#:#language_former_file_missing#:#O ficheiro %s está ausente. administration#:#language_import_file#:#Importar ficheiro de idioma administration#:#language_load_local_changes#:#Carregar o ficheiro do idioma personalizado para a base de dados -administration#:#language_load_local_changes_info#:#Carregar o ficheiro Customizing/global/lang/ilias_%s.lang.local para a base de dados. As novas entradas deste ficheiro são adicionadas à base de dados e as entradas existentes são substituídas. +administration#:#language_load_local_changes_info#:#Carregar o ficheiro lang/customizing/ilias_%s.lang.local para a base de dados. As novas entradas deste ficheiro são adicionadas à base de dados e as entradas existentes são substituídas. administration#:#language_loaded_local#:#O ficheiro do idioma personalizado foi carregado para a base de dados. administration#:#language_local_file_deleted#:#O ficheiro do idioma personalizado foi apagado. administration#:#language_maintain#:#Manter @@ -235,12 +235,12 @@ administration#:#language_mode_existing_replace_info#:#Importar entradas novas e administration#:#language_note_translation#:#O modo Tradução de página é ativado separadamente para cada idioma. Além disso, o utilizador precisa da permissão de ler e escrever na pasta de idioma. administration#:#language_process_maintenance#:#Processar manutenção administration#:#language_remove_local_file#:#Apagar ficheiro do idioma personalizado -administration#:#language_remove_local_file_info#:#Remover o ficheiro Customizing/global/lang/ilias_%s_lang.local e altere o estado do idioma de "Instalado com local" para "Instalado". As alterações na base de dados ficam intactas. +administration#:#language_remove_local_file_info#:#Remover o ficheiro lang/customizing/ilias_%s_lang.local e altere o estado do idioma de "Instalado com local" para "Instalado". As alterações na base de dados ficam intactas. administration#:#language_save_dist#:#Fazer cópia de segurança do ficheiros de idioma padrão administration#:#language_save_dist_failed#:#Não foi possível escrever o backup do ficheiro de idioma padrão ILIAS. administration#:#language_save_dist_info#:#Criar um backup do ficheiro de idioma padrão ILIAS no diretório de dados ILIAS. Isto ajuda, após uma atualização de ILIAS, a encontrar conflitos das próprias alterações com variáveis de idioma atualizadas. administration#:#language_save_local_changes#:#Guardar todas as alterações no ficheiro de idioma local -administration#:#language_save_local_changes_info#:#Guardar todas as entradas na base de dados adicionadas ou alteradas localmente no ficheiro Customizing/global/lang/ilias_%s_lang.local de definir o estado do idioma para "Instalado com local". O servidor da web tem de ter permissão para escrever nesta pasta. Note que este ficheiro é o mesmo para todos os clientes desta instalação. +administration#:#language_save_local_changes_info#:#Guardar todas as entradas na base de dados adicionadas ou alteradas localmente no ficheiro lang/customizing/ilias_%s_lang.local de definir o estado do idioma para "Instalado com local". O servidor da web tem de ter permissão para escrever nesta pasta. Note que este ficheiro é o mesmo para todos os clientes desta instalação. administration#:#language_saved_dist#:#Foi criado o backup do ficheiro de idioma padrão ILIAS. administration#:#language_scope_added#:#Apenas adições locais administration#:#language_scope_added_info#:#Exportar todas as entradas que foram localmente adicionadas para a base de dados. Isto pode ser usado para guardar cópias de segurança das entradas de desenvolvimento adicional antes de as alterações locais serem apagadas no separador "Manter". diff --git a/lang/ilias_ro.lang b/lang/ilias_ro.lang index 22be21242f61..49e37ff1e890 100644 --- a/lang/ilias_ro.lang +++ b/lang/ilias_ro.lang @@ -214,7 +214,7 @@ administration#:#language_former_file_equal#:#The file %s is identical to administration#:#language_former_file_missing#:#The file %s is missing.###19 09 2008 new variable administration#:#language_import_file#:#Import Language File###23 08 2007 new variable administration#:#language_load_local_changes#:#Load local language file into the database###23 08 2007 new variable -administration#:#language_load_local_changes_info#:#Load the file Customizing/global/lang/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten.###07 11 2014 new variable +administration#:#language_load_local_changes_info#:#Load the file lang/customizing/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten.###07 11 2014 new variable administration#:#language_loaded_local#:#The local language file was loaded into the database.###23 08 2007 new variable administration#:#language_local_file_deleted#:#The local language file was deleted.###10 09 2010 new variable administration#:#language_maintain#:#Maintain###23 08 2007 new variable @@ -235,12 +235,12 @@ administration#:#language_mode_existing_replace_info#:#Import new entries and re administration#:#language_note_translation#:#Page translation mode is activated for each language separately. Additionally the user needs visible and read permission on the language folder.###23 08 2007 new variable administration#:#language_process_maintenance#:#Process Maintenance###23 08 2007 new variable administration#:#language_remove_local_file#:#Delete the local language file###10 09 2010 new variable -administration#:#language_remove_local_file_info#:#Remove the file Customizing/global/lang/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched.###07 11 2014 new variable +administration#:#language_remove_local_file_info#:#Remove the file lang/customizing/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched.###07 11 2014 new variable administration#:#language_save_dist#:#Backup the standard language file###25 10 2016 new variable administration#:#language_save_dist_failed#:#The backup of the standard ILIAS language file could not be written.###25 10 2016 new variable administration#:#language_save_dist_info#:#Create a backup of the standard ILIAS language file in the ILIAS data directory. This helps after an ILIAS update to find conflicst of own changes with updated language variables.###25 10 2016 new variable administration#:#language_save_local_changes#:#Save all changes to the local language file###23 08 2007 new variable -administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file Customizing/global/lang/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation.###07 11 2014 new variable +administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file lang/customizing/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation.###07 11 2014 new variable administration#:#language_saved_dist#:#The backup of the standard ILIAS language file is created.###25 10 2016 new variable administration#:#language_scope_added#:#Local additions only###10 09 2010 new variable administration#:#language_scope_added_info#:#Export all entries that are locally added in the database. This can be used to backup additional development entries before local changes are deleted on the tab "Maintain".###07 11 2014 new variable diff --git a/lang/ilias_ru.lang b/lang/ilias_ru.lang index 6a924f5b08f3..a363bf7f10b4 100644 --- a/lang/ilias_ru.lang +++ b/lang/ilias_ru.lang @@ -214,7 +214,7 @@ administration#:#language_former_file_equal#:#Файл %s в точнос administration#:#language_former_file_missing#:#Файл %s отсутствует. administration#:#language_import_file#:#Импортировать языковой файл administration#:#language_load_local_changes#:#Загрузить локальный языковой файл в БД -administration#:#language_load_local_changes_info#:#Load the file Customizing/global/lang/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten.###07 11 2014 new variable +administration#:#language_load_local_changes_info#:#Load the file lang/customizing/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten.###07 11 2014 new variable administration#:#language_loaded_local#:#Локальный языковой файл загружен в БД. administration#:#language_local_file_deleted#:#The local language file was deleted. administration#:#language_maintain#:#Обслуживание @@ -235,12 +235,12 @@ administration#:#language_mode_existing_replace_info#:#Import new entries and re administration#:#language_note_translation#:#Режим перевода страниц активируется для каждого языка отдельно. Кроме этого, пользователям необходимо иметь права на запись и чтение языковой папки. administration#:#language_process_maintenance#:#Выполнить обслуживание administration#:#language_remove_local_file#:#Удалить локальный языковой файл -administration#:#language_remove_local_file_info#:#Remove the file Customizing/global/lang/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched.###07 11 2014 new variable +administration#:#language_remove_local_file_info#:#Remove the file lang/customizing/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched.###07 11 2014 new variable administration#:#language_save_dist#:#Backup the standard language file###25 10 2016 new variable administration#:#language_save_dist_failed#:#The backup of the standard ILIAS language file could not be written.###25 10 2016 new variable administration#:#language_save_dist_info#:#Create a backup of the standard ILIAS language file in the ILIAS data directory. This helps after an ILIAS update to find conflicst of own changes with updated language variables.###25 10 2016 new variable administration#:#language_save_local_changes#:#Сохранить все изменения в локальный языковой файл -administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file Customizing/global/lang/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation.###07 11 2014 new variable +administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file lang/customizing/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation.###07 11 2014 new variable administration#:#language_saved_dist#:#The backup of the standard ILIAS language file is created.###25 10 2016 new variable administration#:#language_scope_added#:#Local additions only administration#:#language_scope_added_info#:#Export all entries that are locally added in the database. This can be used to backup additional development entries before local changes are deleted on the tab "Maintain".###07 11 2014 new variable diff --git a/lang/ilias_sk.lang b/lang/ilias_sk.lang index 15ca9a57a14d..d4ed8df33e9b 100644 --- a/lang/ilias_sk.lang +++ b/lang/ilias_sk.lang @@ -214,7 +214,7 @@ administration#:#language_former_file_equal#:#Soubor %s je identický s a administration#:#language_former_file_missing#:#Soubor %s chybí. administration#:#language_import_file#:#Import jazykového souboru administration#:#language_load_local_changes#:#Uložit lokální jazykový soubor do databáze -administration#:#language_load_local_changes_info#:#Load the file Customizing/global/lang/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten.###07 11 2014 new variable +administration#:#language_load_local_changes_info#:#Load the file lang/customizing/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten.###07 11 2014 new variable administration#:#language_loaded_local#:#Lokální jazykový soubor byl uložen do databáze. administration#:#language_local_file_deleted#:#The local language file was deleted.###28 10 2010 new variable administration#:#language_maintain#:#Údržba @@ -235,12 +235,12 @@ administration#:#language_mode_existing_replace_info#:#Import new entries and re administration#:#language_note_translation#:#Mód překládání stránky je aktivován pro každý jazyk odděleně. Navíc uživatel potřebuje oprávnění číst a zapisovat do složky jazyků. administration#:#language_process_maintenance#:#Provést údržbu administration#:#language_remove_local_file#:#Delete the local language file###28 10 2010 new variable -administration#:#language_remove_local_file_info#:#Remove the file Customizing/global/lang/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched.###07 11 2014 new variable +administration#:#language_remove_local_file_info#:#Remove the file lang/customizing/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched.###07 11 2014 new variable administration#:#language_save_dist#:#Backup the standard language file###25 10 2016 new variable administration#:#language_save_dist_failed#:#The backup of the standard ILIAS language file could not be written.###25 10 2016 new variable administration#:#language_save_dist_info#:#Create a backup of the standard ILIAS language file in the ILIAS data directory. This helps after an ILIAS update to find conflicst of own changes with updated language variables.###25 10 2016 new variable administration#:#language_save_local_changes#:#Uložit všechny změny do lokálního jazykového souboru. -administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file Customizing/global/lang/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation.###07 11 2014 new variable +administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file lang/customizing/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation.###07 11 2014 new variable administration#:#language_saved_dist#:#The backup of the standard ILIAS language file is created.###25 10 2016 new variable administration#:#language_scope_added#:#Local additions only###28 10 2010 new variable administration#:#language_scope_added_info#:#Export all entries that are locally added in the database. This can be used to backup additional development entries before local changes are deleted on the tab "Maintain".###07 11 2014 new variable diff --git a/lang/ilias_sl.lang b/lang/ilias_sl.lang index fffb4200574a..5bc8ca20abbe 100644 --- a/lang/ilias_sl.lang +++ b/lang/ilias_sl.lang @@ -214,7 +214,7 @@ administration#:#language_former_file_equal#:#The file %s is identical to administration#:#language_former_file_missing#:#The file %s is missing. administration#:#language_import_file#:#Import Language File administration#:#language_load_local_changes#:#Load custom language file into the database -administration#:#language_load_local_changes_info#:#Load the file Customizing/global/lang/ilias_%s.lang.local to the database. New entries of this file are added to the database and existing entries are overwritten. +administration#:#language_load_local_changes_info#:#Load the file lang/customizing/ilias_%s.lang.local to the database. New entries of this file are added to the database and existing entries are overwritten. administration#:#language_loaded_local#:#The custom language file was loaded into the database. administration#:#language_local_file_deleted#:#The custom language file was deleted. administration#:#language_maintain#:#Maintain @@ -235,12 +235,12 @@ administration#:#language_mode_existing_replace_info#:#Import new entries and re administration#:#language_note_translation#:#Page translation mode is activated for each language separately. Additionally the user needs read and write permission on the language folder. administration#:#language_process_maintenance#:#Process Maintenance administration#:#language_remove_local_file#:#Delete the custom language file -administration#:#language_remove_local_file_info#:#Remove the file Customizing/global/lang/ilias_%s.lang.local and change the language status from ‘Installed With Local’ to ‘Installed’. The changes in the database are not touched. +administration#:#language_remove_local_file_info#:#Remove the file lang/customizing/ilias_%s.lang.local and change the language status from ‘Installed With Local’ to ‘Installed’. The changes in the database are not touched. administration#:#language_save_dist#:#Backup the standard language file administration#:#language_save_dist_failed#:#The backup of the standard ILIAS language file could not be written. administration#:#language_save_dist_info#:#Create a backup of the standard ILIAS language file in the ILIAS data directory. This helps after an ILIAS update to find conflicst of own changes with updated language variables. administration#:#language_save_local_changes#:#Save all changes to the custom language file -administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file Customizing/global/lang/ilias_%s.lang.local and set the language status to ‘Installed With Local’. The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation. +administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file lang/customizing/ilias_%s.lang.local and set the language status to ‘Installed With Local’. The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation. administration#:#language_saved_dist#:#The backup of the standard ILIAS language file is created. administration#:#language_scope_added#:#Local additions only administration#:#language_scope_added_info#:#Export all entries that are locally added in the database. This can be used to backup additional development entries before local changes are deleted on the tab ‘Maintain’. diff --git a/lang/ilias_sq.lang b/lang/ilias_sq.lang index 65d0cdd3ef5c..edfa43a87edf 100644 --- a/lang/ilias_sq.lang +++ b/lang/ilias_sq.lang @@ -214,7 +214,7 @@ administration#:#language_former_file_equal#:#The file %s is identical to administration#:#language_former_file_missing#:#The file %s is missing.###19 09 2008 new variable administration#:#language_import_file#:#Import Language File###23 08 2007 new variable administration#:#language_load_local_changes#:#Load local language file into the database###23 08 2007 new variable -administration#:#language_load_local_changes_info#:#Load the file Customizing/global/lang/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten.###07 11 2014 new variable +administration#:#language_load_local_changes_info#:#Load the file lang/customizing/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten.###07 11 2014 new variable administration#:#language_loaded_local#:#The local language file was loaded into the database.###23 08 2007 new variable administration#:#language_local_file_deleted#:#The local language file was deleted.###10 09 2010 new variable administration#:#language_maintain#:#Maintain###23 08 2007 new variable @@ -235,12 +235,12 @@ administration#:#language_mode_existing_replace_info#:#Import new entries and re administration#:#language_note_translation#:#Page translation mode is activated for each language separately. Additionally the user needs visible and read permission on the language folder.###23 08 2007 new variable administration#:#language_process_maintenance#:#Process Maintenance###23 08 2007 new variable administration#:#language_remove_local_file#:#Delete the local language file###10 09 2010 new variable -administration#:#language_remove_local_file_info#:#Remove the file Customizing/global/lang/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched.###07 11 2014 new variable +administration#:#language_remove_local_file_info#:#Remove the file lang/customizing/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched.###07 11 2014 new variable administration#:#language_save_dist#:#Backup the standard language file###25 10 2016 new variable administration#:#language_save_dist_failed#:#The backup of the standard ILIAS language file could not be written.###25 10 2016 new variable administration#:#language_save_dist_info#:#Create a backup of the standard ILIAS language file in the ILIAS data directory. This helps after an ILIAS update to find conflicst of own changes with updated language variables.###25 10 2016 new variable administration#:#language_save_local_changes#:#Save all changes to the local language file###23 08 2007 new variable -administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file Customizing/global/lang/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation.###07 11 2014 new variable +administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file lang/customizing/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation.###07 11 2014 new variable administration#:#language_saved_dist#:#The backup of the standard ILIAS language file is created.###25 10 2016 new variable administration#:#language_scope_added#:#Local additions only###10 09 2010 new variable administration#:#language_scope_added_info#:#Export all entries that are locally added in the database. This can be used to backup additional development entries before local changes are deleted on the tab "Maintain".###07 11 2014 new variable diff --git a/lang/ilias_sr.lang b/lang/ilias_sr.lang index 1c5bc3327315..0bd98e96ce21 100644 --- a/lang/ilias_sr.lang +++ b/lang/ilias_sr.lang @@ -214,7 +214,7 @@ administration#:#language_former_file_equal#:#The file %s is identical to administration#:#language_former_file_missing#:#The file %s is missing.###19 09 2008 new variable administration#:#language_import_file#:#Import Language File###23 08 2007 new variable administration#:#language_load_local_changes#:#Load local language file into the database###23 08 2007 new variable -administration#:#language_load_local_changes_info#:#Load the file Customizing/global/lang/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten.###07 11 2014 new variable +administration#:#language_load_local_changes_info#:#Load the file lang/customizing/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten.###07 11 2014 new variable administration#:#language_loaded_local#:#The local language file was loaded into the database.###23 08 2007 new variable administration#:#language_local_file_deleted#:#The local language file was deleted.###10 09 2010 new variable administration#:#language_maintain#:#Maintain###23 08 2007 new variable @@ -235,12 +235,12 @@ administration#:#language_mode_existing_replace_info#:#Import new entries and re administration#:#language_note_translation#:#Page translation mode is activated for each language separately. Additionally the user needs visible and read permission on the language folder.###23 08 2007 new variable administration#:#language_process_maintenance#:#Process Maintenance###23 08 2007 new variable administration#:#language_remove_local_file#:#Delete the local language file###10 09 2010 new variable -administration#:#language_remove_local_file_info#:#Remove the file Customizing/global/lang/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched.###07 11 2014 new variable +administration#:#language_remove_local_file_info#:#Remove the file lang/customizing/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched.###07 11 2014 new variable administration#:#language_save_dist#:#Backup the standard language file###25 10 2016 new variable administration#:#language_save_dist_failed#:#The backup of the standard ILIAS language file could not be written.###25 10 2016 new variable administration#:#language_save_dist_info#:#Create a backup of the standard ILIAS language file in the ILIAS data directory. This helps after an ILIAS update to find conflicst of own changes with updated language variables.###25 10 2016 new variable administration#:#language_save_local_changes#:#Save all changes to the local language file###23 08 2007 new variable -administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file Customizing/global/lang/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation.###07 11 2014 new variable +administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file lang/customizing/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation.###07 11 2014 new variable administration#:#language_saved_dist#:#The backup of the standard ILIAS language file is created.###25 10 2016 new variable administration#:#language_scope_added#:#Local additions only###10 09 2010 new variable administration#:#language_scope_added_info#:#Export all entries that are locally added in the database. This can be used to backup additional development entries before local changes are deleted on the tab "Maintain".###07 11 2014 new variable diff --git a/lang/ilias_tr.lang b/lang/ilias_tr.lang index ac50d56fce8c..1afd83692ff9 100644 --- a/lang/ilias_tr.lang +++ b/lang/ilias_tr.lang @@ -214,7 +214,7 @@ administration#:#language_former_file_equal#:#Dosya %s geçerli dil dosy administration#:#language_former_file_missing#:#Dosya %s yok. administration#:#language_import_file#:#Dil Dosyasını İçe Aktar administration#:#language_load_local_changes#:#Veritabanına yerel dil dosyasını yükle -administration#:#language_load_local_changes_info#:#Load the file Customizing/global/lang/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten.###07 11 2014 new variable +administration#:#language_load_local_changes_info#:#Load the file lang/customizing/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten.###07 11 2014 new variable administration#:#language_loaded_local#:#Yerel dil dosyası veritabanına yüklenmiştir. administration#:#language_local_file_deleted#:#Yerel dil dosyası silindi. administration#:#language_maintain#:#Bakım @@ -235,12 +235,12 @@ administration#:#language_mode_existing_replace_info#:#Import new entries and re administration#:#language_note_translation#:#Sayfa çeviri modu her sayfa için ayrı ayrı etkinleştirilir. Ayrıca kullanıcının dil klasörüne okuma ve yazma izni gerekir. administration#:#language_process_maintenance#:#Süreç Bakımı administration#:#language_remove_local_file#:#Yerel dil dosyasını sil -administration#:#language_remove_local_file_info#:#Remove the file Customizing/global/lang/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched.###07 11 2014 new variable +administration#:#language_remove_local_file_info#:#Remove the file lang/customizing/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched.###07 11 2014 new variable administration#:#language_save_dist#:#Backup the standard language file###25 10 2016 new variable administration#:#language_save_dist_failed#:#The backup of the standard ILIAS language file could not be written.###25 10 2016 new variable administration#:#language_save_dist_info#:#Create a backup of the standard ILIAS language file in the ILIAS data directory. This helps after an ILIAS update to find conflicst of own changes with updated language variables.###25 10 2016 new variable administration#:#language_save_local_changes#:#Yerel dil dosyadaki tüm değişiklikleri kaydet -administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file Customizing/global/lang/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation.###07 11 2014 new variable +administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file lang/customizing/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation.###07 11 2014 new variable administration#:#language_saved_dist#:#The backup of the standard ILIAS language file is created.###25 10 2016 new variable administration#:#language_scope_added#:#Sadece yerel eklemeler administration#:#language_scope_added_info#:#Export all entries that are locally added in the database. This can be used to backup additional development entries before local changes are deleted on the tab "Maintain".###07 11 2014 new variable diff --git a/lang/ilias_uk.lang b/lang/ilias_uk.lang index d148f3bc63d3..54db57addd36 100644 --- a/lang/ilias_uk.lang +++ b/lang/ilias_uk.lang @@ -214,7 +214,7 @@ administration#:#language_former_file_equal#:#The file %s is identical to administration#:#language_former_file_missing#:#The file %s is missing.###19 09 2008 new variable administration#:#language_import_file#:#Import Language File###23 08 2007 new variable administration#:#language_load_local_changes#:#Load local language file into the database###23 08 2007 new variable -administration#:#language_load_local_changes_info#:#Load the file Customizing/global/lang/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten.###07 11 2014 new variable +administration#:#language_load_local_changes_info#:#Load the file lang/customizing/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten.###07 11 2014 new variable administration#:#language_loaded_local#:#The local language file was loaded into the database.###23 08 2007 new variable administration#:#language_local_file_deleted#:#The local language file was deleted.###10 09 2010 new variable administration#:#language_maintain#:#Maintain###23 08 2007 new variable @@ -235,12 +235,12 @@ administration#:#language_mode_existing_replace_info#:#Import new entries and re administration#:#language_note_translation#:#Page translation mode is activated for each language separately. Additionally the user needs visible and read permission on the language folder.###23 08 2007 new variable administration#:#language_process_maintenance#:#Process Maintenance###23 08 2007 new variable administration#:#language_remove_local_file#:#Delete the local language file###10 09 2010 new variable -administration#:#language_remove_local_file_info#:#Remove the file Customizing/global/lang/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched.###07 11 2014 new variable +administration#:#language_remove_local_file_info#:#Remove the file lang/customizing/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched.###07 11 2014 new variable administration#:#language_save_dist#:#Backup the standard language file###25 10 2016 new variable administration#:#language_save_dist_failed#:#The backup of the standard ILIAS language file could not be written.###25 10 2016 new variable administration#:#language_save_dist_info#:#Create a backup of the standard ILIAS language file in the ILIAS data directory. This helps after an ILIAS update to find conflicst of own changes with updated language variables.###25 10 2016 new variable administration#:#language_save_local_changes#:#Save all changes to the local language file###23 08 2007 new variable -administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file Customizing/global/lang/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation.###07 11 2014 new variable +administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file lang/customizing/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation.###07 11 2014 new variable administration#:#language_saved_dist#:#The backup of the standard ILIAS language file is created.###25 10 2016 new variable administration#:#language_scope_added#:#Local additions only###10 09 2010 new variable administration#:#language_scope_added_info#:#Export all entries that are locally added in the database. This can be used to backup additional development entries before local changes are deleted on the tab "Maintain".###07 11 2014 new variable diff --git a/lang/ilias_vi.lang b/lang/ilias_vi.lang index 2df374f56e8b..e83dd0304e79 100644 --- a/lang/ilias_vi.lang +++ b/lang/ilias_vi.lang @@ -216,7 +216,7 @@ administration#:#language_former_file_equal#:#The file %s is identical to administration#:#language_former_file_missing#:#The file %s is missing.###19 09 2008 new variable administration#:#language_import_file#:#Import Language File###23 08 2007 new variable administration#:#language_load_local_changes#:#Load local language file into the database###23 08 2007 new variable -administration#:#language_load_local_changes_info#:#Load the file Customizing/global/lang/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten.###07 11 2014 new variable +administration#:#language_load_local_changes_info#:#Load the file lang/customizing/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten.###07 11 2014 new variable administration#:#language_loaded_local#:#The local language file was loaded into the database.###23 08 2007 new variable administration#:#language_local_file_deleted#:#The local language file was deleted.###10 09 2010 new variable administration#:#language_maintain#:#Maintain###23 08 2007 new variable @@ -237,12 +237,12 @@ administration#:#language_mode_existing_replace_info#:#Import new entries and re administration#:#language_note_translation#:#Page translation mode is activated for each language separately. Additionally the user needs visible and read permission on the language folder.###23 08 2007 new variable administration#:#language_process_maintenance#:#Process Maintenance###23 08 2007 new variable administration#:#language_remove_local_file#:#Delete the local language file###10 09 2010 new variable -administration#:#language_remove_local_file_info#:#Remove the file Customizing/global/lang/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched.###07 11 2014 new variable +administration#:#language_remove_local_file_info#:#Remove the file lang/customizing/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched.###07 11 2014 new variable administration#:#language_save_dist#:#Backup the standard language file###25 10 2016 new variable administration#:#language_save_dist_failed#:#The backup of the standard ILIAS language file could not be written.###25 10 2016 new variable administration#:#language_save_dist_info#:#Create a backup of the standard ILIAS language file in the ILIAS data directory. This helps after an ILIAS update to find conflicst of own changes with updated language variables.###25 10 2016 new variable administration#:#language_save_local_changes#:#Save all changes to the local language file###23 08 2007 new variable -administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file Customizing/global/lang/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation.###07 11 2014 new variable +administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file lang/customizing/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation.###07 11 2014 new variable administration#:#language_saved_dist#:#The backup of the standard ILIAS language file is created.###25 10 2016 new variable administration#:#language_scope_added#:#Local additions only###10 09 2010 new variable administration#:#language_scope_added_info#:#Export all entries that are locally added in the database. This can be used to backup additional development entries before local changes are deleted on the tab "Maintain".###07 11 2014 new variable diff --git a/lang/ilias_zh.lang b/lang/ilias_zh.lang index edc39d16e46f..793cf22954cc 100644 --- a/lang/ilias_zh.lang +++ b/lang/ilias_zh.lang @@ -213,7 +213,7 @@ administration#:#language_former_file_equal#:#文件 %s 与当前语言 administration#:#language_former_file_missing#:#文件 %s 缺失。 administration#:#language_import_file#:#导入语言文件 administration#:#language_load_local_changes#:#装载本地语言文件到数据库 -administration#:#language_load_local_changes_info#:#Load the file Customizing/global/lang/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten.###07 11 2014 new variable +administration#:#language_load_local_changes_info#:#Load the file lang/customizing/ilias_%s_lang.local to the database. New entries of this file are added to the database and existing entries are overwritten.###07 11 2014 new variable administration#:#language_loaded_local#:#本地语言文件已经装载到数据库中。 administration#:#language_local_file_deleted#:#本地语言文件被删除! administration#:#language_maintain#:#维护 @@ -234,12 +234,12 @@ administration#:#language_mode_existing_replace_info#:#Import new entries and re administration#:#language_note_translation#:#区分每种语言的页面翻译模式已经激活,另外用户需要语言文件夹的可视和可读权限。 administration#:#language_process_maintenance#:#处理维护 administration#:#language_remove_local_file#:#删除本地语言文件 -administration#:#language_remove_local_file_info#:#Remove the file Customizing/global/lang/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched.###07 11 2014 new variable +administration#:#language_remove_local_file_info#:#Remove the file lang/customizing/ilias_%s_lang.local and change the language status from "Installed With Local" to "Installed". The changes in the database are not touched.###07 11 2014 new variable administration#:#language_save_dist#:#Backup the standard language file###25 10 2016 new variable administration#:#language_save_dist_failed#:#The backup of the standard ILIAS language file could not be written.###25 10 2016 new variable administration#:#language_save_dist_info#:#Create a backup of the standard ILIAS language file in the ILIAS data directory. This helps after an ILIAS update to find conflicst of own changes with updated language variables.###25 10 2016 new variable administration#:#language_save_local_changes#:#保存所有变更到本地语言文件 -administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file Customizing/global/lang/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation.###07 11 2014 new variable +administration#:#language_save_local_changes_info#:#Save all locally added or changed database entries to the file lang/customizing/ilias_%s_lang.local and set the language status to "Installed With Local". The web server must have write permission in this folder. Please note that this file is the same for all clients of this installation.###07 11 2014 new variable administration#:#language_saved_dist#:#The backup of the standard ILIAS language file is created.###25 10 2016 new variable administration#:#language_scope_added#:#仅本地添加 administration#:#language_scope_added_info#:#Export all entries that are locally added in the database. This can be used to backup additional development entries before local changes are deleted on the tab "Maintain".###07 11 2014 new variable From 6dbbfa7b7605c038e164f4f609dab156e7a38555 Mon Sep 17 00:00:00 2001 From: Nils Haagen Date: Tue, 11 Feb 2025 11:54:57 +0100 Subject: [PATCH 038/125] PRG: 44130, 'completion_by' should point to course, not courselink --- .../classes/class.ilObjStudyProgrammeMembersGUI.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/ILIAS/StudyProgramme/classes/class.ilObjStudyProgrammeMembersGUI.php b/components/ILIAS/StudyProgramme/classes/class.ilObjStudyProgrammeMembersGUI.php index b28dbd50ffcd..c93f8249c680 100755 --- a/components/ILIAS/StudyProgramme/classes/class.ilObjStudyProgrammeMembersGUI.php +++ b/components/ILIAS/StudyProgramme/classes/class.ilObjStudyProgrammeMembersGUI.php @@ -704,7 +704,7 @@ public function confirmedAcknowledgeAllCourses() $completed_crss = $prg->getCompletedCourses($ass->getUserId()); $nodes = []; foreach ($completed_crss as $opt) { - $nodes[] = [$opt['prg_obj_id'], $opt['crsr_id']]; + $nodes[] = [$opt['prg_obj_id'], $opt['crs_id']]; } $prg->acknowledgeCourses( $ass->getId(), From 8c4ed1d31307a8e516a913371d6c8de68ad836a2 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Sun, 13 Apr 2025 08:13:15 +0200 Subject: [PATCH 039/125] 43497: Failed test: Versuch, zeitlich begrenzt aktivierte Seite aufzurufen --- lang/ilias_de.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index aab22efb5db9..d1a5b4041329 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -6865,7 +6865,7 @@ content#:#cont_overlay_image#:#Overlay-Bild content#:#cont_overlay_images#:#Overlay-Bilder content#:#cont_overlays_have_been_deleted#:#Overlays wurden gelöscht content#:#cont_page_activation#:#Seitenaktivierung -content#:#cont_page_activation_on#:#Der Inhalt wird aktiviert am %s. +content#:#cont_page_activation_on#:#Aktivierung erfolgt: %s. content#:#cont_page_compare#:#Vergleiche ausgewählte Änderungen content#:#cont_page_created#:#Seite hinzugefügt content#:#cont_page_currently_deactivated#:#Diese Seite ist momentan deaktiviert. From 2f8e5d908371e0e669f794daa4a9207099678558 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Sun, 13 Apr 2025 08:30:54 +0200 Subject: [PATCH 040/125] 44297: Failed test: Interne Links in Text integrieren --- components/ILIAS/COPage/IntLink/class.ilInternalLinkGUI.php | 5 +++-- lang/ilias_de.lang | 1 + lang/ilias_en.lang | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/components/ILIAS/COPage/IntLink/class.ilInternalLinkGUI.php b/components/ILIAS/COPage/IntLink/class.ilInternalLinkGUI.php index 5b6b2d240d11..189daba369ad 100755 --- a/components/ILIAS/COPage/IntLink/class.ilInternalLinkGUI.php +++ b/components/ILIAS/COPage/IntLink/class.ilInternalLinkGUI.php @@ -70,6 +70,7 @@ public function __construct( $this->lng->loadLanguageModule("link"); $this->lng->loadLanguageModule("content"); + $this->lng->loadLanguageModule("copg"); $this->ctrl->saveParameter($this, array("linkmode", "link_par_ref_id", "link_par_obj_id", "link_par_fold_id", "link_type")); @@ -327,7 +328,7 @@ public function showLinkHelp(): void $tpl->setCurrentBlock("chapter_list"); $tpl->setVariable("TXT_CONTENT_OBJECT", $this->lng->txt("obj_lm")); $tpl->setVariable("TXT_CONT_TITLE", $cont_obj->getTitle()); - $tpl->setVariable("THEAD", $this->lng->txt("pages")); + $tpl->setVariable("THEAD", $this->lng->txt("copg_pages")); $tpl->setCurrentBlock("change_cont_obj"); @@ -622,7 +623,7 @@ public function showLinkHelp(): void $tpl->setCurrentBlock("chapter_list"); $tpl->setVariable("TXT_CONTENT_OBJECT", $this->lng->txt("obj_" . ilObject::_lookupType($prtf_id))); $tpl->setVariable("TXT_CONT_TITLE", ilObject::_lookupTitle($prtf_id)); - $tpl->setVariable("THEAD", $this->lng->txt("pages")); + $tpl->setVariable("THEAD", $this->lng->txt("copg_pages")); foreach ($ppages as $ppage) { $this->renderLink( diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index d1a5b4041329..ba257230d401 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -7391,6 +7391,7 @@ copg#:#copg_more_character_formats#:#Weitere Zeichenformate copg#:#copg_obj_types#:#Objekttypen copg#:#copg_page_element_not_found#:#Unbekanntes Seitenelement. copg#:#copg_page_type_stys#:#Seitenlayout +copg#:#copg_pages#:#Seiten copg#:#copg_par_format_selection#:#Absatzformatauswahl copg#:#copg_pc_mob_does_not_exist#:#Das Medienobjekt wurde nicht gefunden. copg#:#copg_plugin_not_avail#:#Plugin %s nicht verfügbar. diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index 932982d767ca..571df9224eba 100755 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -7392,6 +7392,7 @@ copg#:#copg_more_character_formats#:#More Styles for Characters copg#:#copg_obj_types#:#Object Types copg#:#copg_page_element_not_found#:#Page element not found. copg#:#copg_page_type_stys#:#Layout Page +copg#:#copg_pages#:#Pages copg#:#copg_par_format_selection#:#Paragraph Format Selection copg#:#copg_pc_mob_does_not_exist#:#This media object does not exist. copg#:#copg_plugin_not_avail#:#Plugin %s not available. From 0b4b85d23a90653b6ed3b0960d237c4784d71daf Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Sun, 13 Apr 2025 09:21:58 +0200 Subject: [PATCH 041/125] 44454: Failed test: Mehrere Medienobjekte gleichzeitig hochladen --- .../MediaObject/class.ilObjMediaObjectGUI.php | 5 +++- .../classes/class.ilObjMediaPoolGUI.php | 26 ++++++++++++++++--- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/components/ILIAS/MediaObjects/MediaObject/class.ilObjMediaObjectGUI.php b/components/ILIAS/MediaObjects/MediaObject/class.ilObjMediaObjectGUI.php index b13e6cddd873..f3a3292a0eb1 100755 --- a/components/ILIAS/MediaObjects/MediaObject/class.ilObjMediaObjectGUI.php +++ b/components/ILIAS/MediaObjects/MediaObject/class.ilObjMediaObjectGUI.php @@ -1401,7 +1401,10 @@ public static function _getMediaInfoHTML( $tpl->setVariable("VAL_LOCATION", $med->getLocation()); if ($med->getLocationType() == "LocalFile") { - $info = $media_manager->getInfoOfEntry($med->getMobId(), "/" . $med->getLocation()); + try { + $info = $media_manager->getInfoOfEntry($med->getMobId(), "/" . $med->getLocation()); + } catch (Exception $e) { + } $size = $info["size"] ?? 0; $tpl->setVariable("VAL_FILE_SIZE", " ($size " . $lng->txt("bytes") . ")"); diff --git a/components/ILIAS/MediaPool/classes/class.ilObjMediaPoolGUI.php b/components/ILIAS/MediaPool/classes/class.ilObjMediaPoolGUI.php index 119b992338e6..95d8c4a4fea1 100755 --- a/components/ILIAS/MediaPool/classes/class.ilObjMediaPoolGUI.php +++ b/components/ILIAS/MediaPool/classes/class.ilObjMediaPoolGUI.php @@ -1470,6 +1470,15 @@ protected function handleUploadResult( $mob->setDescription(""); $mob->create(); + $media_item = $mob->addMediaItemFromUpload( + "Standard", + $result, + $this->mep_request->getUploadHash() + ); + + $mob->update(); + + /* $mob->createDirectory(); $media_item = new ilMediaItem(); $mob->addMediaItem($media_item); @@ -1485,7 +1494,13 @@ protected function handleUploadResult( Location::WEB, $file_name, true - ); + );*/ + + // duration + $med_item = $mob->getMediaItem("Standard"); + $med_item->determineDuration(); + $med_item->update(); + $mep_item = new ilMediaPoolItem(); $mep_item->setTitle($title); @@ -1498,6 +1513,7 @@ protected function handleUploadResult( $tree->insertNode($mep_item->getId(), $parent); // get mime type + /* $format = ilObjMediaObject::getMimeType($file); $location = $file_name; @@ -1506,17 +1522,19 @@ protected function handleUploadResult( $media_item->setLocation($location); $media_item->setLocationType("LocalFile"); $media_item->setUploadHash($this->mep_request->getUploadHash()); - $mob->update(); + $mob->update();*/ $item_ids[] = $mob->getId(); + /* $mob = new ilObjMediaObject($mob->getId()); - $mob->generatePreviewPic(320, 240); + $mob->generatePreviewPic(320, 240);*/ // duration + /* $med_item = $mob->getMediaItem("Standard"); $med_item->determineDuration(); - $med_item->update(); + $med_item->update();*/ return new BasicHandlerResult( "mep_id", From 7f10365497c4a8f1b780176b05d9f3a7fc2dae0f Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Sun, 13 Apr 2025 11:53:18 +0200 Subject: [PATCH 042/125] 43217: Failed test: Mehrere Bilder herunterladen --- .../BackgroundTasks/DownloadAllCollectFilesJob.php | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/components/ILIAS/MediaCast/BackgroundTasks/DownloadAllCollectFilesJob.php b/components/ILIAS/MediaCast/BackgroundTasks/DownloadAllCollectFilesJob.php index 9bf897f9a88b..b5e64ca8e0c8 100755 --- a/components/ILIAS/MediaCast/BackgroundTasks/DownloadAllCollectFilesJob.php +++ b/components/ILIAS/MediaCast/BackgroundTasks/DownloadAllCollectFilesJob.php @@ -121,11 +121,14 @@ public function collectMediaFiles(string $target_dir): void $resource = $med->getLocation(); copy($resource, $target_dir . DIRECTORY_SEPARATOR . $str_cnt . basename($resource)); } else { - $stream = $med->getLocationStream(); - file_put_contents( - $target_dir . DIRECTORY_SEPARATOR . $str_cnt . $med->getLocation(), - $stream->getContents() - ); + try { // this skips broken objects + $stream = $med->getLocationStream(); + file_put_contents( + $target_dir . DIRECTORY_SEPARATOR . $str_cnt . $med->getLocation(), + $stream->getContents() + ); + } catch (\Exception $e) { + } } } } From cf1989a9dec32e13ad26c3a128307766e419eb18 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Sun, 13 Apr 2025 13:54:50 +0200 Subject: [PATCH 043/125] fixed 43037: Failed test: View your own repository items; moved classes as suggested --- .../Ownership}/class.ilObjectOwnershipManagementGUI.php | 0 .../Ownership}/class.ilObjectOwnershipManagementTableGUI.php | 0 components/ILIAS/Repository/classes/class.ilRepositoryGUI.php | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) rename components/ILIAS/{ILIASObject/classes => Repository/Ownership}/class.ilObjectOwnershipManagementGUI.php (100%) rename components/ILIAS/{ILIASObject/classes => Repository/Ownership}/class.ilObjectOwnershipManagementTableGUI.php (100%) diff --git a/components/ILIAS/ILIASObject/classes/class.ilObjectOwnershipManagementGUI.php b/components/ILIAS/Repository/Ownership/class.ilObjectOwnershipManagementGUI.php similarity index 100% rename from components/ILIAS/ILIASObject/classes/class.ilObjectOwnershipManagementGUI.php rename to components/ILIAS/Repository/Ownership/class.ilObjectOwnershipManagementGUI.php diff --git a/components/ILIAS/ILIASObject/classes/class.ilObjectOwnershipManagementTableGUI.php b/components/ILIAS/Repository/Ownership/class.ilObjectOwnershipManagementTableGUI.php similarity index 100% rename from components/ILIAS/ILIASObject/classes/class.ilObjectOwnershipManagementTableGUI.php rename to components/ILIAS/Repository/Ownership/class.ilObjectOwnershipManagementTableGUI.php diff --git a/components/ILIAS/Repository/classes/class.ilRepositoryGUI.php b/components/ILIAS/Repository/classes/class.ilRepositoryGUI.php index 6e175dea06a2..19435096cab0 100755 --- a/components/ILIAS/Repository/classes/class.ilRepositoryGUI.php +++ b/components/ILIAS/Repository/classes/class.ilRepositoryGUI.php @@ -126,7 +126,6 @@ public function executeCommand(): void $lng = $this->lng; $ilHelp = $this->help; $ilErr = $this->error; - if ( ($this->user->isAnonymous() || !($this->user->getId() >= 1)) && !ilPublicSectionSettings::getInstance()->isEnabledForDomain( @@ -185,6 +184,7 @@ public function executeCommand(): void } if ($this->ctrl->getCmd() !== "showRepTree") { + $this->ctrl->setParameterByClass($next_class, "item_ref_id", $this->request->getItemRefId()); $this->ctrl->redirectByClass($next_class, $this->ctrl->getCmd()); } } From 757f477d0a0a17852bdc9f2fea6346fc6b114551 Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Sun, 13 Apr 2025 15:29:55 +0200 Subject: [PATCH 044/125] 43976: Failed test: Zugeordnete Lerninhalte durcharbeiten --- .../Presentation/class.ilLMTOCExplorerGUI.php | 32 ++++++++++++------- .../class.ilLMTOCExplorerGUIFactory.php | 2 -- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/components/ILIAS/LearningModule/Presentation/class.ilLMTOCExplorerGUI.php b/components/ILIAS/LearningModule/Presentation/class.ilLMTOCExplorerGUI.php index 4b56596974c5..cfd865d3e6a7 100755 --- a/components/ILIAS/LearningModule/Presentation/class.ilLMTOCExplorerGUI.php +++ b/components/ILIAS/LearningModule/Presentation/class.ilLMTOCExplorerGUI.php @@ -62,7 +62,11 @@ public function __construct( $this->lm_set = new ilSetting("lm"); $this->lang = $a_lang; if ($a_focus_id > 0) { - $this->setSecondaryHighlightedNodes(array($a_focus_id)); + $sec_high = []; + foreach ($this->tree->getSubTree($this->tree->getNodeData($a_focus_id)) as $node) { + $sec_high[] = $node["child"]; + } + $this->setSecondaryHighlightedNodes($sec_high); } if ($this->lm->getTOCMode() != "pages") { $this->setTypeWhiteList(array("st", "du")); @@ -171,12 +175,8 @@ public function isNodeHighlighted($a_node): bool */ public function getNodeContent($a_node): string { - if ($a_node["child"] == $this->getNodeId($this->getRootNode())) { - return $this->service->getPresentationStatus()->getLMPresentationTitle(); - } - if ($a_node["type"] == "st") { - return ilStructureObject::_getPresentationTitle( + $content = ilStructureObject::_getPresentationTitle( $a_node["child"], ilLMObject::CHAPTER_TITLE, $this->lm->isActiveNumbering(), @@ -187,7 +187,7 @@ public function getNodeContent($a_node): string true ); } elseif ($a_node["type"] == "pg") { - return ilLMPageObject::_getPresentationTitle( + $content = ilLMPageObject::_getPresentationTitle( $a_node["child"], $this->lm->getPageHeader(), $this->lm->isActiveNumbering(), @@ -198,10 +198,22 @@ public function getNodeContent($a_node): string true ); } elseif ($a_node["child"] == $this->getNodeId($this->getRootNode())) { - return $this->lm->getTitle(); + $content = $this->service->getPresentationStatus()->getLMPresentationTitle(); } - return $a_node["title"]; + return $this->highlightContent($a_node, $content); + } + + protected function highlightContent(array $node, string $content): string + { + if ($this->isNodeHighlighted($node)) { + $content = "" . $content . ""; + } + $sec = $this->getSecondaryHighlightedNodes(); + if (in_array($node["child"], $sec)) { + return "" . $content . ""; + } + return $content; } @@ -217,7 +229,6 @@ public function getNodeIcon($a_node): string return $icon; } } - // use progress icons (does not depend on lp mode) if (!$this->getOfflineMode() && $this->lm->getProgressIcons()) { return $this->tracker->getIconForLMObject($a_node, $this->highlight_node); @@ -258,7 +269,6 @@ public function getNodeIcon($a_node): string public function isNodeClickable($a_node): bool { $ilUser = $this->user; - $orig_node_id = $a_node["child"]; // if navigation is restricted based on correct answered questions diff --git a/components/ILIAS/LearningModule/Presentation/class.ilLMTOCExplorerGUIFactory.php b/components/ILIAS/LearningModule/Presentation/class.ilLMTOCExplorerGUIFactory.php index 86349b36cab4..73704ffd653a 100755 --- a/components/ILIAS/LearningModule/Presentation/class.ilLMTOCExplorerGUIFactory.php +++ b/components/ILIAS/LearningModule/Presentation/class.ilLMTOCExplorerGUIFactory.php @@ -46,7 +46,6 @@ public function getExplorer( $lm = $service->getLearningModule(); $lm_tree = $service->getLMTree(); $offline = $service->getPresentationStatus()->offline(); - $exp = new ilLMTOCExplorerGUI( "illmpresentationgui", $parent_cmd, @@ -84,7 +83,6 @@ public function getExplorer( if ($offline) { $exp->setOfflineMode(true); } - return $exp; } } From f9b7197ed4cd091b66d5b8e0610ebecca8140fdb Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Sun, 13 Apr 2025 16:16:16 +0200 Subject: [PATCH 045/125] =?UTF-8?q?42903:=20Failed=20test:=20Sichtbarkeit?= =?UTF-8?q?=20einer=20Portfolio-Freigabe=20=C3=BCberpr=C3=BCfen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/ILIAS/Portfolio/classes/class.ilObjPortfolio.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/components/ILIAS/Portfolio/classes/class.ilObjPortfolio.php b/components/ILIAS/Portfolio/classes/class.ilObjPortfolio.php index e95aed3fed9d..e448738e023e 100755 --- a/components/ILIAS/Portfolio/classes/class.ilObjPortfolio.php +++ b/components/ILIAS/Portfolio/classes/class.ilObjPortfolio.php @@ -108,8 +108,9 @@ public static function getAvailablePortfolioLinksForUserIds( $params = null; if ($a_back_url) { - $params = array("back_url" => rawurlencode($a_back_url)); + //$params = array("back_url" => rawurlencode($a_back_url)); } + $params = []; foreach ($access_handler->getShardObjectsDataForUserIds($a_owner_ids) as $owner_id => $items) { foreach ($items as $id => $title) { From 99a433fe2dc394812206307c7af89b6f9d9082ba Mon Sep 17 00:00:00 2001 From: Alexander Killing Date: Sun, 13 Apr 2025 18:59:50 +0200 Subject: [PATCH 046/125] =?UTF-8?q?43593:=20Failed=20test:=20Qualifizieren?= =?UTF-8?q?den=20Test=20f=C3=BCr=20alle=20Lernziele=20durchf=C3=BChren;=20?= =?UTF-8?q?ensure=20addItemDetails=20call?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ObjectiveView/class.ObjectiveRenderer.php | 1 - .../ObjectiveView/class.ilContainerObjectiveGUI.php | 13 ++++++++++--- .../ILIAS/Container/Content/class.ItemRenderer.php | 11 +++++++++-- .../Container/Content/class.ilContainerRenderer.php | 7 +++++++ 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/components/ILIAS/Container/Content/ObjectiveView/class.ObjectiveRenderer.php b/components/ILIAS/Container/Content/ObjectiveView/class.ObjectiveRenderer.php index c726938e0b1c..0618566c71b4 100755 --- a/components/ILIAS/Container/Content/ObjectiveView/class.ObjectiveRenderer.php +++ b/components/ILIAS/Container/Content/ObjectiveView/class.ObjectiveRenderer.php @@ -262,7 +262,6 @@ protected function renderTest( } $node_data['title'] = $title; - return "
" . $this->renderer->getItemRenderer()->renderItem($node_data) . "
"; } diff --git a/components/ILIAS/Container/Content/ObjectiveView/class.ilContainerObjectiveGUI.php b/components/ILIAS/Container/Content/ObjectiveView/class.ilContainerObjectiveGUI.php index 9bdc5313d1c9..c2cd20fb9a5d 100755 --- a/components/ILIAS/Container/Content/ObjectiveView/class.ilContainerObjectiveGUI.php +++ b/components/ILIAS/Container/Content/ObjectiveView/class.ilContainerObjectiveGUI.php @@ -45,7 +45,6 @@ public function __construct( \ILIAS\Container\Content\ItemPresentationManager $item_presentation ) { global $DIC; - $this->tabs = $DIC->tabs(); $this->toolbar = $DIC->toolbar(); $this->logger = $DIC->logger()->crs(); @@ -161,6 +160,16 @@ public function getMainContent(): string return $tpl->get(); } + public function initRenderer(): void + { + parent::initRenderer(); + $this->loc_settings = ilLOSettings::getInstanceByObjId($this->getContainerObject()->getId()); + $this->objective_map = $this->buildObjectiveMap(); + $this->renderer->setItemModifierClosure(function (ilObjectListGUI $a_item_list_gui, array $a_item) { + $this->addItemDetails($a_item_list_gui, $a_item); + }); + } + public function renderItemList(): string { $this->initRenderer(); @@ -468,9 +477,7 @@ protected function addItemDetails(ilObjectListGUI $a_item_list_gui, array $a_ite $lng = $this->lng; $ilCtrl = $this->ctrl; $ilUser = $this->user; - $item_ref_id = $a_item["ref_id"]; - if (is_array($this->objective_map)) { $details = []; if (isset($this->objective_map["material"][$item_ref_id])) { diff --git a/components/ILIAS/Container/Content/class.ItemRenderer.php b/components/ILIAS/Container/Content/class.ItemRenderer.php index 1c5bf5e1a835..2e78e6ad2dd2 100755 --- a/components/ILIAS/Container/Content/class.ItemRenderer.php +++ b/components/ILIAS/Container/Content/class.ItemRenderer.php @@ -38,6 +38,7 @@ class ItemRenderer protected string $view_mode; protected InternalGUIService $gui; protected InternalDomainService $domain; + protected ?\Closure $item_modifier_closure = null; protected array $list_gui = []; public function __construct( @@ -140,8 +141,9 @@ public function renderItem( } } - if (method_exists($this, "addItemDetails")) { - $this->addItemDetails($item_list_gui, $a_item_data); + if ($this->item_modifier_closure instanceof \Closure) { + $c = $this->item_modifier_closure; + $c($item_list_gui, $a_item_data); } // show subitems of sessions @@ -239,6 +241,11 @@ public function renderItem( return $html; } + public function setItemModifierClosure(\Closure $f): void + { + $this->item_modifier_closure = $f; + } + public function renderCard( array $a_item_data, int $a_position = 0, diff --git a/components/ILIAS/Container/Content/class.ilContainerRenderer.php b/components/ILIAS/Container/Content/class.ilContainerRenderer.php index 75e2775f0fbb..57965a272ba2 100755 --- a/components/ILIAS/Container/Content/class.ilContainerRenderer.php +++ b/components/ILIAS/Container/Content/class.ilContainerRenderer.php @@ -67,6 +67,7 @@ class ilContainerRenderer protected ?Closure $block_prefix_closure = null; protected ?Closure $block_postfix_closure = null; protected ?Closure $item_hidden_closure = null; + protected ?Closure $item_modifier_closure = null; protected \ILIAS\Container\Content\BlockSessionRepository $block_repo; public function __construct( @@ -145,6 +146,12 @@ public function setItemHiddenClosure(Closure $f): void $this->item_hidden_closure = $f; } + public function setItemModifierClosure(Closure $f): void + { + $this->item_renderer->setItemModifierClosure($f); + $this->item_modifier_closure = $f; + } + protected function getViewMode(): int { return $this->view_mode; From 069573ebf12f3463a7692c939d7f962a3a487c1d Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Mon, 14 Apr 2025 09:01:59 +0200 Subject: [PATCH 047/125] Test: Fix Access to Old Variable See: https://mantis.ilias.de/view.php?id=44867 --- .../TestQuestionPool/classes/class.ilObjQuestionPoolGUI.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/ILIAS/TestQuestionPool/classes/class.ilObjQuestionPoolGUI.php b/components/ILIAS/TestQuestionPool/classes/class.ilObjQuestionPoolGUI.php index 3438672430f1..263ed297de8e 100755 --- a/components/ILIAS/TestQuestionPool/classes/class.ilObjQuestionPoolGUI.php +++ b/components/ILIAS/TestQuestionPool/classes/class.ilObjQuestionPoolGUI.php @@ -751,7 +751,7 @@ public function download_paragraphObject(): void public function importVerifiedFileObject(): void { - if (!$this->checkPermissionBool('create', '', $this->qplrequest->string('new_type'))) { + if (!$this->checkPermissionBool('create', '', $this->request_data_collector->string('new_type'))) { $this->redirectAfterMissingWrite(); return; } From 81461d11b5158aeaf687ff938e6aa166bb6f55c8 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Mon, 14 Apr 2025 09:04:43 +0200 Subject: [PATCH 048/125] Test: Fix Access to Object in Test in Import See: https://mantis.ilias.de/view.php?id=44867 --- components/ILIAS/Test/classes/class.ilObjTestGUI.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/ILIAS/Test/classes/class.ilObjTestGUI.php b/components/ILIAS/Test/classes/class.ilObjTestGUI.php index 2d985aaaa07e..2e6eb80450a6 100755 --- a/components/ILIAS/Test/classes/class.ilObjTestGUI.php +++ b/components/ILIAS/Test/classes/class.ilObjTestGUI.php @@ -989,7 +989,7 @@ public function executeCommand(): void protected function redirectAfterMissingWrite() { $this->tpl->setOnScreenMessage('failure', $this->lng->txt("no_permission"), true); - $target_class = get_class($this->getTestObject()) . "GUI"; + $target_class = get_class($this->object) . "GUI"; $this->ctrl->setParameterByClass($target_class, 'ref_id', $this->ref_id); $this->ctrl->redirectByClass($target_class); } @@ -998,7 +998,7 @@ protected function redirectAfterMissingRead(): void { $this->tpl->setOnScreenMessage('failure', sprintf( $this->lng->txt("msg_no_perm_read_item"), - $this->getTestObject()->getTitle() + $this->object->getTitle() ), true); $this->ctrl->setParameterByClass('ilrepositorygui', 'ref_id', ROOT_FOLDER_ID); $this->ctrl->redirectByClass('ilrepositorygui'); From 14100808446cd7b78bcdc7a0d856838f5a01fe00 Mon Sep 17 00:00:00 2001 From: Daniel Dahme Date: Mon, 14 Apr 2025 09:11:05 +0200 Subject: [PATCH 049/125] paths changed in in components/ILIAS/ScormAicc/scripts/basisAPI.js (#42059) --- components/ILIAS/ScormAicc/scripts/basisAPI.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/ILIAS/ScormAicc/scripts/basisAPI.js b/components/ILIAS/ScormAicc/scripts/basisAPI.js index 79e6772ce27f..ddb1e92852bb 100755 --- a/components/ILIAS/ScormAicc/scripts/basisAPI.js +++ b/components/ILIAS/ScormAicc/scripts/basisAPI.js @@ -107,7 +107,7 @@ function sendRequest (url, data, callback, user, password, headers) { if (r.content) { if (r.content.indexOf("login.php")>-1) { - window.location.href = "./Modules/Scorm2004/templates/default/session_timeout.html"; + window.location.href = "./components/ILIAS/Scorm2004/templates/default/session_timeout.html"; } } @@ -247,7 +247,7 @@ function IliasLaunch(i_l){ b_launched=false; setTimeout("API.IliasAbortSco("+iv.launchId+")",5000); iv.launchId=i_l; - frames.sahs_content.document.location.replace('./Modules/ScormAicc/templates/default/dummy.html'); + frames.sahs_content.document.location.replace('./components/ILIAS/ScormAicc/templates/default/dummy.html'); } status4tree(iv.launchId,'running'); } From de75396425e94585c9b2cb6964e9d51fec44f73f Mon Sep 17 00:00:00 2001 From: qualitus-dahme Date: Mon, 14 Apr 2025 09:30:21 +0200 Subject: [PATCH 050/125] Synchronisation, no changes From d826460674e480512b3c4309f2a2202379431491 Mon Sep 17 00:00:00 2001 From: Stephan Kergomard Date: Mon, 14 Apr 2025 10:00:16 +0200 Subject: [PATCH 051/125] AccessControl: Add Key on RBAC_Templates See: https://mantis.ilias.de/view.php?id=44819 --- .../Setup/class.ilAccessRBACSetupAgent.php | 18 ++++++--- .../Setup/AccessControl10DBUpdateSteps.php | 38 +++++++++++++++++++ 2 files changed, 50 insertions(+), 6 deletions(-) create mode 100644 components/ILIAS/AccessControl/src/Setup/AccessControl10DBUpdateSteps.php diff --git a/components/ILIAS/AccessControl/classes/Setup/class.ilAccessRBACSetupAgent.php b/components/ILIAS/AccessControl/classes/Setup/class.ilAccessRBACSetupAgent.php index 617ee0667dfb..b0339d03e1ef 100755 --- a/components/ILIAS/AccessControl/classes/Setup/class.ilAccessRBACSetupAgent.php +++ b/components/ILIAS/AccessControl/classes/Setup/class.ilAccessRBACSetupAgent.php @@ -18,27 +18,33 @@ declare(strict_types=1); -use ILIAS\Setup; +use ILIAS\AccessControl\Setup\AccessControl10DBUpdateSteps; +use ILIAS\Setup\Agent\NullAgent; +use ILIAS\Setup\Objective; use ILIAS\Setup\Config; +use ILIAS\Setup\Metrics\Storage; /** * @author Tim Schmitz */ -class ilAccessRBACSetupAgent extends Setup\Agent\NullAgent +class ilAccessRBACSetupAgent extends NullAgent { /** * @inheritdoc */ - public function getUpdateObjective(?Setup\Config $config = null): Setup\Objective + public function getUpdateObjective(Config $config = null): Objective { - return new ilDatabaseUpdateStepsExecutedObjective(new ilAccessRBACDeleteDbkSteps()); + return new ilDatabaseUpdateStepsExecutedObjective(new AccessControl10DBUpdateSteps()); } /** * @inheritdoc */ - public function getStatusObjective(Setup\Metrics\Storage $storage): Setup\Objective + public function getStatusObjective(Storage $storage): Objective { - return new ilDatabaseUpdateStepsMetricsCollectedObjective($storage, new ilAccessRBACDeleteDbkSteps()); + return new ilDatabaseUpdateStepsMetricsCollectedObjective( + $storage, + new AccessControl10DBUpdateSteps() + ); } } diff --git a/components/ILIAS/AccessControl/src/Setup/AccessControl10DBUpdateSteps.php b/components/ILIAS/AccessControl/src/Setup/AccessControl10DBUpdateSteps.php new file mode 100644 index 000000000000..12d1eeda28b7 --- /dev/null +++ b/components/ILIAS/AccessControl/src/Setup/AccessControl10DBUpdateSteps.php @@ -0,0 +1,38 @@ +db = $db; + } + + public function step_1(): void + { + if (!$this->db->indexExistsByFields('rbac_templates', ['type', 'ops_id'])) { + $this->db->addIndex('rbac_templates', ['type', 'ops_id'], 'toi'); + } + } +} From 36ac8b339bbf104e5103c98426a9fa16b132c321 Mon Sep 17 00:00:00 2001 From: Matthias Kunkel Date: Mon, 14 Apr 2025 10:46:10 +0200 Subject: [PATCH 052/125] Update maintenance.md Added Chris Potter as tester for Metadata --- docs/development/maintenance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/development/maintenance.md b/docs/development/maintenance.md index 51d917c299b0..5a93227fc2c3 100755 --- a/docs/development/maintenance.md +++ b/docs/development/maintenance.md @@ -1150,7 +1150,7 @@ of ILIAS. The file contains the following fields: , [tschmitz](https://docu.ilias.de/go/usr/92591) * Authority to Curate Test Cases: [daniela.weber](https://docu.ilias.de/go/usr/40672) * Authority to (De-)Assign Authorities: [smeyer](https://docu.ilias.de/go/usr/191) - * Tester: [TESTER MISSING](https://docu.ilias.de/go/pg/64423_4793) + * Tester: [ChrisPotter](https://docu.ilias.de/go/usr/90855) * Assignee for Security Reports: [smeyer](https://docu.ilias.de/go/usr/191) * Assignee for Security Issues: [smeyer](https://docu.ilias.de/go/usr/191) * Unit-specific Guidelines, Rules, and Regulations: [LINK MISSING]('') From 95e43856a801db106687c12749959a0b1497cef8 Mon Sep 17 00:00:00 2001 From: Matthias Kunkel Date: Mon, 14 Apr 2025 10:50:41 +0200 Subject: [PATCH 053/125] Update maintenance.md Updated members of Technical Board --- docs/development/maintenance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/development/maintenance.md b/docs/development/maintenance.md index 5a93227fc2c3..85a062ff040d 100755 --- a/docs/development/maintenance.md +++ b/docs/development/maintenance.md @@ -9,7 +9,7 @@ contributors. # Special Roles * **Product Management**: [Matthias Kunkel](https://docu.ilias.de/go/usr/115) -* **Technical Board**: [Michael Jansen](https://docu.ilias.de/go/usr/8784), [Stephan Kergomard](https://docu.ilias.de/go/usr/44474), [Richard Klees](https://docu.ilias.de/go/usr/34047), [Nico Roeser](https://docu.ilias.de/go/usr/72730), [Fabian Schmid](https://docu.ilias.de/go/usr/21087) +* **Technical Board**: [Rob Falkenstein](https://docu.ilias.de/go/usr/63946), [Marvin Hackfort](https://docu.ilias.de/go/usr/50523), [Michael Jansen](https://docu.ilias.de/go/usr/8784), [Richard Klees](https://docu.ilias.de/go/usr/34047), [Franziska Wandelmaier](https://docu.ilias.de/go/usr/33833) * **Testcase Management**: [Fabian Kruse](https://docu.ilias.de/go/usr/27631) * **Release Management**: [Fabian Wolf](https://docu.ilias.de/go/usr/29018) * **Technical Documentation**: [Ann-Christin Gruber](https://docu.ilias.de/go/usr/94025) From 026350c2f0397cfcaab7ca9961615ec84bc255e4 Mon Sep 17 00:00:00 2001 From: Michael Jansen Date: Mon, 14 Apr 2025 11:07:53 +0200 Subject: [PATCH 054/125] [FIX] UICore: implicit nullable parameter in unit test (#9369) --- components/ILIAS/UICore/tests/ilTemplateTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/ILIAS/UICore/tests/ilTemplateTest.php b/components/ILIAS/UICore/tests/ilTemplateTest.php index b7960a98059b..c165b3659246 100644 --- a/components/ILIAS/UICore/tests/ilTemplateTest.php +++ b/components/ILIAS/UICore/tests/ilTemplateTest.php @@ -34,7 +34,7 @@ public function setUp(): void public function __construct() { } - public function _getTemplatePath(string $a_tplname, string $a_in_module = null): string + public function _getTemplatePath(string $a_tplname, ?string $a_in_module = null): string { return $this->getTemplatePath($a_tplname, $a_in_module); } From 648b0b202dd7c00f368a0d484a668f434d0c83d6 Mon Sep 17 00:00:00 2001 From: Nils Haagen Date: Fri, 11 Apr 2025 16:33:06 +0200 Subject: [PATCH 055/125] OrgU: 44175, hide inputs at first --- .../Authorities/class.ilOrgUnitGenericMultiInputGUI.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/components/ILIAS/OrgUnit/classes/Positions/Authorities/class.ilOrgUnitGenericMultiInputGUI.php b/components/ILIAS/OrgUnit/classes/Positions/Authorities/class.ilOrgUnitGenericMultiInputGUI.php index d0bd112a8a07..a40f34836326 100755 --- a/components/ILIAS/OrgUnit/classes/Positions/Authorities/class.ilOrgUnitGenericMultiInputGUI.php +++ b/components/ILIAS/OrgUnit/classes/Positions/Authorities/class.ilOrgUnitGenericMultiInputGUI.php @@ -382,7 +382,7 @@ public function insert(\ilTemplate $a_tpl): void } } if ($this->getMulti()) { - $output = "
{$output}
"; + $output = "
{$output}
"; $config = json_encode($this->input_options); $options = json_encode([ 'limit' => 999999, @@ -390,7 +390,10 @@ public function insert(\ilTemplate $a_tpl): void 'locale' => $this->lng->getLangKey() ]); global $tpl; - $tpl->addOnLoadCode("il.DataCollection.genericMultiLineInit('{$this->getFieldId()}',$config,$options);"); + $tpl->addOnLoadCode(" + il.DataCollection.genericMultiLineInit('{$this->getFieldId()}',$config,$options); + document.body.querySelector('#{$this->getFieldId()}').removeAttribute('style'); + "); } $a_tpl->setCurrentBlock("prop_generic"); From d8a21d6f06fba772469927c3df7044075be8eaaa Mon Sep 17 00:00:00 2001 From: mjansen Date: Mon, 14 Apr 2025 11:59:35 +0200 Subject: [PATCH 056/125] Cron: Fix `phpunit` issues --- components/ILIAS/Cron/tests/CronJobEntityTest.php | 12 +++--------- components/ILIAS/Cron/tests/CronJobScheduleTest.php | 5 +++-- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/components/ILIAS/Cron/tests/CronJobEntityTest.php b/components/ILIAS/Cron/tests/CronJobEntityTest.php index 46e5c76e0c58..3fcad259440f 100755 --- a/components/ILIAS/Cron/tests/CronJobEntityTest.php +++ b/components/ILIAS/Cron/tests/CronJobEntityTest.php @@ -23,12 +23,10 @@ use ILIAS\Cron\Job\JobEntity; use ILIAS\Cron\Job\JobResult; use ILIAS\Cron\CronJob; +use PHPUnit\Framework\Attributes\Depends; class CronJobEntityTest extends TestCase { - /** - * @param CronJob|null $job_instance - */ private function getEntity( ?CronJob $job_instance = null, ?int $schedule_type = null, @@ -73,9 +71,7 @@ public function testEntityCollectionCanBeCreatedWithItems(): \ILIAS\Cron\Job\Col return $entities; } - /** - * @depends testEntityCollectionCanBeCreatedWithItems - */ + #[Depends('testEntityCollectionCanBeCreatedWithItems')] public function testCollectionCanBeChanged( \ILIAS\Cron\Job\Collection\JobEntities $entities ): \ILIAS\Cron\Job\Collection\JobEntities { @@ -86,9 +82,7 @@ public function testCollectionCanBeChanged( return $entities; } - /** - * @depends testCollectionCanBeChanged - */ + #[Depends('testCollectionCanBeChanged')] public function testCollectionCanBeFilteredAndSliced(\ILIAS\Cron\Job\Collection\JobEntities $entities): void { $this->assertCount(0, $entities->filter(static function (JobEntity $entity): bool { diff --git a/components/ILIAS/Cron/tests/CronJobScheduleTest.php b/components/ILIAS/Cron/tests/CronJobScheduleTest.php index cd137a5add00..2405b4806218 100755 --- a/components/ILIAS/Cron/tests/CronJobScheduleTest.php +++ b/components/ILIAS/Cron/tests/CronJobScheduleTest.php @@ -22,6 +22,7 @@ use ILIAS\Cron\Job\Schedule\JobScheduleType; use ILIAS\Cron\Job\JobResult; use ILIAS\Cron\CronJob; +use PHPUnit\Framework\Attributes\DataProvider; class CronJobScheduleTest extends TestCase { @@ -434,9 +435,9 @@ function (): DateTimeImmutable { } /** - * @dataProvider jobProvider * @param null|callable(): DateTimeImmutable $last_run_datetime_callable */ + #[DataProvider('jobProvider')] public function testSchedule( CronJob $job_instance, bool $is_manual_run, @@ -575,9 +576,9 @@ function (): DateTimeImmutable { } /** - * @dataProvider weeklyScheduleProvider * @param callable(): DateTimeImmutable $last_run_datetime_provider */ + #[DataProvider('weeklyScheduleProvider')] public function testWeeklySchedules( CronJob $job_instance, callable $last_run_datetime_provider, From 16293afed6871d694220d71e7dc2b2bd5f0852b9 Mon Sep 17 00:00:00 2001 From: mjansen Date: Mon, 14 Apr 2025 11:56:28 +0200 Subject: [PATCH 057/125] ContentPage: Fix `phpunit` issues --- .../ILIAS/ContentPage/tests/PageReadingTimeTest.php | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/components/ILIAS/ContentPage/tests/PageReadingTimeTest.php b/components/ILIAS/ContentPage/tests/PageReadingTimeTest.php index 6638e06c028b..c5e8e70c2311 100755 --- a/components/ILIAS/ContentPage/tests/PageReadingTimeTest.php +++ b/components/ILIAS/ContentPage/tests/PageReadingTimeTest.php @@ -24,11 +24,8 @@ use PHPUnit\Framework\TestCase; use TypeError; use stdClass; +use PHPUnit\Framework\Attributes\DataProvider; -/** - * Class PageReadingTimeTest - * @author Michael Jansen - */ class PageReadingTimeTest extends TestCase { public static function mixedReadingTypesProvider(): array @@ -44,11 +41,8 @@ public static function mixedReadingTypesProvider(): array ]; } - /** - * @param mixed $mixedType - * @dataProvider mixedReadingTypesProvider - */ - public function testPageReadingTimeValueThrowsExceptionWhenConstructedWithInvalidTypes($mixedType): void + #[DataProvider('mixedReadingTypesProvider')] + public function testPageReadingTimeValueThrowsExceptionWhenConstructedWithInvalidTypes(mixed $mixedType): void { $this->expectException(TypeError::class); From bf29e7b8d44727d26720f2c472a2dc381c23ce4f Mon Sep 17 00:00:00 2001 From: mjansen Date: Mon, 14 Apr 2025 11:53:27 +0200 Subject: [PATCH 058/125] Chatroom: Fix `phpunit` issues --- .../tests/ilChatroomAbstractTaskTestBase.php | 13 +++--------- .../tests/ilChatroomAbstractTestBase.php | 20 ++++--------------- .../tests/ilChatroomServerSettingsTest.php | 7 ++----- .../Chatroom/tests/ilChatroomUserTest.php | 12 +++-------- .../tests/ilObjChatroomAccessTest.php | 3 +-- .../tests/ilObjChatroomAdminAccessTest.php | 7 +------ .../Chatroom/tests/ilObjChatroomTest.php | 4 ---- 7 files changed, 14 insertions(+), 52 deletions(-) diff --git a/components/ILIAS/Chatroom/tests/ilChatroomAbstractTaskTestBase.php b/components/ILIAS/Chatroom/tests/ilChatroomAbstractTaskTestBase.php index 2713a329f56a..e2179543efcf 100644 --- a/components/ILIAS/Chatroom/tests/ilChatroomAbstractTaskTestBase.php +++ b/components/ILIAS/Chatroom/tests/ilChatroomAbstractTaskTestBase.php @@ -22,18 +22,11 @@ use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\MockObject\Rule\InvocationOrder; -/** - * Class ilChatroomAbstractTaskTest - * @author Thomas Joußen - */ abstract class ilChatroomAbstractTaskTestBase extends ilChatroomAbstractTestBase { - /** @var MockObject&ilChatroomObjectGUI */ - protected $gui; - /** @var MockObject&ilChatroomServerConnector */ - protected $ilChatroomServerConnectorMock; - /** @var MockObject&ilObjChatroom */ - protected $object; + protected MockObject&ilChatroomObjectGUI $gui; + protected MockObject&ilChatroomServerConnector $ilChatroomServerConnectorMock; + protected MockObject&ilObjChatroom $object; protected function setUp(): void { diff --git a/components/ILIAS/Chatroom/tests/ilChatroomAbstractTestBase.php b/components/ILIAS/Chatroom/tests/ilChatroomAbstractTestBase.php index 04f183f59b81..b13fd537a388 100644 --- a/components/ILIAS/Chatroom/tests/ilChatroomAbstractTestBase.php +++ b/components/ILIAS/Chatroom/tests/ilChatroomAbstractTestBase.php @@ -22,16 +22,10 @@ use PHPUnit\Framework\TestCase; use PHPUnit\Framework\MockObject\MockObject; -/** - * Class ilChatroomAbstractTest - * @author Thomas Joußen - */ abstract class ilChatroomAbstractTestBase extends TestCase { - /** @var MockObject&ilChatroom */ - protected $ilChatroomMock; - /** @var MockObject&ilChatroomUser */ - protected $ilChatroomUserMock; + protected MockObject&ilChatroom $ilChatroomMock; + protected MockObject&ilChatroomUser $ilChatroomUserMock; private ?Container $dic = null; protected function setUp(): void @@ -59,10 +53,7 @@ protected function tearDown(): void parent::tearDown(); } - /** - * @return ilChatroomUser&MockObject - */ - protected function createIlChatroomUserMock(): ilChatroomUser + protected function createIlChatroomUserMock(): ilChatroomUser&MockObject { $this->ilChatroomUserMock = $this->getMockBuilder(ilChatroomUser::class)->disableOriginalConstructor()->onlyMethods( ['getUserId', 'getUsername'] @@ -71,10 +62,7 @@ protected function createIlChatroomUserMock(): ilChatroomUser return $this->ilChatroomUserMock; } - /** - * @return ilDBInterface&MockObject - */ - protected function createGlobalIlDBMock(): ilDBInterface + protected function createGlobalIlDBMock(): ilDBInterface&MockObject { $db = $this->getMockBuilder(ilDBInterface::class)->getMock(); $db->method('quote')->willReturnCallback(static function ($arg): string { diff --git a/components/ILIAS/Chatroom/tests/ilChatroomServerSettingsTest.php b/components/ILIAS/Chatroom/tests/ilChatroomServerSettingsTest.php index 42de2442e575..9dc3c65aeb84 100644 --- a/components/ILIAS/Chatroom/tests/ilChatroomServerSettingsTest.php +++ b/components/ILIAS/Chatroom/tests/ilChatroomServerSettingsTest.php @@ -19,11 +19,8 @@ declare(strict_types=1); use PHPUnit\Framework\TestCase; +use PHPUnit\Framework\Attributes\DataProvider; -/** - * Class ilChatroomServerSettingsTest - * @author Thomas Joußen - */ class ilChatroomServerSettingsTest extends TestCase { protected ilChatroomServerSettings $settings; @@ -64,8 +61,8 @@ public static function setterAndGettersProvider(): array /** * @param callable(mixed): void $assertionCallback * @param mixed $value - * @dataProvider setterAndGettersProvider */ + #[DataProvider('setterAndGettersProvider')] public function testSettersAndGetters(string $property, callable $assertionCallback, $value): void { $setter = 'set' . ucfirst($property); diff --git a/components/ILIAS/Chatroom/tests/ilChatroomUserTest.php b/components/ILIAS/Chatroom/tests/ilChatroomUserTest.php index ca9815a5546f..7b6e45b1785a 100644 --- a/components/ILIAS/Chatroom/tests/ilChatroomUserTest.php +++ b/components/ILIAS/Chatroom/tests/ilChatroomUserTest.php @@ -19,15 +19,11 @@ declare(strict_types=1); use PHPUnit\Framework\MockObject\MockObject; +use PHPUnit\Framework\Attributes\DataProvider; -/** - * Class ilChatroomUserTest - * @author Thomas Joußen - */ class ilChatroomUserTest extends ilChatroomAbstractTestBase { - /** @var ilObjUser&MockObject */ - protected ilObjUser $ilUserMock; + protected ilObjUser&MockObject $ilUserMock; protected ilChatroomUser $user; public function testGetUserIdIfNotAnonymous(): void @@ -70,9 +66,7 @@ public function testGetUserIdRandomGeneratedIfAnonymous(): void $this->assertNotNull($this->user->getUserId()); } - /** - * @dataProvider usernameDataProvider - */ + #[DataProvider('usernameDataProvider')] public function testSetUsername(string $username, string $expected): void { $this->user->setUsername($username); diff --git a/components/ILIAS/Chatroom/tests/ilObjChatroomAccessTest.php b/components/ILIAS/Chatroom/tests/ilObjChatroomAccessTest.php index 236c0e265f36..4d016392c1ba 100644 --- a/components/ILIAS/Chatroom/tests/ilObjChatroomAccessTest.php +++ b/components/ILIAS/Chatroom/tests/ilObjChatroomAccessTest.php @@ -27,8 +27,7 @@ class ilObjChatroomAccessTest extends ilChatroomAbstractTestBase { protected ilObjChatroomAccess $access; - /** @var ilDBInterface&MockObject */ - protected ilDBInterface $db; + protected ilDBInterface&MockObject $db; public function testCommandDefitionFullfilsExpectations(): void { diff --git a/components/ILIAS/Chatroom/tests/ilObjChatroomAdminAccessTest.php b/components/ILIAS/Chatroom/tests/ilObjChatroomAdminAccessTest.php index 21401244f5d8..e9250ef835a5 100644 --- a/components/ILIAS/Chatroom/tests/ilObjChatroomAdminAccessTest.php +++ b/components/ILIAS/Chatroom/tests/ilObjChatroomAdminAccessTest.php @@ -20,15 +20,10 @@ use PHPUnit\Framework\MockObject\MockObject; -/** - * Class ilObjChatroomAdminAccessTest - * @author Thomas Joußen - */ class ilObjChatroomAdminAccessTest extends ilChatroomAbstractTestBase { protected ilObjChatroomAdminAccess $adminAccess; - /** @var ilRbacSystem&MockObject */ - protected ilRbacSystem $ilAccessMock; + protected ilRbacSystem&MockObject $ilAccessMock; public function testCommandDefitionFullfilsExpectations(): void { diff --git a/components/ILIAS/Chatroom/tests/ilObjChatroomTest.php b/components/ILIAS/Chatroom/tests/ilObjChatroomTest.php index b75bceb1763e..16f52f754e80 100644 --- a/components/ILIAS/Chatroom/tests/ilObjChatroomTest.php +++ b/components/ILIAS/Chatroom/tests/ilObjChatroomTest.php @@ -18,10 +18,6 @@ declare(strict_types=1); -/** - * Class ilObjChatroomTest - * @author Thomas Joußen - */ class ilObjChatroomTest extends ilChatroomAbstractTestBase { protected ilObjChatroom $object; From 9227af529970b37af36ed265ea8af3867b818684 Mon Sep 17 00:00:00 2001 From: mjansen Date: Mon, 14 Apr 2025 12:21:34 +0200 Subject: [PATCH 059/125] Html: Fix `phpunit` issues --- .../ILIAS/Html/tests/ilHtmlDomNodeIteratorTest.php | 4 ---- .../ILIAS/Html/tests/ilHtmlPurifierCompositeTest.php | 11 +++-------- .../ILIAS/Html/tests/ilHtmlPurifierLibWrapperTest.php | 11 +++-------- 3 files changed, 6 insertions(+), 20 deletions(-) diff --git a/components/ILIAS/Html/tests/ilHtmlDomNodeIteratorTest.php b/components/ILIAS/Html/tests/ilHtmlDomNodeIteratorTest.php index 26925b32d489..568dda01d117 100755 --- a/components/ILIAS/Html/tests/ilHtmlDomNodeIteratorTest.php +++ b/components/ILIAS/Html/tests/ilHtmlDomNodeIteratorTest.php @@ -20,10 +20,6 @@ use PHPUnit\Framework\TestCase; -/** - * Class ilHtmlDomNodeIteratorTest - * @author Michael Jansen - */ final class ilHtmlDomNodeIteratorTest extends TestCase { public function testDomNodeIteratorIteratesOverXhtmlDocumentNodes(): void diff --git a/components/ILIAS/Html/tests/ilHtmlPurifierCompositeTest.php b/components/ILIAS/Html/tests/ilHtmlPurifierCompositeTest.php index 1f5ab9341074..152e4507763d 100755 --- a/components/ILIAS/Html/tests/ilHtmlPurifierCompositeTest.php +++ b/components/ILIAS/Html/tests/ilHtmlPurifierCompositeTest.php @@ -19,14 +19,11 @@ declare(strict_types=1); use PHPUnit\Framework\TestCase; +use PHPUnit\Framework\Attributes\DataProvider; -/** - * Class ilHtmlPurifierCompositeTest - * @author Michael Jansen - */ final class ilHtmlPurifierCompositeTest extends TestCase { - private const TO_PURIFY = [ + private const array TO_PURIFY = [ 'phpunit1', 'phpunit2', 'phpunit3', @@ -111,9 +108,7 @@ public static function invalidHtmlDataTypeProvider(): array ]; } - /** - * @dataProvider invalidHtmlDataTypeProvider - */ + #[DataProvider('invalidHtmlDataTypeProvider')] public function testExceptionIsRaisedIfNonStringElementsArePassedForHtmlBatchProcessing($element): void { $this->expectException(InvalidArgumentException::class); diff --git a/components/ILIAS/Html/tests/ilHtmlPurifierLibWrapperTest.php b/components/ILIAS/Html/tests/ilHtmlPurifierLibWrapperTest.php index 4e6cf59a9ca4..e82c2ee9c6a9 100755 --- a/components/ILIAS/Html/tests/ilHtmlPurifierLibWrapperTest.php +++ b/components/ILIAS/Html/tests/ilHtmlPurifierLibWrapperTest.php @@ -19,14 +19,11 @@ declare(strict_types=1); use PHPUnit\Framework\TestCase; +use PHPUnit\Framework\Attributes\DataProvider; -/** - * Class ilHtmlPurifierLibWrapperTest - * @author Michael Jansen - */ final class ilHtmlPurifierLibWrapperTest extends TestCase { - private const TO_PURIFY = [ + private const array TO_PURIFY = [ 'phpunit1', 'phpunit2', 'phpunit3', @@ -66,9 +63,7 @@ public static function invalidHtmlDataTypeProvider(): array ]; } - /** - * @dataProvider invalidHtmlDataTypeProvider - */ + #[DataProvider('invalidHtmlDataTypeProvider')] public function testExceptionIsRaisedIfNonStringElementsArePassedForHtmlBatchProcessing($element): void { $this->expectException(InvalidArgumentException::class); From 0f3cb5613e67b4d3ec3cfbfae0fd88f95b4cba26 Mon Sep 17 00:00:00 2001 From: mjansen Date: Mon, 14 Apr 2025 12:11:20 +0200 Subject: [PATCH 060/125] Forum: Fix `phpunit` issues --- .../Forum/tests/ForumNotificationCacheTest.php | 14 ++++---------- .../Forum/tests/PostingReplySubjectBuilderTest.php | 5 ++--- .../ILIAS/Forum/tests/ilForumNotificationTest.php | 9 +++------ components/ILIAS/Forum/tests/ilForumTopicTest.php | 6 ++---- 4 files changed, 11 insertions(+), 23 deletions(-) diff --git a/components/ILIAS/Forum/tests/ForumNotificationCacheTest.php b/components/ILIAS/Forum/tests/ForumNotificationCacheTest.php index 65aeac816bbb..e7e43189b075 100755 --- a/components/ILIAS/Forum/tests/ForumNotificationCacheTest.php +++ b/components/ILIAS/Forum/tests/ForumNotificationCacheTest.php @@ -19,11 +19,8 @@ declare(strict_types=1); use PHPUnit\Framework\TestCase; +use PHPUnit\Framework\Attributes\DataProvider; -/** - * Class ForumNotificationCacheTest - * @author Michael Jansen - */ class ForumNotificationCacheTest extends TestCase { public function testExceptionIsRaisedWhenTryingToRetrieveItemNotCachedYet(): void @@ -52,11 +49,8 @@ public static function nonScalarValuesProvider(): array ]; } - /** - * @param mixed $nonScalarValue - * @dataProvider nonScalarValuesProvider - */ - public function testExceptionIsRaisedWhenKeyShouldBeBuiltWithNonScalarValues($nonScalarValue): void + #[DataProvider('nonScalarValuesProvider')] + public function testExceptionIsRaisedWhenKeyShouldBeBuiltWithNonScalarValues(mixed $nonScalarValue): void { $this->expectException(InvalidArgumentException::class); @@ -77,8 +71,8 @@ public static function scalarValuesAndNullProvider(): array /** * @param scalar|null $scalarValue - * @dataProvider scalarValuesAndNullProvider */ + #[DataProvider('scalarValuesAndNullProvider')] public function testCacheKeyCouldBeGeneratedByArray($scalarValue): void { $cache = new ilForumNotificationCache(); diff --git a/components/ILIAS/Forum/tests/PostingReplySubjectBuilderTest.php b/components/ILIAS/Forum/tests/PostingReplySubjectBuilderTest.php index 2bb0652c549c..39d0b459ff95 100644 --- a/components/ILIAS/Forum/tests/PostingReplySubjectBuilderTest.php +++ b/components/ILIAS/Forum/tests/PostingReplySubjectBuilderTest.php @@ -19,6 +19,7 @@ declare(strict_types=1); use PHPUnit\Framework\TestCase; +use PHPUnit\Framework\Attributes\DataProvider; class PostingReplySubjectBuilderTest extends TestCase { @@ -84,9 +85,7 @@ public static function postingSubjectProvider(): Generator ]; } - /** - * @dataProvider postingSubjectProvider - */ + #[DataProvider('postingSubjectProvider')] public function testPostingSubjectBuilder( string $subject, string $reply_prefix, diff --git a/components/ILIAS/Forum/tests/ilForumNotificationTest.php b/components/ILIAS/Forum/tests/ilForumNotificationTest.php index f758a7d5ec1f..7f5d7f09aa71 100755 --- a/components/ILIAS/Forum/tests/ilForumNotificationTest.php +++ b/components/ILIAS/Forum/tests/ilForumNotificationTest.php @@ -24,12 +24,9 @@ class ilForumNotificationTest extends TestCase { - /** @var MockObject&ilDBInterface */ - private $database; - /** @var MockObject&ilObjUser */ - private $user; - /** @var MockObject&ilTree */ - private $tree; + private MockObject&ilDBInterface $database; + private MockObject&ilObjUser $user; + private MockObject&ilTree $tree; private ?Container $dic = null; public function testConstruct(): void diff --git a/components/ILIAS/Forum/tests/ilForumTopicTest.php b/components/ILIAS/Forum/tests/ilForumTopicTest.php index 1730c2a4c651..1f94ff5a9af3 100755 --- a/components/ILIAS/Forum/tests/ilForumTopicTest.php +++ b/components/ILIAS/Forum/tests/ilForumTopicTest.php @@ -25,10 +25,8 @@ class ilForumTopicTest extends TestCase { - /** @var MockObject&ilDBInterface */ - private $mockDatabase; - /** @var MockObject&ilObjUser */ - private $mockUser; + private MockObject&ilDBInterface $mockDatabase; + private MockObject&ilObjUser $mockUser; private ?Container $dic = null; public function testConstruct(): void From f0c58982188171dfdcc48fe9e9ea203251ce6a27 Mon Sep 17 00:00:00 2001 From: mjansen Date: Mon, 14 Apr 2025 11:41:19 +0200 Subject: [PATCH 061/125] Password: Fix `phpunit` issues --- .../ilArgon2IdPasswordEncoderTest.php | 26 ++----- .../encoders/ilBcryptPasswordEncoderTest.php | 73 ++++--------------- .../ilBcryptPhpPasswordEncoderTest.php | 71 +++++------------- .../encoders/ilMd5PasswordEncoderTest.php | 39 +++------- .../Password/tests/ilPasswordBaseTestCase.php | 4 - 5 files changed, 50 insertions(+), 163 deletions(-) diff --git a/components/ILIAS/Password/tests/encoders/ilArgon2IdPasswordEncoderTest.php b/components/ILIAS/Password/tests/encoders/ilArgon2IdPasswordEncoderTest.php index c9ed9331898e..611295fcf958 100755 --- a/components/ILIAS/Password/tests/encoders/ilArgon2IdPasswordEncoderTest.php +++ b/components/ILIAS/Password/tests/encoders/ilArgon2IdPasswordEncoderTest.php @@ -18,6 +18,8 @@ declare(strict_types=1); +use PHPUnit\Framework\Attributes\Depends; + class ilArgon2IdPasswordEncoderTest extends ilPasswordBaseTestCase { private const PASSWORD = 'password'; @@ -35,9 +37,7 @@ public function testInstanceCanBeCreated(): ilArgon2idPasswordEncoder return $encoder; } - /** - * @depends testInstanceCanBeCreated - */ + #[Depends('testInstanceCanBeCreated')] public function testPasswordShouldBeCorrectlyEncodedAndVerified( ilArgon2idPasswordEncoder $encoder ): ilArgon2idPasswordEncoder { @@ -47,9 +47,7 @@ public function testPasswordShouldBeCorrectlyEncodedAndVerified( return $encoder; } - /** - * @depends testInstanceCanBeCreated - */ + #[Depends('testInstanceCanBeCreated')] public function testExceptionIsRaisedIfThePasswordExceedsTheSupportedLengthOnEncoding( ilArgon2idPasswordEncoder $encoder ): void { @@ -57,34 +55,26 @@ public function testExceptionIsRaisedIfThePasswordExceedsTheSupportedLengthOnEnc $encoder->encodePassword(str_repeat('a', 5000), ''); } - /** - * @depends testInstanceCanBeCreated - */ + #[Depends('testInstanceCanBeCreated')] public function testPasswordVerificationShouldFailIfTheRawPasswordExceedsTheSupportedLength( ilArgon2idPasswordEncoder $encoder ): void { $this->assertFalse($encoder->isPasswordValid('encoded', str_repeat('a', 5000), '')); } - /** - * @depends testInstanceCanBeCreated - */ + #[Depends('testInstanceCanBeCreated')] public function testNameShouldBeArgon2id(ilArgon2idPasswordEncoder $encoder): void { $this->assertSame('argon2id', $encoder->getName()); } - /** - * @depends testInstanceCanBeCreated - */ + #[Depends('testInstanceCanBeCreated')] public function testEncoderDoesNotRelyOnSalts(ilArgon2idPasswordEncoder $encoder): void { $this->assertFalse($encoder->requiresSalt()); } - /** - * @depends testInstanceCanBeCreated - */ + #[Depends('testInstanceCanBeCreated')] public function testReencodingIsDetectedWhenNecessary(ilArgon2idPasswordEncoder $encoder): void { $raw = self::PASSWORD; diff --git a/components/ILIAS/Password/tests/encoders/ilBcryptPasswordEncoderTest.php b/components/ILIAS/Password/tests/encoders/ilBcryptPasswordEncoderTest.php index 8d1924256a11..89a6bfd1143a 100755 --- a/components/ILIAS/Password/tests/encoders/ilBcryptPasswordEncoderTest.php +++ b/components/ILIAS/Password/tests/encoders/ilBcryptPasswordEncoderTest.php @@ -19,27 +19,16 @@ declare(strict_types=1); use org\bovigo\vfs; +use PHPUnit\Framework\Attributes\DoesNotPerformAssertions; +use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\Attributes\Depends; -/** - * Class ilBcryptPasswordEncoderTest - * @author Michael Jansen - * @package ServicesPassword - */ final class ilBcryptPasswordEncoderTest extends ilPasswordBaseTestCase { - /** @var string */ private const VALID_COSTS = '08'; - - /** @var string */ private const PASSWORD = 'password'; - - /** @var string */ private const WRONG_PASSWORD = 'wrong_password'; - - /** @var string */ private const CLIENT_SALT = 'homer!12345_/'; - - /** @var string */ private const PASSWORD_SALT = 'salt'; private vfs\vfsStreamDirectory $testDirectory; @@ -129,10 +118,7 @@ public function testInstanceCanBeCreated(): ilBcryptPasswordEncoder return $encoder; } - /** - * @depends testInstanceCanBeCreated - * @throws ilPasswordException - */ + #[Depends('testInstanceCanBeCreated')] public function testCostsCanBeRetrievedWhenCostsAreSet(ilBcryptPasswordEncoder $encoder): void { $expected = '04'; @@ -141,41 +127,29 @@ public function testCostsCanBeRetrievedWhenCostsAreSet(ilBcryptPasswordEncoder $ $this->assertSame($expected, $encoder->getCosts()); } - /** - * @depends testInstanceCanBeCreated - * @throws ilPasswordException - */ + #[Depends('testInstanceCanBeCreated')] public function testCostsCannotBeSetAboveRange(ilBcryptPasswordEncoder $encoder): void { $this->expectException(ilPasswordException::class); $encoder->setCosts('32'); } - /** - * @depends testInstanceCanBeCreated - * @throws ilPasswordException - */ + #[Depends('testInstanceCanBeCreated')] public function testCostsCannotBeSetBelowRange(ilBcryptPasswordEncoder $encoder): void { $this->expectException(ilPasswordException::class); $encoder->setCosts('3'); } - /** - * @doesNotPerformAssertions - * @depends testInstanceCanBeCreated - * @dataProvider costsProvider - * @throws ilPasswordException - */ + #[DoesNotPerformAssertions] + #[Depends('testInstanceCanBeCreated')] + #[DataProvider('costsProvider')] public function testCostsCanBeSetInRange(string $costs, ilBcryptPasswordEncoder $encoder): void { $encoder->setCosts($costs); } - /** - * @depends testInstanceCanBeCreated - * @throws ilPasswordException - */ + #[Depends('testInstanceCanBeCreated')] public function testPasswordShouldBeCorrectlyEncodedAndVerified( ilBcryptPasswordEncoder $encoder ): ilBcryptPasswordEncoder { @@ -187,10 +161,7 @@ public function testPasswordShouldBeCorrectlyEncodedAndVerified( return $encoder; } - /** - * @depends testInstanceCanBeCreated - * @throws ilPasswordException - */ + #[Depends('testInstanceCanBeCreated')] public function testExceptionIsRaisedIfThePasswordExceedsTheSupportedLengthOnEncoding( ilBcryptPasswordEncoder $encoder ): void { @@ -199,10 +170,7 @@ public function testExceptionIsRaisedIfThePasswordExceedsTheSupportedLengthOnEnc $encoder->encodePassword(str_repeat('a', 5000), self::PASSWORD_SALT); } - /** - * @depends testInstanceCanBeCreated - * @throws ilPasswordException - */ + #[Depends('testInstanceCanBeCreated')] public function testPasswordVerificationShouldFailIfTheRawPasswordExceedsTheSupportedLength( ilBcryptPasswordEncoder $encoder ): void { @@ -210,25 +178,19 @@ public function testPasswordVerificationShouldFailIfTheRawPasswordExceedsTheSupp $this->assertFalse($encoder->isPasswordValid('encoded', str_repeat('a', 5000), self::PASSWORD_SALT)); } - /** - * @depends testInstanceCanBeCreated - */ + #[Depends('testInstanceCanBeCreated')] public function testEncoderReliesOnSalts(ilBcryptPasswordEncoder $encoder): void { $this->assertTrue($encoder->requiresSalt()); } - /** - * @depends testInstanceCanBeCreated - */ + #[Depends('testInstanceCanBeCreated')] public function testEncoderDoesNotSupportReencoding(ilBcryptPasswordEncoder $encoder): void { $this->assertFalse($encoder->requiresReencoding('hello')); } - /** - * @depends testInstanceCanBeCreated - */ + #[Depends('testInstanceCanBeCreated')] public function testNameShouldBeBcrypt(ilBcryptPasswordEncoder $encoder): void { $this->assertSame('bcrypt', $encoder->getName()); @@ -330,10 +292,7 @@ public function testExceptionIfPasswordsContainA8BitCharacterAndBackwardCompatib $encoder->encodePassword(self::PASSWORD . chr(195), self::PASSWORD_SALT); } - /** - * @doesNotPerformAssertions - * @throws ilPasswordException - */ + #[DoesNotPerformAssertions] public function testNoExceptionIfPasswordsContainA8BitCharacterAndBackwardCompatibilityIsEnabledWithIgnoredSecurityFlaw(): void { $this->skipIfvfsStreamNotSupported(); diff --git a/components/ILIAS/Password/tests/encoders/ilBcryptPhpPasswordEncoderTest.php b/components/ILIAS/Password/tests/encoders/ilBcryptPhpPasswordEncoderTest.php index e971a00c46ab..49c6c5692273 100755 --- a/components/ILIAS/Password/tests/encoders/ilBcryptPhpPasswordEncoderTest.php +++ b/components/ILIAS/Password/tests/encoders/ilBcryptPhpPasswordEncoderTest.php @@ -18,20 +18,14 @@ declare(strict_types=1); -/** - * Class ilBcryptPhpPasswordEncoderTest - * @author Michael Jansen - * @package ServicesPassword - */ +use PHPUnit\Framework\Attributes\Depends; +use PHPUnit\Framework\Attributes\DoesNotPerformAssertions; +use PHPUnit\Framework\Attributes\DataProvider; + final class ilBcryptPhpPasswordEncoderTest extends ilPasswordBaseTestCase { - /** @var string */ private const VALID_COSTS = '08'; - - /** @var string */ private const PASSWORD = 'password'; - - /** @var string */ private const WRONG_PASSWORD = 'wrong_password'; /** @@ -61,10 +55,7 @@ public function testInstanceCanBeCreated(): ilBcryptPhpPasswordEncoder return $encoder; } - /** - * @depends testInstanceCanBeCreated - * @throws ilPasswordException - */ + #[Depends('testInstanceCanBeCreated')] public function testCostsCanBeRetrievedWhenCostsAreSet(ilBcryptPhpPasswordEncoder $encoder): void { $expected = '04'; @@ -73,41 +64,29 @@ public function testCostsCanBeRetrievedWhenCostsAreSet(ilBcryptPhpPasswordEncode $this->assertSame($expected, $encoder->getCosts()); } - /** - * @depends testInstanceCanBeCreated - * @throws ilPasswordException - */ + #[Depends('testInstanceCanBeCreated')] public function testCostsCannotBeSetAboveRange(ilBcryptPhpPasswordEncoder $encoder): void { $this->expectException(ilPasswordException::class); $encoder->setCosts('32'); } - /** - * @depends testInstanceCanBeCreated - * @throws ilPasswordException - */ + #[Depends('testInstanceCanBeCreated')] public function testCostsCannotBeSetBelowRange(ilBcryptPhpPasswordEncoder $encoder): void { $this->expectException(ilPasswordException::class); $encoder->setCosts('3'); } - /** - * @depends testInstanceCanBeCreated - * @dataProvider costsProvider - * @doesNotPerformAssertions - * @throws ilPasswordException - */ + #[Depends('testInstanceCanBeCreated')] + #[DataProvider('costsProvider')] + #[DoesNotPerformAssertions] public function testCostsCanBeSetInRange(string $costs, ilBcryptPhpPasswordEncoder $encoder): void { $encoder->setCosts($costs); } - /** - * @depends testInstanceCanBeCreated - * @throws ilPasswordException - */ + #[Depends('testInstanceCanBeCreated')] public function testPasswordShouldBeCorrectlyEncodedAndVerified( ilBcryptPhpPasswordEncoder $encoder ): ilBcryptPhpPasswordEncoder { @@ -119,10 +98,7 @@ public function testPasswordShouldBeCorrectlyEncodedAndVerified( return $encoder; } - /** - * @depends testInstanceCanBeCreated - * @throws ilPasswordException - */ + #[Depends('testInstanceCanBeCreated')] public function testExceptionIsRaisedIfThePasswordExceedsTheSupportedLengthOnEncoding( ilBcryptPhpPasswordEncoder $encoder ): void { @@ -131,10 +107,7 @@ public function testExceptionIsRaisedIfThePasswordExceedsTheSupportedLengthOnEnc $encoder->encodePassword(str_repeat('a', 5000), ''); } - /** - * @depends testInstanceCanBeCreated - * @throws ilPasswordException - */ + #[Depends('testInstanceCanBeCreated')] public function testPasswordVerificationShouldFailIfTheRawPasswordExceedsTheSupportedLength( ilBcryptPhpPasswordEncoder $encoder ): void { @@ -142,18 +115,13 @@ public function testPasswordVerificationShouldFailIfTheRawPasswordExceedsTheSupp $this->assertFalse($encoder->isPasswordValid('encoded', str_repeat('a', 5000), '')); } - /** - * @depends testInstanceCanBeCreated - */ + #[Depends('testInstanceCanBeCreated')] public function testNameShouldBeBcryptPhp(ilBcryptPhpPasswordEncoder $encoder): void { $this->assertSame('bcryptphp', $encoder->getName()); } - /** - * @depends testInstanceCanBeCreated - * @throws ilPasswordException - */ + #[Depends('testInstanceCanBeCreated')] public function testCostsCanBeDeterminedDynamically(ilBcryptPhpPasswordEncoder $encoder): void { $costs_default = $encoder->benchmarkCost(); @@ -166,18 +134,13 @@ public function testCostsCanBeDeterminedDynamically(ilBcryptPhpPasswordEncoder $ $this->assertNotEquals($costs_default, $costs_target); } - /** - * @depends testInstanceCanBeCreated - */ + #[Depends('testInstanceCanBeCreated')] public function testEncoderDoesNotRelyOnSalts(ilBcryptPhpPasswordEncoder $encoder): void { $this->assertFalse($encoder->requiresSalt()); } - /** - * @depends testInstanceCanBeCreated - * @throws ilPasswordException - */ + #[Depends('testInstanceCanBeCreated')] public function testReencodingIsDetectedWhenNecessary(ilBcryptPhpPasswordEncoder $encoder): void { $raw = self::PASSWORD; diff --git a/components/ILIAS/Password/tests/encoders/ilMd5PasswordEncoderTest.php b/components/ILIAS/Password/tests/encoders/ilMd5PasswordEncoderTest.php index 1480a0ea244e..1f849d1f6fdc 100755 --- a/components/ILIAS/Password/tests/encoders/ilMd5PasswordEncoderTest.php +++ b/components/ILIAS/Password/tests/encoders/ilMd5PasswordEncoderTest.php @@ -18,11 +18,8 @@ declare(strict_types=1); -/** - * Class ilMd5PasswordEncoderTest - * @author Michael Jansen - * @package ServicesPassword - */ +use PHPUnit\Framework\Attributes\Depends; + final class ilMd5PasswordEncoderTest extends ilPasswordBaseTestCase { public function testInstanceCanBeCreated(): ilMd5PasswordEncoder @@ -32,44 +29,31 @@ public function testInstanceCanBeCreated(): ilMd5PasswordEncoder return $encoder; } - /** - * @depends testInstanceCanBeCreated - * @throws ilPasswordException - */ + #[Depends('testInstanceCanBeCreated')] public function testPasswordShouldBeCorrectlyEncoded(ilMd5PasswordEncoder $encoder): void { $this->assertSame(md5('password'), $encoder->encodePassword('password', '')); } - /** - * @depends testInstanceCanBeCreated - * @throws ilPasswordException - */ + #[Depends('testInstanceCanBeCreated')] public function testPasswordCanBeVerified(ilMd5PasswordEncoder $encoder): void { $this->assertTrue($encoder->isPasswordValid(md5('password'), 'password', '')); } - /** - * @depends testInstanceCanBeCreated - */ + #[Depends('testInstanceCanBeCreated')] public function testEncoderDoesNotRelyOnSalts(ilMd5PasswordEncoder $encoder): void { $this->assertFalse($encoder->requiresSalt()); } - /** - * @depends testInstanceCanBeCreated - */ + #[Depends('testInstanceCanBeCreated')] public function testEncoderDoesNotSupportReencoding(ilMd5PasswordEncoder $encoder): void { $this->assertFalse($encoder->requiresReencoding('hello')); } - /** - * @depends testInstanceCanBeCreated - * @throws ilPasswordException - */ + #[Depends('testInstanceCanBeCreated')] public function testExceptionIsRaisedIfThePasswordExceedsTheSupportedLengthOnEncoding( ilMd5PasswordEncoder $encoder ): void { @@ -77,19 +61,14 @@ public function testExceptionIsRaisedIfThePasswordExceedsTheSupportedLengthOnEnc $encoder->encodePassword(str_repeat('a', 5000), ''); } - /** - * @depends testInstanceCanBeCreated - * @throws ilPasswordException - */ + #[Depends('testInstanceCanBeCreated')] public function testPasswordVerificationShouldFailIfTheRawPasswordExceedsTheSupportedLength( ilMd5PasswordEncoder $encoder ): void { $this->assertFalse($encoder->isPasswordValid('encoded', str_repeat('a', 5000), '')); } - /** - * @depends testInstanceCanBeCreated - */ + #[Depends('testInstanceCanBeCreated')] public function testNameShouldBeMd5(ilMd5PasswordEncoder $encoder): void { $this->assertSame('md5', $encoder->getName()); diff --git a/components/ILIAS/Password/tests/ilPasswordBaseTestCase.php b/components/ILIAS/Password/tests/ilPasswordBaseTestCase.php index 4c4f3401218c..3e6af29d7048 100644 --- a/components/ILIAS/Password/tests/ilPasswordBaseTestCase.php +++ b/components/ILIAS/Password/tests/ilPasswordBaseTestCase.php @@ -20,10 +20,6 @@ use PHPUnit\Framework\TestCase; -/** - * @author Michael Jansen - * @version $Id$ - */ abstract class ilPasswordBaseTestCase extends TestCase { } From 6c1178457c958ca4af196a4621c63ee8037a1ffb Mon Sep 17 00:00:00 2001 From: mjansen Date: Mon, 14 Apr 2025 12:30:24 +0200 Subject: [PATCH 062/125] Certificate: Fix `phpunit` issues --- .../Certificate/tests/UserCertificateAPITest.php | 3 --- components/ILIAS/Certificate/tests/bootstrap.php | 3 --- .../tests/ilApiUserCertificateRepositoryTest.php | 3 --- .../tests/ilCertificateActiveValidatorTest.php | 3 --- .../Certificate/tests/ilCertificateBaseTestCase.php | 9 +-------- .../tests/ilCertificateCloneActionTest.php | 3 --- .../Certificate/tests/ilCertificateCronTest.php | 3 --- .../tests/ilCertificateDownloadValidatorTest.php | 3 --- .../ilCertificateObjectsForUserPreloaderTest.php | 3 --- .../Certificate/tests/ilCertificatePdfActionTest.php | 3 --- .../tests/ilCertificateQueueEntryTest.php | 3 --- .../tests/ilCertificateQueueRepositoryTest.php | 3 --- .../tests/ilCertificateTemplateDeleteActionTest.php | 3 --- .../tests/ilCertificateTemplateExportActionTest.php | 3 --- .../tests/ilCertificateTemplateImportActionTest.php | 3 --- .../tests/ilCertificateTemplatePreviewActionTest.php | 3 --- .../tests/ilCertificateTemplateRepositoryTest.php | 6 ------ .../tests/ilCertificateTypeClassMapTest.php | 3 --- .../ilCertificateUserForObjectPreloaderTest.php | 3 --- .../tests/ilCertificateValueReplacementTest.php | 3 --- .../tests/ilDefaultPlaceholderDescriptionTest.php | 3 --- .../tests/ilDefaultPlaceholderValuesTest.php | 3 --- .../Certificate/tests/ilFormFieldParserTest.php | 3 --- .../ILIAS/Certificate/tests/ilPageFormatsTest.php | 3 --- .../ILIAS/Certificate/tests/ilPdfGeneratorTest.php | 12 +++--------- .../tests/ilUserCertificateApiGUITest.php | 3 --- .../tests/ilUserCertificateRepositoryTest.php | 6 ------ .../tests/ilUserCertificateTableProviderTest.php | 3 --- .../Certificate/tests/ilUserCertificateTest.php | 3 --- .../ILIAS/Certificate/tests/ilXlsFoParserTest.php | 6 ++++-- .../tests/samples/ilCertificateTemplateTest.php | 3 --- 31 files changed, 8 insertions(+), 109 deletions(-) diff --git a/components/ILIAS/Certificate/tests/UserCertificateAPITest.php b/components/ILIAS/Certificate/tests/UserCertificateAPITest.php index 3ddf4763c424..b6ae0fb46ec5 100755 --- a/components/ILIAS/Certificate/tests/UserCertificateAPITest.php +++ b/components/ILIAS/Certificate/tests/UserCertificateAPITest.php @@ -20,9 +20,6 @@ use ILIAS\Certificate\API\Repository\UserDataRepository; -/** - * @author Niels Theen - */ class UserCertificateAPITest extends ilCertificateBaseTestCase { public function testUserDataCall(): void diff --git a/components/ILIAS/Certificate/tests/bootstrap.php b/components/ILIAS/Certificate/tests/bootstrap.php index 1a96e285cab4..5e6f02cb98d3 100755 --- a/components/ILIAS/Certificate/tests/bootstrap.php +++ b/components/ILIAS/Certificate/tests/bootstrap.php @@ -18,8 +18,5 @@ declare(strict_types=1); -/** - * @author Niels Theen - */ require_once __DIR__ . '/../../../../vendor/composer/vendor/autoload.php'; require_once __DIR__ . '/ilCertificateBaseTestCase.php'; diff --git a/components/ILIAS/Certificate/tests/ilApiUserCertificateRepositoryTest.php b/components/ILIAS/Certificate/tests/ilApiUserCertificateRepositoryTest.php index 52e455c81b67..51013aef576b 100755 --- a/components/ILIAS/Certificate/tests/ilApiUserCertificateRepositoryTest.php +++ b/components/ILIAS/Certificate/tests/ilApiUserCertificateRepositoryTest.php @@ -18,9 +18,6 @@ declare(strict_types=1); -/** - * @author Niels Theen - */ class ilApiUserCertificateRepositoryTest extends ilCertificateBaseTestCase { private \ilDBInterface&\PHPUnit\Framework\MockObject\MockObject $database; diff --git a/components/ILIAS/Certificate/tests/ilCertificateActiveValidatorTest.php b/components/ILIAS/Certificate/tests/ilCertificateActiveValidatorTest.php index ac2e27b5d4cf..a8edd5709639 100755 --- a/components/ILIAS/Certificate/tests/ilCertificateActiveValidatorTest.php +++ b/components/ILIAS/Certificate/tests/ilCertificateActiveValidatorTest.php @@ -18,9 +18,6 @@ declare(strict_types=1); -/** - * @author Niels Theen - */ class ilCertificateActiveValidatorTest extends \PHPUnit\Framework\TestCase { public function testCertificatesAreActiveAndJavaServerIsActive(): void diff --git a/components/ILIAS/Certificate/tests/ilCertificateBaseTestCase.php b/components/ILIAS/Certificate/tests/ilCertificateBaseTestCase.php index 9b959581bc56..bf11aafd9ed5 100755 --- a/components/ILIAS/Certificate/tests/ilCertificateBaseTestCase.php +++ b/components/ILIAS/Certificate/tests/ilCertificateBaseTestCase.php @@ -21,10 +21,6 @@ use ILIAS\DI\Container; use PHPUnit\Framework\TestCase; -/** - * Class ilCertificateBaseTestCase - * @author Michael Jansen - */ abstract class ilCertificateBaseTestCase extends TestCase { protected ?Container $dic; @@ -44,10 +40,7 @@ protected function setUp(): void parent::setUp(); } - /** - * @param mixed $value - */ - protected function setGlobalVariable(string $name, $value): void + protected function setGlobalVariable(string $name, mixed $value): void { global $DIC; diff --git a/components/ILIAS/Certificate/tests/ilCertificateCloneActionTest.php b/components/ILIAS/Certificate/tests/ilCertificateCloneActionTest.php index 549ab5623420..9298f960ec0b 100755 --- a/components/ILIAS/Certificate/tests/ilCertificateCloneActionTest.php +++ b/components/ILIAS/Certificate/tests/ilCertificateCloneActionTest.php @@ -18,9 +18,6 @@ declare(strict_types=1); -/** - * @author Niels Theen - */ class ilCertificateCloneActionTest extends ilCertificateBaseTestCase { public function testCloneCertificate(): void diff --git a/components/ILIAS/Certificate/tests/ilCertificateCronTest.php b/components/ILIAS/Certificate/tests/ilCertificateCronTest.php index 67db0c0604b2..d0239faf270c 100755 --- a/components/ILIAS/Certificate/tests/ilCertificateCronTest.php +++ b/components/ILIAS/Certificate/tests/ilCertificateCronTest.php @@ -20,9 +20,6 @@ use ILIAS\Cron\Job\Schedule\JobScheduleType; -/** - * @author Niels Theen - */ class ilCertificateCronTest extends ilCertificateBaseTestCase { public function testGetTitle(): void diff --git a/components/ILIAS/Certificate/tests/ilCertificateDownloadValidatorTest.php b/components/ILIAS/Certificate/tests/ilCertificateDownloadValidatorTest.php index ed4458f80115..d1280e18e137 100755 --- a/components/ILIAS/Certificate/tests/ilCertificateDownloadValidatorTest.php +++ b/components/ILIAS/Certificate/tests/ilCertificateDownloadValidatorTest.php @@ -18,9 +18,6 @@ declare(strict_types=1); -/** - * @author Niels Theen - */ class ilCertificateDownloadValidatorTest extends ilCertificateBaseTestCase { public function testValidationSucceedsAndReturnsTrue(): void diff --git a/components/ILIAS/Certificate/tests/ilCertificateObjectsForUserPreloaderTest.php b/components/ILIAS/Certificate/tests/ilCertificateObjectsForUserPreloaderTest.php index 20b8806239c3..2f07a98b4336 100755 --- a/components/ILIAS/Certificate/tests/ilCertificateObjectsForUserPreloaderTest.php +++ b/components/ILIAS/Certificate/tests/ilCertificateObjectsForUserPreloaderTest.php @@ -18,9 +18,6 @@ declare(strict_types=1); -/** - * @author Niels Theen - */ class ilCertificateObjectsForUserPreloaderTest extends ilCertificateBaseTestCase { public function testUsersWithCertifcatesWillBePreoloaded(): void diff --git a/components/ILIAS/Certificate/tests/ilCertificatePdfActionTest.php b/components/ILIAS/Certificate/tests/ilCertificatePdfActionTest.php index a088b3065a92..03502c730ddc 100755 --- a/components/ILIAS/Certificate/tests/ilCertificatePdfActionTest.php +++ b/components/ILIAS/Certificate/tests/ilCertificatePdfActionTest.php @@ -18,9 +18,6 @@ declare(strict_types=1); -/** - * @author Niels Theen - */ class ilCertificatePdfActionTest extends ilCertificateBaseTestCase { public function testCreatePdfWillCreatedAndIsDownloadable(): void diff --git a/components/ILIAS/Certificate/tests/ilCertificateQueueEntryTest.php b/components/ILIAS/Certificate/tests/ilCertificateQueueEntryTest.php index 617bc185b679..fb91ee661a35 100755 --- a/components/ILIAS/Certificate/tests/ilCertificateQueueEntryTest.php +++ b/components/ILIAS/Certificate/tests/ilCertificateQueueEntryTest.php @@ -18,9 +18,6 @@ declare(strict_types=1); -/** - * @author Niels Theen - */ class ilCertificateQueueEntryTest extends ilCertificateBaseTestCase { public function testEntryCanBeInstantiated(): void diff --git a/components/ILIAS/Certificate/tests/ilCertificateQueueRepositoryTest.php b/components/ILIAS/Certificate/tests/ilCertificateQueueRepositoryTest.php index bcef646755f5..90b9e5f004d0 100755 --- a/components/ILIAS/Certificate/tests/ilCertificateQueueRepositoryTest.php +++ b/components/ILIAS/Certificate/tests/ilCertificateQueueRepositoryTest.php @@ -18,9 +18,6 @@ declare(strict_types=1); -/** - * @author Niels Theen - */ class ilCertificateQueueRepositoryTest extends ilCertificateBaseTestCase { public function testEntryCanBeAddedToQueue(): void diff --git a/components/ILIAS/Certificate/tests/ilCertificateTemplateDeleteActionTest.php b/components/ILIAS/Certificate/tests/ilCertificateTemplateDeleteActionTest.php index 1ceb18c3ab23..69013bab7226 100755 --- a/components/ILIAS/Certificate/tests/ilCertificateTemplateDeleteActionTest.php +++ b/components/ILIAS/Certificate/tests/ilCertificateTemplateDeleteActionTest.php @@ -18,9 +18,6 @@ declare(strict_types=1); -/** - * @author Niels Theen - */ class ilCertificateTemplateDeleteActionTest extends ilCertificateBaseTestCase { public function testDeleteTemplateAndUseOldThumbnail(): void diff --git a/components/ILIAS/Certificate/tests/ilCertificateTemplateExportActionTest.php b/components/ILIAS/Certificate/tests/ilCertificateTemplateExportActionTest.php index 1f6719014a88..f53702571773 100755 --- a/components/ILIAS/Certificate/tests/ilCertificateTemplateExportActionTest.php +++ b/components/ILIAS/Certificate/tests/ilCertificateTemplateExportActionTest.php @@ -20,9 +20,6 @@ use ILIAS\ResourceStorage\Services as IRSS; -/** - * @author Niels Theen - */ class ilCertificateTemplateExportActionTest extends ilCertificateBaseTestCase { public function testExport(): void diff --git a/components/ILIAS/Certificate/tests/ilCertificateTemplateImportActionTest.php b/components/ILIAS/Certificate/tests/ilCertificateTemplateImportActionTest.php index 20df310210ce..9fca66fcb492 100755 --- a/components/ILIAS/Certificate/tests/ilCertificateTemplateImportActionTest.php +++ b/components/ILIAS/Certificate/tests/ilCertificateTemplateImportActionTest.php @@ -23,9 +23,6 @@ use ILIAS\ResourceStorage\Services as IRSS; use ILIAS\ResourceStorage\Identification\ResourceIdentification; -/** - * @author Niels Theen - */ class ilCertificateTemplateImportActionTest extends ilCertificateBaseTestCase { public function testCertificateCanBeImportedWithBackgroundImage(): void diff --git a/components/ILIAS/Certificate/tests/ilCertificateTemplatePreviewActionTest.php b/components/ILIAS/Certificate/tests/ilCertificateTemplatePreviewActionTest.php index 8149a4dd446b..d1f3f8b8c620 100755 --- a/components/ILIAS/Certificate/tests/ilCertificateTemplatePreviewActionTest.php +++ b/components/ILIAS/Certificate/tests/ilCertificateTemplatePreviewActionTest.php @@ -20,9 +20,6 @@ use ILIAS\ResourceStorage\Services as IRSS; -/** - * @author Niels Theen - */ class ilCertificateTemplatePreviewActionTest extends ilCertificateBaseTestCase { public function testA(): void diff --git a/components/ILIAS/Certificate/tests/ilCertificateTemplateRepositoryTest.php b/components/ILIAS/Certificate/tests/ilCertificateTemplateRepositoryTest.php index 94222cfaab63..0a660b64fc2b 100755 --- a/components/ILIAS/Certificate/tests/ilCertificateTemplateRepositoryTest.php +++ b/components/ILIAS/Certificate/tests/ilCertificateTemplateRepositoryTest.php @@ -18,9 +18,6 @@ declare(strict_types=1); -/** - * @author Niels Theen - */ class ilCertificateTemplateRepositoryTest extends ilCertificateBaseTestCase { public function testCertificateWillBeSavedToTheDatabase(): void @@ -460,9 +457,6 @@ function () use (&$consecutive) { $this->assertSame(30, $templates[1]->getObjId()); } - /** - * - */ public function testFetchFirstCreatedTemplateFailsBecauseNothingWasSaved(): never { $this->expectException(ilException::class); diff --git a/components/ILIAS/Certificate/tests/ilCertificateTypeClassMapTest.php b/components/ILIAS/Certificate/tests/ilCertificateTypeClassMapTest.php index 25f52bb83b11..ed7da5fa08d6 100755 --- a/components/ILIAS/Certificate/tests/ilCertificateTypeClassMapTest.php +++ b/components/ILIAS/Certificate/tests/ilCertificateTypeClassMapTest.php @@ -22,9 +22,6 @@ use ILIAS\Course\Certificate\CoursePlaceholderValues; use ILIAS\Test\Certificate\TestPlaceholderValues; -/** - * @author Niels Theen - */ class ilCertificateTypeClassMapTest extends ilCertificateBaseTestCase { private ilCertificateTypeClassMap $classMap; diff --git a/components/ILIAS/Certificate/tests/ilCertificateUserForObjectPreloaderTest.php b/components/ILIAS/Certificate/tests/ilCertificateUserForObjectPreloaderTest.php index 2905d5075c71..7e1dbaffb87d 100755 --- a/components/ILIAS/Certificate/tests/ilCertificateUserForObjectPreloaderTest.php +++ b/components/ILIAS/Certificate/tests/ilCertificateUserForObjectPreloaderTest.php @@ -18,9 +18,6 @@ declare(strict_types=1); -/** - * @author Niels Theen - */ class ilCertificateUserForObjectPreloaderTest extends ilCertificateBaseTestCase { public function testUsersWithCertifcatesWillBePreoloaded(): void diff --git a/components/ILIAS/Certificate/tests/ilCertificateValueReplacementTest.php b/components/ILIAS/Certificate/tests/ilCertificateValueReplacementTest.php index 2008885c2408..476e53f5abe3 100755 --- a/components/ILIAS/Certificate/tests/ilCertificateValueReplacementTest.php +++ b/components/ILIAS/Certificate/tests/ilCertificateValueReplacementTest.php @@ -18,9 +18,6 @@ declare(strict_types=1); -/** - * @author Niels Theen - */ class ilCertificateValueReplacementTest extends ilCertificateBaseTestCase { public function testReplace(): void diff --git a/components/ILIAS/Certificate/tests/ilDefaultPlaceholderDescriptionTest.php b/components/ILIAS/Certificate/tests/ilDefaultPlaceholderDescriptionTest.php index 0ac746e417d5..9b06e62e0833 100755 --- a/components/ILIAS/Certificate/tests/ilDefaultPlaceholderDescriptionTest.php +++ b/components/ILIAS/Certificate/tests/ilDefaultPlaceholderDescriptionTest.php @@ -18,9 +18,6 @@ declare(strict_types=1); -/** - * @author Niels Theen - */ class ilDefaultPlaceholderDescriptionTest extends ilCertificateBaseTestCase { public function testCreateHtmlDescription(): void diff --git a/components/ILIAS/Certificate/tests/ilDefaultPlaceholderValuesTest.php b/components/ILIAS/Certificate/tests/ilDefaultPlaceholderValuesTest.php index 71f7a998845d..284b7046b2eb 100755 --- a/components/ILIAS/Certificate/tests/ilDefaultPlaceholderValuesTest.php +++ b/components/ILIAS/Certificate/tests/ilDefaultPlaceholderValuesTest.php @@ -18,9 +18,6 @@ declare(strict_types=1); -/** - * @author Niels Theen - */ class ilDefaultPlaceholderValuesTest extends ilCertificateBaseTestCase { public function testGetPlaceholderValues(): void diff --git a/components/ILIAS/Certificate/tests/ilFormFieldParserTest.php b/components/ILIAS/Certificate/tests/ilFormFieldParserTest.php index 129078867a7a..11d2a37f88cc 100755 --- a/components/ILIAS/Certificate/tests/ilFormFieldParserTest.php +++ b/components/ILIAS/Certificate/tests/ilFormFieldParserTest.php @@ -18,9 +18,6 @@ declare(strict_types=1); -/** - * @author Niels Theen - */ class ilFormFieldParserTest extends ilCertificateBaseTestCase { public function testA4(): void diff --git a/components/ILIAS/Certificate/tests/ilPageFormatsTest.php b/components/ILIAS/Certificate/tests/ilPageFormatsTest.php index 59f38955fbf0..90ed4fca3daf 100755 --- a/components/ILIAS/Certificate/tests/ilPageFormatsTest.php +++ b/components/ILIAS/Certificate/tests/ilPageFormatsTest.php @@ -18,9 +18,6 @@ declare(strict_types=1); -/** - * @author Niels Theen - */ class ilPageFormatsTest extends ilCertificateBaseTestCase { public function testFetchFormats(): void diff --git a/components/ILIAS/Certificate/tests/ilPdfGeneratorTest.php b/components/ILIAS/Certificate/tests/ilPdfGeneratorTest.php index 4082a75e559e..b4d28e1b0d73 100755 --- a/components/ILIAS/Certificate/tests/ilPdfGeneratorTest.php +++ b/components/ILIAS/Certificate/tests/ilPdfGeneratorTest.php @@ -21,15 +21,11 @@ use ILIAS\ResourceStorage\Services as IRSS; use ILIAS\Certificate\ValueObject\CertificateId; use ILIAS\Filesystem\Filesystem; +use PHPUnit\Framework\Attributes\DoesNotPerformAssertions; -/** - * @author Niels Theen - */ class ilPdfGeneratorTest extends ilCertificateBaseTestCase { - /** - * @doesNotPerformAssertions - */ + #[DoesNotPerformAssertions] public function testGenerateSpecificCertificate(): void { if (!defined('CLIENT_WEB_DIR')) { @@ -106,9 +102,7 @@ public function testGenerateSpecificCertificate(): void $pdfGenerator->generate(100); } - /** - * @doesNotPerformAssertions - */ + #[DoesNotPerformAssertions] public function testGenerateCurrentActiveCertificate(): void { if (!defined('CLIENT_WEB_DIR')) { diff --git a/components/ILIAS/Certificate/tests/ilUserCertificateApiGUITest.php b/components/ILIAS/Certificate/tests/ilUserCertificateApiGUITest.php index 94cea0f4636f..12a2ba40b146 100755 --- a/components/ILIAS/Certificate/tests/ilUserCertificateApiGUITest.php +++ b/components/ILIAS/Certificate/tests/ilUserCertificateApiGUITest.php @@ -20,9 +20,6 @@ use Psr\Http\Message\ServerRequestInterface; -/** - * @author Niels Theen - */ class ilUserCertificateApiGUITest extends ilCertificateBaseTestCase { public function testCreationOfGuiClass(): void diff --git a/components/ILIAS/Certificate/tests/ilUserCertificateRepositoryTest.php b/components/ILIAS/Certificate/tests/ilUserCertificateRepositoryTest.php index 40d4bd100601..c86fe3f8d3f0 100755 --- a/components/ILIAS/Certificate/tests/ilUserCertificateRepositoryTest.php +++ b/components/ILIAS/Certificate/tests/ilUserCertificateRepositoryTest.php @@ -20,9 +20,6 @@ use ILIAS\Certificate\ValueObject\CertificateId; -/** - * @author Niels Theen - */ class ilUserCertificateRepositoryTest extends ilCertificateBaseTestCase { public function testSaveOfUserCertificateToDatabase(): void @@ -240,9 +237,6 @@ public function testFetchActiveCertificateForUserObjectCombination(): void $this->assertSame(141, $result->getId()); } - /** - * - */ public function testFetchNoActiveCertificateLeadsToException(): never { $this->expectException(ilException::class); diff --git a/components/ILIAS/Certificate/tests/ilUserCertificateTableProviderTest.php b/components/ILIAS/Certificate/tests/ilUserCertificateTableProviderTest.php index bab32a75a769..040f71215551 100755 --- a/components/ILIAS/Certificate/tests/ilUserCertificateTableProviderTest.php +++ b/components/ILIAS/Certificate/tests/ilUserCertificateTableProviderTest.php @@ -18,9 +18,6 @@ declare(strict_types=1); -/** - * @author Niels Theen - */ class ilUserCertificateTableProviderTest extends ilCertificateBaseTestCase { public function testFetchingDataSetForTableWithoutParamtersAndWithoutFilters(): void diff --git a/components/ILIAS/Certificate/tests/ilUserCertificateTest.php b/components/ILIAS/Certificate/tests/ilUserCertificateTest.php index 09f2d4caa3db..555841137656 100755 --- a/components/ILIAS/Certificate/tests/ilUserCertificateTest.php +++ b/components/ILIAS/Certificate/tests/ilUserCertificateTest.php @@ -20,9 +20,6 @@ use ILIAS\Certificate\ValueObject\CertificateId; -/** - * @author Niels Theen - */ class ilUserCertificateTest extends ilCertificateBaseTestCase { public function testCreateUserCertificate(): void diff --git a/components/ILIAS/Certificate/tests/ilXlsFoParserTest.php b/components/ILIAS/Certificate/tests/ilXlsFoParserTest.php index 3a051f73511a..8e1154ed918c 100755 --- a/components/ILIAS/Certificate/tests/ilXlsFoParserTest.php +++ b/components/ILIAS/Certificate/tests/ilXlsFoParserTest.php @@ -18,6 +18,8 @@ declare(strict_types=1); +use PHPUnit\Framework\Attributes\DataProvider; + class ilXlsFoParserTest extends ilCertificateBaseTestCase { /** @@ -521,9 +523,9 @@ public static function nonBreakingSpaceIsAddedDataProvider(): Generator } /** - * @dataProvider nonBreakingSpaceIsAddedDataProvider * @param array{"certificate_text": string, "pageformat": string, "pagewidth"?: string, "pageheight"?: string, "margin_body": array{"top": string, "right": string, "bottom": string, "left": string}} $form_data */ + #[DataProvider('nonBreakingSpaceIsAddedDataProvider')] public function testTransformingParagraphsWithNoTextAndNoChildrenResultsInNonBreakingSpaceXslFoBlock( array $form_data, string $fo @@ -619,9 +621,9 @@ public static function noNonBreakingSpaceIsAddedDataProvider(): Generator } /** - * @dataProvider noNonBreakingSpaceIsAddedDataProvider * @param array{"certificate_text": string, "pageformat": string, "pagewidth"?: string, "pageheight"?: string, "margin_body": array{"top": string, "right": string, "bottom": string, "left": string}} $form_data */ + #[DataProvider('noNonBreakingSpaceIsAddedDataProvider')] public function testTransformingParagraphsWithTextOrChildrenResultsNotInNonBreakingSpaceXslFoBlock( array $form_data, string $fo diff --git a/components/ILIAS/Certificate/tests/samples/ilCertificateTemplateTest.php b/components/ILIAS/Certificate/tests/samples/ilCertificateTemplateTest.php index 52cba4730589..5315bc649f59 100755 --- a/components/ILIAS/Certificate/tests/samples/ilCertificateTemplateTest.php +++ b/components/ILIAS/Certificate/tests/samples/ilCertificateTemplateTest.php @@ -18,9 +18,6 @@ declare(strict_types=1); -/** - * @author Niels Theen - */ class ilCertificateTemplateTest extends ilCertificateBaseTestCase { public function testCreateCertificateTemplate(): void From a2eca60e426b84e33e2f3b1f65dceedd796b81c5 Mon Sep 17 00:00:00 2001 From: mjansen Date: Mon, 14 Apr 2025 12:08:33 +0200 Subject: [PATCH 063/125] Mail: Fix `phpunit` issues --- .../Mail/tests/gui/ilMailOptionsGUITest.php | 19 ++--------- .../tests/ilGroupNameAsMailValidatorTest.php | 5 --- .../Mail/tests/ilMailAddressListTest.php | 14 +++----- .../Mail/tests/ilMailAddressParserTest.php | 21 +++--------- .../ILIAS/Mail/tests/ilMailAddressTest.php | 10 ++---- .../Mail/tests/ilMailAddressTypesTest.php | 9 ----- .../tests/ilMailAutoresponderServiceTest.php | 5 ++- .../ILIAS/Mail/tests/ilMailBaseTestCase.php | 4 --- .../Mail/tests/ilMailBodyPurifierTest.php | 6 ++-- .../Mail/tests/ilMailErrorFormatterTest.php | 4 ++- .../tests/ilMailMimeSubjectBuilderTest.php | 13 +++---- .../ILIAS/Mail/tests/ilMailMimeTest.php | 34 ------------------- .../ILIAS/Mail/tests/ilMailOptionsTest.php | 8 ++--- .../Mail/tests/ilMailTaskProcessorTest.php | 23 ------------- .../Mail/tests/ilMailTemplateContextTest.php | 9 ++--- .../tests/ilMailTemplateRepositoryTest.php | 25 +++----------- .../Mail/tests/ilMailTemplateServiceTest.php | 10 ------ components/ILIAS/Mail/tests/ilMailTest.php | 12 ++----- .../tests/ilMailTransportSettingsTest.php | 19 ----------- 19 files changed, 37 insertions(+), 213 deletions(-) diff --git a/components/ILIAS/Mail/tests/gui/ilMailOptionsGUITest.php b/components/ILIAS/Mail/tests/gui/ilMailOptionsGUITest.php index a260d93856a8..d9ca38889170 100755 --- a/components/ILIAS/Mail/tests/gui/ilMailOptionsGUITest.php +++ b/components/ILIAS/Mail/tests/gui/ilMailOptionsGUITest.php @@ -22,16 +22,10 @@ use Psr\Http\Message\ServerRequestInterface; use ILIAS\HTTP\GlobalHttpState; use ILIAS\Refinery\Factory; +use PHPUnit\Framework\Attributes\DoesNotPerformAssertions; -/** - * Class ilMailOptionsGUITest - * @author Michael Jansen - */ class ilMailOptionsGUITest extends ilMailBaseTestCase { - /** - * @throws ReflectionException - */ protected function getMailOptionsGUI( GlobalHttpState $httpState, ilCtrlInterface $ctrl, @@ -52,10 +46,7 @@ protected function getMailOptionsGUI( ); } - /** - * @doesNotPerformAssertions - * @throws ReflectionException - */ + #[DoesNotPerformAssertions] public function testMailOptionsAreAccessibleIfGlobalAccessIsNotDenied(): void { $ctrl = $this->getMockBuilder(ilCtrl::class)->disableOriginalConstructor()->getMock(); @@ -92,9 +83,6 @@ public function testMailOptionsAreAccessibleIfGlobalAccessIsNotDenied(): void $gui->executeCommand(); } - /** - * @throws ReflectionException - */ public function testMailOptionsAreNotAccessibleIfGlobalAccessIsDeniedAndUserWillBeRedirectedToMailSystem(): void { $ctrl = $this->getMockBuilder(ilCtrl::class)->disableOriginalConstructor()->getMock(); @@ -133,9 +121,6 @@ public function testMailOptionsAreNotAccessibleIfGlobalAccessIsDeniedAndUserWill $gui->executeCommand(); } - /** - * @throws ReflectionException - */ public function testMailOptionsAreNotAccessibleIfGlobalAccessIsDeniedAndUserWillBeRedirectedToPersonalSettings(): void { $this->expectException(ilCtrlException::class); diff --git a/components/ILIAS/Mail/tests/ilGroupNameAsMailValidatorTest.php b/components/ILIAS/Mail/tests/ilGroupNameAsMailValidatorTest.php index faee74483cb7..f53a4db3a1b5 100755 --- a/components/ILIAS/Mail/tests/ilGroupNameAsMailValidatorTest.php +++ b/components/ILIAS/Mail/tests/ilGroupNameAsMailValidatorTest.php @@ -18,11 +18,6 @@ declare(strict_types=1); -/** - * Class ilGroupNameAsMailValidatorTest - * @author Niels Theen - * @author Michael Jansen - */ class ilGroupNameAsMailValidatorTest extends ilMailBaseTestCase { public function testGroupIsDetectedIfGroupNameExists(): void diff --git a/components/ILIAS/Mail/tests/ilMailAddressListTest.php b/components/ILIAS/Mail/tests/ilMailAddressListTest.php index e8eb352bab38..1916b16620be 100755 --- a/components/ILIAS/Mail/tests/ilMailAddressListTest.php +++ b/components/ILIAS/Mail/tests/ilMailAddressListTest.php @@ -18,10 +18,8 @@ declare(strict_types=1); -/** - * Class ilMailAddressListTest - * @author Michael Jansen - */ +use PHPUnit\Framework\Attributes\DataProvider; + class ilMailAddressListTest extends ilMailBaseTestCase { public static function addressTestProvider(): array @@ -53,9 +51,7 @@ public static function addressTestProvider(): array ]; } - /** - * @dataProvider addressTestProvider - */ + #[DataProvider('addressTestProvider')] public function testDiffAddressListCanCalculateTheDifferenceOfTwoLists( array $leftAddresses, array $rightAddresses, @@ -98,9 +94,7 @@ public static function externalAddressTestProvider(): array ]; } - /** - * @dataProvider externalAddressTestProvider - */ + #[DataProvider('externalAddressTestProvider')] public function testExternalAddressListDecoratorFiltersExternalAddresses( ilMailAddress $address, int $numberOfExpectedItems diff --git a/components/ILIAS/Mail/tests/ilMailAddressParserTest.php b/components/ILIAS/Mail/tests/ilMailAddressParserTest.php index 336b3cbfb5a3..7307c94d21b0 100755 --- a/components/ILIAS/Mail/tests/ilMailAddressParserTest.php +++ b/components/ILIAS/Mail/tests/ilMailAddressParserTest.php @@ -18,10 +18,8 @@ declare(strict_types=1); -/** - * Class ilMailAddressParserTest - * @author Michael Jansen - */ +use PHPUnit\Framework\Attributes\DataProvider; + class ilMailAddressParserTest extends ilMailBaseTestCase { private const DEFAULT_HOST = 'ilias'; @@ -121,9 +119,7 @@ public static function emailInvalidAddressesProvider(): array ]; } - /** - * @dataProvider emailAddressesProvider - */ + #[DataProvider('emailAddressesProvider')] public function testBuiltInAddressParser(string $addresses, array $expected): void { if (!function_exists('imap_rfc822_parse_adrlist')) { @@ -137,9 +133,7 @@ public function testBuiltInAddressParser(string $addresses, array $expected): vo $this->assertEquals($expected, $parsedAddresses); } - /** - * @dataProvider emailAddressesProvider - */ + #[DataProvider('emailAddressesProvider')] public function testPearAddressParser(string $addresses, array $expected): void { $parser = new ilMailPearRfc822WrapperAddressParser($addresses); @@ -157,9 +151,7 @@ public function testAddressParserReturnsEmptyListIfAnEmptyAddressStringIsGiven() $this->assertCount(0, $parsedAddresses); } - /** - * @dataProvider emailInvalidAddressesProvider - */ + #[DataProvider('emailInvalidAddressesProvider')] public function testExceptionShouldBeRaisedIfEmailCannotBeParsedWithPearAddressParser(string $addresses): void { $this->expectException(ilMailException::class); @@ -168,9 +160,6 @@ public function testExceptionShouldBeRaisedIfEmailCannotBeParsedWithPearAddressP $parser->parse(); } - /** - * @throws ReflectionException - */ public function testWrappingParserDelegatesParsingToAggregatedParser(): void { $wrappedParser = $this->getMockBuilder(ilBaseMailRfc822AddressParser::class) diff --git a/components/ILIAS/Mail/tests/ilMailAddressTest.php b/components/ILIAS/Mail/tests/ilMailAddressTest.php index 1f477e8d1ff3..34070c8388c6 100755 --- a/components/ILIAS/Mail/tests/ilMailAddressTest.php +++ b/components/ILIAS/Mail/tests/ilMailAddressTest.php @@ -18,10 +18,8 @@ declare(strict_types=1); -/** - * Class ilMailAddressTest - * @author Michael Jansen - */ +use PHPUnit\Framework\Attributes\Depends; + class ilMailAddressTest extends ilMailBaseTestCase { private const LOCAL_PART = 'phpunit'; @@ -36,9 +34,7 @@ public function testInstanceCanBeCreated(): ilMailAddress return $address; } - /** - * @depends testInstanceCanBeCreated - */ + #[Depends('testInstanceCanBeCreated')] public function testAddressShouldReturnMailboxAndHost(ilMailAddress $address): void { $this->assertSame(self::LOCAL_PART, $address->getMailbox()); diff --git a/components/ILIAS/Mail/tests/ilMailAddressTypesTest.php b/components/ILIAS/Mail/tests/ilMailAddressTypesTest.php index 2a2277aba74f..c6ad5410962e 100755 --- a/components/ILIAS/Mail/tests/ilMailAddressTypesTest.php +++ b/components/ILIAS/Mail/tests/ilMailAddressTypesTest.php @@ -18,12 +18,6 @@ declare(strict_types=1); -use PHPUnit\Framework\MockObject\MockObject; - -/** - * Class ilMailAddressTypesTest - * @author Michael Jansen - */ class ilMailAddressTypesTest extends ilMailBaseTestCase { protected function setUp(): void @@ -32,9 +26,6 @@ protected function setUp(): void ilMailCachedAddressType::clearCache(); } - /** - * @return ilGroupNameAsMailValidator&MockObject - */ private function createGroupNameAsValidatorMock(): ilGroupNameAsMailValidator { return $this->getMockBuilder(ilGroupNameAsMailValidator::class) diff --git a/components/ILIAS/Mail/tests/ilMailAutoresponderServiceTest.php b/components/ILIAS/Mail/tests/ilMailAutoresponderServiceTest.php index f3d718109d69..babc3258ee8d 100755 --- a/components/ILIAS/Mail/tests/ilMailAutoresponderServiceTest.php +++ b/components/ILIAS/Mail/tests/ilMailAutoresponderServiceTest.php @@ -23,15 +23,14 @@ use ILIAS\Mail\Autoresponder\AutoresponderDto; use ILIAS\Mail\Autoresponder\AutoresponderRepository; use ILIAS\Data\Clock\ClockInterface; +use PHPUnit\Framework\Attributes\DataProvider; class ilMailAutoresponderServiceTest extends ilMailBaseTestCase { private const MAIL_SENDER_USER_ID = 4711; private const MAIL_RECEIVER_USER_ID = 4712; - /** - * @dataProvider autoresponderProvider - */ + #[DataProvider('autoresponderProvider')] public function testAutoresponderDeliveryWillBeHandledCorrectlyDependingOnLastSentTime( ?DateTimeImmutable $last_auto_responder_time, DateTimeImmutable $faked_now, diff --git a/components/ILIAS/Mail/tests/ilMailBaseTestCase.php b/components/ILIAS/Mail/tests/ilMailBaseTestCase.php index 1818dd17e068..b98228d33029 100644 --- a/components/ILIAS/Mail/tests/ilMailBaseTestCase.php +++ b/components/ILIAS/Mail/tests/ilMailBaseTestCase.php @@ -22,10 +22,6 @@ use PHPUnit\Framework\TestCase; use ILIAS\LegalDocuments\Conductor; -/** - * Class ilMailBaseTest - * @author Michael Jansen - */ abstract class ilMailBaseTestCase extends TestCase { private ?Container $dic = null; diff --git a/components/ILIAS/Mail/tests/ilMailBodyPurifierTest.php b/components/ILIAS/Mail/tests/ilMailBodyPurifierTest.php index 039a4beebb34..d024e3ac40a0 100755 --- a/components/ILIAS/Mail/tests/ilMailBodyPurifierTest.php +++ b/components/ILIAS/Mail/tests/ilMailBodyPurifierTest.php @@ -18,6 +18,8 @@ declare(strict_types=1); +use PHPUnit\Framework\Attributes\DataProvider; + class ilMailBodyPurifierTest extends ilMailBaseTestCase { public static function bodyProvider(): array @@ -34,9 +36,7 @@ public static function bodyProvider(): array ]; } - /** - * @dataProvider bodyProvider - */ + #[DataProvider('bodyProvider')] public function testMailBodyPurifier(string $body, string $expectedBody): void { $purifier = new ilMailBodyPurifier(); diff --git a/components/ILIAS/Mail/tests/ilMailErrorFormatterTest.php b/components/ILIAS/Mail/tests/ilMailErrorFormatterTest.php index 9ffb3eb6f879..b72fb4c0aaca 100755 --- a/components/ILIAS/Mail/tests/ilMailErrorFormatterTest.php +++ b/components/ILIAS/Mail/tests/ilMailErrorFormatterTest.php @@ -18,6 +18,8 @@ declare(strict_types=1); +use PHPUnit\Framework\Attributes\DataProvider; + class ilMailErrorFormatterTest extends ilMailBaseTestCase { private ilMailErrorFormatter $errorFormatter; @@ -69,9 +71,9 @@ public static function errorCollectionProvider(): array } /** - * @dataProvider errorCollectionProvider * @param ilMailError[] $errors */ + #[DataProvider('errorCollectionProvider')] public function testErrorFormatter(array $errors, string $expectedHtml): void { $this->assertSame($expectedHtml, $this->brutallyTrimHTML($this->errorFormatter->format($errors))); diff --git a/components/ILIAS/Mail/tests/ilMailMimeSubjectBuilderTest.php b/components/ILIAS/Mail/tests/ilMailMimeSubjectBuilderTest.php index 97622bd26128..0aabd03e32ff 100755 --- a/components/ILIAS/Mail/tests/ilMailMimeSubjectBuilderTest.php +++ b/components/ILIAS/Mail/tests/ilMailMimeSubjectBuilderTest.php @@ -18,9 +18,8 @@ declare(strict_types=1); -/** - * @author Michael Jansen - */ +use PHPUnit\Framework\Attributes\DataProvider; + class ilMailMimeSubjectBuilderTest extends ilMailBaseTestCase { private const DEFAULT_PREFIX = 'docu default'; @@ -67,9 +66,7 @@ public function testSubjectMustNotBeChangedWhenNoPrefixShouldBeAdded(): void $this->assertSame($subject, $subjectBuilder->subject($subject, false, 'Course')); } - /** - * @dataProvider globalSubjectPrefixOnlyProvider - */ + #[DataProvider('globalSubjectPrefixOnlyProvider')] public function testGlobalPrefixMustBePrependedWhenDefinedAndPrefixShouldBeAppended( string $globalPrefix, string $expectedSubject @@ -98,9 +95,7 @@ public function testDefaultPrefixMustBePrependedWhenNoGlobalPrefixIsDefinedAndPr $this->assertSame($expectedSubject, $subjectBuilder->subject($subject, true)); } - /** - * @dataProvider subjectPrefixesProvider - */ + #[DataProvider('subjectPrefixesProvider')] public function testContextPrefixMustBePrependedWhenGivenAndPrefixShouldBeAppended( ?string $globalPrefix, string $contextPrefix, diff --git a/components/ILIAS/Mail/tests/ilMailMimeTest.php b/components/ILIAS/Mail/tests/ilMailMimeTest.php index 5ef68b48c935..9473f52fc1e0 100755 --- a/components/ILIAS/Mail/tests/ilMailMimeTest.php +++ b/components/ILIAS/Mail/tests/ilMailMimeTest.php @@ -20,10 +20,6 @@ use ILIAS\Refinery\Factory; -/** - * Class ilMailMimeTest - * @author Michael Jansen - */ class ilMailMimeTest extends ilMailBaseTestCase { private const USER_ID = 6; @@ -36,9 +32,6 @@ protected function setUp(): void parent::setUp(); } - /** - * @throws ReflectionException - */ public function testMimMailDelegatesEmailDeliveryToThePassedTransporter(): void { $defaultTransport = $this->getMockBuilder(ilMailMimeTransport::class)->disableOriginalConstructor()->getMock(); @@ -64,9 +57,6 @@ public function testMimMailDelegatesEmailDeliveryToThePassedTransporter(): void $mail->Send($transport); } - /** - * @throws ReflectionException - */ public function testMimMailDelegatesEmailDeliveryToDefaultTransport(): void { $defaultTransport = $this->getMockBuilder(ilMailMimeTransport::class)->getMock(); @@ -89,9 +79,6 @@ public function testMimMailDelegatesEmailDeliveryToDefaultTransport(): void $mail->Send(); } - /** - * @throws ReflectionException - */ public function testTransportFactoryWillReturnNullTransportIfExternalEmailDeliveryIsDisabled(): void { $settings = $this->getMockBuilder(ilSetting::class)->disableOriginalConstructor()->onlyMethods([ @@ -111,9 +98,6 @@ public function testTransportFactoryWillReturnNullTransportIfExternalEmailDelive $this->assertInstanceOf(ilMailMimeTransportNull::class, $factory->getTransport()); } - /** - * @throws ReflectionException - */ public function testTransportFactoryWillReturnSmtpTransportIfEnabled(): void { $settings = $this->getMockBuilder(ilSetting::class)->disableOriginalConstructor()->onlyMethods([ @@ -133,9 +117,6 @@ public function testTransportFactoryWillReturnSmtpTransportIfEnabled(): void $this->assertInstanceOf(ilMailMimeTransportSmtp::class, $factory->getTransport()); } - /** - * @throws ReflectionException - */ public function testTransportFactoryWillReturnSendmailTransportIfSmtpTransportIsDisabled(): void { $settings = $this->getMockBuilder(ilSetting::class)->disableOriginalConstructor()->onlyMethods([ @@ -165,9 +146,6 @@ public function testTransportFactoryWillReturnSendmailTransportIfSmtpTransportIs $this->assertInstanceOf(ilMailMimeTransportSendmail::class, $factory->getTransport()); } - /** - * @throws ReflectionException - */ public function testFactoryWillReturnSystemSenderForAnonymousUserId(): void { $settings = $this->getMockBuilder(ilSetting::class)->disableOriginalConstructor()->onlyMethods([ @@ -180,9 +158,6 @@ public function testFactoryWillReturnSystemSenderForAnonymousUserId(): void $this->assertInstanceOf(ilMailMimeSenderSystem::class, $factory->getSenderByUsrId(ANONYMOUS_USER_ID)); } - /** - * @throws ReflectionException - */ public function testFactoryWillReturnSystemSenderWhenExplicitlyRequested(): void { $settings = $this->getMockBuilder(ilSetting::class)->disableOriginalConstructor()->onlyMethods([ @@ -195,9 +170,6 @@ public function testFactoryWillReturnSystemSenderWhenExplicitlyRequested(): void $this->assertInstanceOf(ilMailMimeSenderSystem::class, $factory->system()); } - /** - * @throws ReflectionException - */ protected function getUserById(int $usrId): ilObjUser { $user = $this->getMockBuilder(ilObjUser::class) @@ -209,9 +181,6 @@ protected function getUserById(int $usrId): ilObjUser return $user; } - /** - * @throws ReflectionException - */ public function testFactoryWillReturnUserSenderForExistingUserId(): void { $settings = $this->getMockBuilder(ilSetting::class)->disableOriginalConstructor()->onlyMethods([ @@ -224,9 +193,6 @@ public function testFactoryWillReturnUserSenderForExistingUserId(): void $this->assertInstanceOf(ilMailMimeSenderUser::class, $factory->getSenderByUsrId(self::USER_ID)); } - /** - * @throws ReflectionException - */ public function testFactoryWillReturnUserSenderWhenExplicitlyRequested(): void { $settings = $this->getMockBuilder(ilSetting::class)->disableOriginalConstructor()->onlyMethods([ diff --git a/components/ILIAS/Mail/tests/ilMailOptionsTest.php b/components/ILIAS/Mail/tests/ilMailOptionsTest.php index c4b5d59bc313..657cfd301c2e 100755 --- a/components/ILIAS/Mail/tests/ilMailOptionsTest.php +++ b/components/ILIAS/Mail/tests/ilMailOptionsTest.php @@ -20,10 +20,8 @@ use ILIAS\Data\Clock\ClockInterface; use PHPUnit\Framework\MockObject\MockObject; +use PHPUnit\Framework\Attributes\DataProvider; -/** - * @author Ingmar Szmais - */ class ilMailOptionsTest extends ilMailBaseTestCase { protected stdClass $object; @@ -122,9 +120,7 @@ public function testConstructorWithUserSettings(): void $this->assertSame($this->object->absence_ar_body, $mailOptions->getAbsenceAutoresponderBody()); } - /** - * @dataProvider provideMailOptionsData - */ + #[DataProvider('provideMailOptionsData')] public function testIsAbsent(bool $absence_status, int $absent_from, int $absent_until, bool $result): void { $userId = 1; diff --git a/components/ILIAS/Mail/tests/ilMailTaskProcessorTest.php b/components/ILIAS/Mail/tests/ilMailTaskProcessorTest.php index 6679315be5db..a734d1a6f5eb 100755 --- a/components/ILIAS/Mail/tests/ilMailTaskProcessorTest.php +++ b/components/ILIAS/Mail/tests/ilMailTaskProcessorTest.php @@ -22,10 +22,6 @@ use ILIAS\BackgroundTasks\Task\TaskFactory; use ILIAS\DI\Container; -/** - * Class ilMailTaskProcessorTest - * @author Niels Theen - */ class ilMailTaskProcessorTest extends ilMailBaseTestCase { private ilLanguage $languageMock; @@ -33,9 +29,6 @@ class ilMailTaskProcessorTest extends ilMailBaseTestCase private ilLogger $loggerMock; protected const SOME_USER_ID = 113; - /** - * @throws ReflectionException - */ protected function setUp(): void { parent::setUp(); @@ -68,10 +61,6 @@ public function testMailValueObjectCannotBeCreatedWithUnsupportedSubjectLength() ); } - /** - * @throws ilMailException - * @throws ReflectionException - */ public function testOneTask(): void { $taskManager = $this->getMockBuilder(BasicTaskManager::class) @@ -137,10 +126,6 @@ public function testOneTask(): void ); } - /** - * @throws ilMailException - * @throws ReflectionException - */ public function testRunTwoTasks(): void { $taskManager = $this->getMockBuilder(BasicTaskManager::class) @@ -214,10 +199,6 @@ public function testRunTwoTasks(): void ); } - /** - * @throws ilMailException - * @throws ReflectionException - */ public function testRunThreeTasksInDifferentBuckets(): void { $taskManager = $this->getMockBuilder(BasicTaskManager::class) @@ -302,10 +283,6 @@ public function testRunThreeTasksInDifferentBuckets(): void ); } - /** - * @throws ReflectionException - * @throws ilMailException - */ public function testRunHasWrongTypeAndWillResultInException(): void { $this->expectException(ilMailException::class); diff --git a/components/ILIAS/Mail/tests/ilMailTemplateContextTest.php b/components/ILIAS/Mail/tests/ilMailTemplateContextTest.php index 262433bbf11e..c94cc2293c30 100755 --- a/components/ILIAS/Mail/tests/ilMailTemplateContextTest.php +++ b/components/ILIAS/Mail/tests/ilMailTemplateContextTest.php @@ -22,6 +22,7 @@ use PHPUnit\Framework\MockObject\MockObject; use OrgUnit\PublicApi\OrgUnitUserService; use OrgUnit\User\ilOrgUnitUser; +use PHPUnit\Framework\Attributes\DataProvider; class ilMailTemplateContextTest extends ilMailBaseTestCase { @@ -66,7 +67,6 @@ public function resolveSpecificPlaceholder( /** * @param Closure(): MockBuilder $mock_builder * @return array - * @throws ReflectionException */ private function generateOrgUnitUsers(Closure $mock_builder, int $amount): array { @@ -87,7 +87,6 @@ private function generateOrgUnitUsers(Closure $mock_builder, int $amount): array /** * @return array - * @throws ReflectionException */ public static function userProvider(): array { @@ -132,7 +131,6 @@ public static function userProvider(): array /** * @param Closure(): MockBuilder $mock_builder * @return array{0: ilOrgUnitUser&MockObject, 1: list} - * @throws ReflectionException */ $ou_user_callable = function (Closure $mock_builder) use ($definition): array { $ou_user = $mock_builder() @@ -157,11 +155,10 @@ public static function userProvider(): array } /** - * @dataProvider userProvider * @param callable(Closure(): MockBuilder): ilObjUser $user_callable * @param callable(Closure(): MockBuilder): array{0: ilOrgUnitUser, 1: list} $ou_user_callable - * @throws ReflectionException */ + #[DataProvider('userProvider')] public function testGlobalPlaceholdersCanBeResolvedWithCorrespondingValues( callable $user_callable, callable $ou_user_callable @@ -202,7 +199,7 @@ public function testGlobalPlaceholdersCanBeResolvedWithCorrespondingValues( ->getMock(); $ou_service->expects($this->atLeastOnce())->method('getUsers')->willReturn([$ou_user,]); - $lng->expects($this->atLeastOnce())->method('txt')->will($this->returnArgument(0)); + $lng->expects($this->atLeastOnce())->method('txt')->willReturnArgument(0); $env_helper->expects($this->atLeastOnce())->method('getClientId')->willReturn('###phpunit_client###'); $env_helper->expects($this->atLeastOnce())->method('getHttpPath')->willReturn('###http_ilias###'); $lng_helper->expects($this->atLeastOnce())->method('getLanguageByIsoCode')->willReturn($lng); diff --git a/components/ILIAS/Mail/tests/ilMailTemplateRepositoryTest.php b/components/ILIAS/Mail/tests/ilMailTemplateRepositoryTest.php index 713c869c36b1..638f776c9972 100755 --- a/components/ILIAS/Mail/tests/ilMailTemplateRepositoryTest.php +++ b/components/ILIAS/Mail/tests/ilMailTemplateRepositoryTest.php @@ -18,15 +18,10 @@ declare(strict_types=1); -/** - * Class ilMailTemplateRepository - * @author Michael Jansen - */ +use PHPUnit\Framework\Attributes\Depends; + class ilMailTemplateRepositoryTest extends ilMailBaseTestCase { - /** - * @throws ReflectionException - */ public function testEntityCanBeSaved(): ilMailTemplate { $db = $this->getMockBuilder(ilDBInterface::class)->getMock(); @@ -53,10 +48,7 @@ public function testEntityCanBeSaved(): ilMailTemplate return $template; } - /** - * @depends testEntityCanBeSaved - * @throws ReflectionException - */ + #[Depends('testEntityCanBeSaved')] public function testEntityCanBeModified(ilMailTemplate $template): ilMailTemplate { $db = $this->getMockBuilder(ilDBInterface::class)->getMock(); @@ -70,10 +62,7 @@ public function testEntityCanBeModified(ilMailTemplate $template): ilMailTemplat return $template; } - /** - * @depends testEntityCanBeModified - * @throws ReflectionException - */ + #[Depends('testEntityCanBeModified')] public function testEntityCanBeDeleted(ilMailTemplate $template): void { $db = $this->getMockBuilder(ilDBInterface::class)->getMock(); @@ -85,9 +74,6 @@ public function testEntityCanBeDeleted(ilMailTemplate $template): void $repository->deleteByIds([$template->getTplId()]); } - /** - * @throws ReflectionException - */ public function testTemplateCanBeFoundById(): void { $db = $this->getMockBuilder(ilDBInterface::class)->getMock(); @@ -108,9 +94,6 @@ public function testTemplateCanBeFoundById(): void $this->assertSame($templateId, $template->getTplId()); } - /** - * @throws ReflectionException - */ public function testExceptionIsRaisedIfNoTemplateCanBeFoundById(): void { $this->expectException(OutOfBoundsException::class); diff --git a/components/ILIAS/Mail/tests/ilMailTemplateServiceTest.php b/components/ILIAS/Mail/tests/ilMailTemplateServiceTest.php index d0654f4fc865..0415be294d18 100755 --- a/components/ILIAS/Mail/tests/ilMailTemplateServiceTest.php +++ b/components/ILIAS/Mail/tests/ilMailTemplateServiceTest.php @@ -18,15 +18,8 @@ declare(strict_types=1); -/** - * Class ilMailTemplateServiceTest - * @author Michael Jansen - */ class ilMailTemplateServiceTest extends ilMailBaseTestCase { - /** - * @throws ReflectionException - */ public function testDefaultTemplateCanBeSetByContext(): void { $repo = $this->getMockBuilder(ilMailTemplateRepository::class)->disableOriginalConstructor()->getMock(); @@ -62,9 +55,6 @@ public function testDefaultTemplateCanBeSetByContext(): void $this->assertFalse($yetAnotherTemplate->isDefault()); } - /** - * @throws ReflectionException - */ public function testDefaultTemplateForContextCanBeUnset(): void { $repo = $this->getMockBuilder(ilMailTemplateRepository::class)->disableOriginalConstructor()->getMock(); diff --git a/components/ILIAS/Mail/tests/ilMailTest.php b/components/ILIAS/Mail/tests/ilMailTest.php index c96096262c83..37349fe058d3 100755 --- a/components/ILIAS/Mail/tests/ilMailTest.php +++ b/components/ILIAS/Mail/tests/ilMailTest.php @@ -25,11 +25,8 @@ use ILIAS\Refinery\Transformation; use ILIAS\Data\Result\Ok; use ILIAS\Mail\Service\MailSignatureService; +use PHPUnit\Framework\Attributes\DataProvider; -/** - * Class ilMailMimeTest - * @author Michael Jansen - */ class ilMailTest extends ilMailBaseTestCase { private MockObject&ilDBInterface $mock_database; @@ -38,9 +35,6 @@ class ilMailTest extends ilMailBaseTestCase private MockObject&ilMailRfc822AddressParserFactory $mock_parser_factory; private MockObject&ilLanguage $mock_language; - /** - * @throws ReflectionException - */ public function testExternalMailDeliveryToLocalRecipientsWorksAsExpected(): void { $refineryMock = $this->getMockBuilder(Factory::class)->disableOriginalConstructor()->getMock(); @@ -236,9 +230,7 @@ public function testFormatNamesForOutput(): void $this->assertSame('', $instance->formatNamesForOutput(',')); } - /** - * @dataProvider provideGetPreviousMail - */ + #[DataProvider('provideGetPreviousMail')] public function testGetPreviousMail(array $rowData): void { $mailId = 3454; diff --git a/components/ILIAS/Mail/tests/ilMailTransportSettingsTest.php b/components/ILIAS/Mail/tests/ilMailTransportSettingsTest.php index 7e03ade11dcc..bc24465cdb7a 100755 --- a/components/ILIAS/Mail/tests/ilMailTransportSettingsTest.php +++ b/components/ILIAS/Mail/tests/ilMailTransportSettingsTest.php @@ -18,15 +18,8 @@ declare(strict_types=1); -/** - * Class ilMailTransportSettingsTest - * @author Michael Jansen - */ class ilMailTransportSettingsTest extends ilMailBaseTestCase { - /** - * @throws ReflectionException - */ public function testSystemAsIncomingTypeWontUpdate(): void { $mailOptions = $this->getMockBuilder(ilMailOptions::class) @@ -44,9 +37,6 @@ public function testSystemAsIncomingTypeWontUpdate(): void $this->assertSame(3, $mailOptions->getEmailAddressMode()); } - /** - * @throws ReflectionException - */ public function testOnlyFirstMailWillResultInUpdateProcess(): void { $mailOptions = $this->getMockBuilder(ilMailOptions::class) @@ -64,9 +54,6 @@ public function testOnlyFirstMailWillResultInUpdateProcess(): void $this->assertSame(3, $mailOptions->getEmailAddressMode()); } - /** - * @throws ReflectionException - */ public function testOnlySecondMailWillResultInUpdateProcess(): void { $mailOptions = $this->getMockBuilder(ilMailOptions::class) @@ -84,9 +71,6 @@ public function testOnlySecondMailWillResultInUpdateProcess(): void $this->assertSame(4, $mailOptions->getEmailAddressMode()); } - /** - * @throws ReflectionException - */ public function testNoMailWillResultInUpdateProcess(): void { $mailOptions = $this->getMockBuilder(ilMailOptions::class) @@ -104,9 +88,6 @@ public function testNoMailWillResultInUpdateProcess(): void $this->assertSame(0, $mailOptions->getIncomingType()); } - /** - * @throws ReflectionException - */ public function testNothingWillBeAdjusted(): void { $mailOptions = $this->getMockBuilder(ilMailOptions::class) From f284fc0724a17d9accd797c07fab0ba788f3fc85 Mon Sep 17 00:00:00 2001 From: Thibeau Fuhrer Date: Tue, 8 Apr 2025 14:51:59 +0200 Subject: [PATCH 064/125] [FIX] UI: remove `bootstrap-datetimepicker.min.js` includes. --- .../ILIAS/UI/src/Implementation/Component/Button/Renderer.php | 1 - 1 file changed, 1 deletion(-) diff --git a/components/ILIAS/UI/src/Implementation/Component/Button/Renderer.php b/components/ILIAS/UI/src/Implementation/Component/Button/Renderer.php index b1f51d7d8bfb..13388a37a685 100755 --- a/components/ILIAS/UI/src/Implementation/Component/Button/Renderer.php +++ b/components/ILIAS/UI/src/Implementation/Component/Button/Renderer.php @@ -170,7 +170,6 @@ public function registerResources(ResourceRegistry $registry): void parent::registerResources($registry); $registry->register('assets/js/button.js'); $registry->register("./assets/js/moment-with-locales.min.js"); - $registry->register("./assets/js/bootstrap-datetimepicker.min.js"); } protected function renderClose(Component\Button\Close $component): string From 2254e93f0c78fcc9250f9f0fcf8b21e4cce843ef Mon Sep 17 00:00:00 2001 From: Thibeau Fuhrer Date: Tue, 8 Apr 2025 11:48:08 +0200 Subject: [PATCH 065/125] [FIX] UI: `MainControls\Metabar` call to `il.UI.page.isSmallScreen()` may be undefined. --- .../resources/js/MainControls/dist/maincontrols.min.js | 2 +- .../UI/resources/js/MainControls/rollup.config.js | 4 ++-- .../UI/resources/js/MainControls/src/maincontrols.js | 10 +++++----- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/components/ILIAS/UI/resources/js/MainControls/dist/maincontrols.min.js b/components/ILIAS/UI/resources/js/MainControls/dist/maincontrols.min.js index f6e57b2f525d..2bf4eabf131b 100644 --- a/components/ILIAS/UI/resources/js/MainControls/dist/maincontrols.min.js +++ b/components/ILIAS/UI/resources/js/MainControls/dist/maincontrols.min.js @@ -12,4 +12,4 @@ * https://www.ilias.de * https://github.com/ILIAS-eLearning */ -!function(t,e){"use strict";const n="engaged",s="il-maincontrols-metabar",a="il-metabar-slates",i="il-metabar-more-button",o="il-metabar-more-slate",r="il-maincontrols-slate",l="engaged";function c(t){t.removeClass(n),t.attr("aria-expanded",!1)}class u{#t;#e;#n;#s;#a;#i;#o;constructor(t,e,n,s,a,i){this.#t=t,this.#e=e,this.#s=n,this.#a=s,this.#i=a,this.#o=i}registerSignals(t,e){this.#t(document).on(t,((t,e)=>(this.#r(t,e),this.#s()&&this.#i(),!1))),this.#t(document).on(e,(()=>(this.onClickDisengageAll(),!1))),this.#t(`.${s}`).on("click",(()=>{this.#n=!0})),this.#t("body").on("click",(()=>{this.#n?this.#n=!1:this.onClickDisengageAll()})),this.#t(`.${a} > .${r}`).on("focusout",(t=>{if(!this.#s()){const e=t.relatedTarget,n=t.currentTarget;null==e||this.#t.contains(n,e)||this.onClickDisengageAll()}}))}#r(t,e){const s=e.triggerer;!function(t){return t.hasClass(n)}(s)?(this.disengageAll(),function(t){t.addClass(n),t.attr("aria-expanded",!0)}(s),setTimeout((()=>{const t=s[0];this.focusInEngagedSlate(t)}),10)):c(s)}onClickDisengageAll(){this.disengageAllButtons(),this.disengageAllSlates()}disengageAllButtons(){document.querySelectorAll(`#${this.#e}.${s} > li > .btn.${n}`).forEach((t=>{c($(t))}));document.querySelectorAll(`#${this.#e}.${s} > li > .${a} > .${o} > .il-maincontrols-slate-content > .btn.${n}`).forEach((t=>{c($(t))}))}disengageAllSlates(){this.getEngagedSlates().each(((t,e)=>{this.#o(this.#t(e))}))}disengageAll(){this.disengageAllSlates(),this.disengageAllButtons()}getEngagedSlates(){const t=`#${this.#e} .${r}.${l}`;return this.#t(t)}focusInEngagedSlate(t){const e=function(t,e){let n=t.parentElement;for(;n&&!n.classList.contains(e);)n=n.parentElement;return n||console.warn(`No parent element with class "${e}" found.`),n}(t,s);if(e){const t=e.querySelector(`.${r}.${l}`);if(t){const e=t.querySelector("input, button");e&&e.focus()}}}init(){this.#l(),this.#c(),this.#s()?this.#u():this.#h(),this.#t(`.${s}`).css("visibility","visible"),this.#t(`#${this.#e} .${a}`).children(`.${r}`).attr("aria-hidden",!0)}#u(){this.#g(),this.#d().hide(),this.getMoreButton().show(),this.#y()}#h(){this.getMoreButton().hide(),this.#d().show()}#l(){if(0===this.getMoreButton().length){const t=this.#t(`#${this.#e}.${s}`).find(".btn, .il-link").last();this.#t(t).addClass(i)}}#c(){if(0===this.#S().length){const t=this.#t(`#${this.#e} .${a}`).children(`.${r}`).last();this.#t(t).addClass(o)}}getMoreButton(){return this.#t(`.${i}`)}#S(){return this.#t(`.${o}`)}#d(){return this.#t(`#${this.#e}.${s}`).children("li").children(".btn, .il-link").not(`.${i}`)}#g(){const t=this.#S().children(".il-maincontrols-slate-content");0===t.children().length&&this.#d().clone(!0,!0).appendTo(t)}#y(){const t=this.#a.getCounterObjectOrNull(this.#S());t&&this.#a.getCounterObject(this.getMoreButton()).setNoveltyTo(t.getNoveltyCount()).setStatusTo(t.getStatusCount())}}const h="engaged",g="disengaged";function d(t){return t.hasClass(h)}function y(t){t.removeClass(g),t.addClass(h),t.attr("aria-expanded","true"),t.attr("aria-hidden","false")}function S(t){t.removeClass(h),t.addClass(g),t.attr("aria-expanded","false"),t.attr("aria-hidden","true")}function m(t){d(t)?S(t):y(t)}var f=function(t){var e="il-counter",n={getCounterObject:function(t){let e;return e=s(t),console.assert(e.length>0,"Passed jQuery Object does not contain a counter"),a(e)},getCounterObjectOrNull:function(t){let e;return e=s(t),0===e.length?null:a(e)}},s=function(n){console.assert(n instanceof t,"$object_containing_counter is not a jQuery Object, param: "+n);var s=n;return n.hasClass(e)||(s=n.find("."+e)),s},a=function(e){return b.bind({})(e,t)};return n},b=function(t,e){const n=" Counter does not exist in the DOM. Make sure the respective Counter type has been rendered before applying this operations.",s=" is not a number";this.getStatusCount=function(){return r(o(t))},this.getNoveltyCount=function(){return r(i(t))},this.hasNoveltyObject=function(){return i(t).length>0},this.hasStatusObject=function(){return o(t).length>0},this.setNoveltyTo=function(e){console.assert(this.hasNoveltyObject(),"Novelty "+n),console.assert("number"==typeof e,e+s);var a=i(t);return a.html(e),0===e?a.hide():a.show(),this},this.setStatusTo=function(e){console.assert(this.hasStatusObject(),"Status "+n),console.assert("number"==typeof e,e+s);var a=o(t);return a.html(e),0===e?a.hide():a.show(),this},this.incrementNoveltyCount=function(e){return console.assert(this.hasNoveltyObject(),"Novelty "+n),console.assert("number"==typeof e,e+s),l((function(t){t.hasNoveltyObject()&&t.setNoveltyTo(t.getNoveltyCount()+e)}),t),this},this.decrementNoveltyCount=function(e){return console.assert(this.hasNoveltyObject(),"Novelty "+n),console.assert("number"==typeof e,e+s),l((function(t){t.hasNoveltyObject()&&t.setNoveltyTo(t.getNoveltyCount()-e)}),t),this},this.incrementStatusCount=function(e){return console.assert(this.hasStatusObject(),"Status "+n),console.assert("number"==typeof e,e+s),l((function(t){t.hasStatusObject()&&t.setStatusTo(t.getStatusCount()+e)}),t),this},this.decrementStatusCount=function(e){return console.assert(this.hasStatusObject(),"Status "+n),console.assert("number"==typeof e,e+s),l((function(t){t.hasStatusObject()&&t.setStatusTo(t.getStatusCount()-e)}),t),this},this.setTotalNoveltyToStatusCount=function(){return console.assert(this.hasStatusObject(),"Status "+n),console.assert(this.hasNoveltyObject(),"Novelty "+n),this.incrementStatusCount(this.getNoveltyCount()).setNoveltyTo(0)};var a={getNoveltyCount:this.getNoveltyCount,getStatusCount:this.getStatusCount,hasNoveltyObject:this.hasNoveltyObject,hasStatusObject:this.hasStatusObject,setNoveltyTo:this.setNoveltyTo,setStatusTo:this.setStatusTo,incrementNoveltyCount:this.incrementNoveltyCount,decrementNoveltyCount:this.decrementNoveltyCount,incrementStatusCount:this.incrementStatusCount,decrementStatusCount:this.decrementStatusCount,setTotalNoveltyToStatusCount:this.setTotalNoveltyToStatusCount},i=function(t){return t.find(".il-counter-novelty")},o=function(t){return t.find(".il-counter-status")},r=function(t){var n=0;return t.each((function(){var t=e(this).text();n+=parseInt(t)})),n},l=function(t,n){n.each((function(){var n=f(e).getCounterObject(e(this));t(n,e(this))}))};return a};t.UI=t.UI||{},t.UI.maincontrols=t.UI.maincontrols||{},t.UI.maincontrols.metabar=new class{#t;#m=[];#s;#a;#i;#o;constructor(t,e,n,s,a){this.#t=t,this.#s=e,this.#a=n,this.#i=s,this.#o=a}init(t){if(void 0!==this.#m[t])throw new Error(`Metabar with id '${t}' has already been initialized.`);this.#m[t]=new u(this.#t,t,this.#s,this.#a,this.#i,this.#o)}get(t){return this.#m[t]??null}disengageAll(){Object.values(this.#m).forEach((t=>t.disengageAll()))}}(e,t.UI.page.isSmallScreen,f(e),(()=>t.UI.maincontrols.mainbar.disengageAll()),(e=>t.UI.maincontrols.slate.disengage(e))),t.UI.maincontrols.slate=new class{#t;#f;#b;constructor(t,e,n){this.#t=t,this.#f=e,this.#b=n}onSignal(t,e,n,s){const a=this.#t(`#${s}`),{triggerer:i}=n,o=i.parents(".il-metabar-more-slate").length>0;if("toggle"===t)this.#p(a,i,o);else if("engage"===t)y(a);else{if("replace"!==t)throw new Error(`No such SignalType: ${t}`);this.#C(s,n)}}#p(t,e,n){const s=t.closest(".il-maincontrols-metabar").attr("id"),a=this.#b.get(s);e.attr("id")!==a.getMoreButton().attr("id")?(m(t),n||(d(t)?(e.addClass(h),e.removeClass(g),t.trigger("in_view")):(e.removeClass(h),e.addClass(g)))):a.getEngagedSlates().length>0?a.disengageAllSlates():m(t)}disengage=S;#C(t,e){const{url:n}=e.options;this.#f(t,n,"content")}}(e,function(t){return function(e,n,s){t.ajax({url:n,dataType:"html"}).done((function(n){var a=t("
"+n+"
"),i=a.find("[data-replace-marker='"+s+"']").first();0==i.length?t("#"+e+" [data-replace-marker='"+s+"']").html(n):(t("#"+e+" [data-replace-marker='"+s+"']").first().replaceWith(i),t("#"+e+" [data-replace-marker='"+s+"']").first().after(a.find("[data-replace-marker='script']")))}))}}(e),t.UI.maincontrols.metabar)}(il,$); +!function(t,e){"use strict";const n="engaged",s="il-maincontrols-metabar",a="il-metabar-slates",i="il-metabar-more-button",o="il-metabar-more-slate",r="il-maincontrols-slate",l="engaged";function c(t){t.removeClass(n),t.attr("aria-expanded",!1)}class u{#t;#e;#n;#s;#a;#i;#o;constructor(t,e,n,s,a,i){this.#t=t,this.#e=e,this.#s=n,this.#a=s,this.#i=a,this.#o=i}registerSignals(t,e){this.#t(document).on(t,((t,e)=>(this.#r(t,e),this.#s()&&this.#i(),!1))),this.#t(document).on(e,(()=>(this.onClickDisengageAll(),!1))),this.#t(`.${s}`).on("click",(()=>{this.#n=!0})),this.#t("body").on("click",(()=>{this.#n?this.#n=!1:this.onClickDisengageAll()})),this.#t(`.${a} > .${r}`).on("focusout",(t=>{if(!this.#s()){const e=t.relatedTarget,n=t.currentTarget;null==e||this.#t.contains(n,e)||this.onClickDisengageAll()}}))}#r(t,e){const s=e.triggerer;!function(t){return t.hasClass(n)}(s)?(this.disengageAll(),function(t){t.addClass(n),t.attr("aria-expanded",!0)}(s),setTimeout((()=>{const t=s[0];this.focusInEngagedSlate(t)}),10)):c(s)}onClickDisengageAll(){this.disengageAllButtons(),this.disengageAllSlates()}disengageAllButtons(){document.querySelectorAll(`#${this.#e}.${s} > li > .btn.${n}`).forEach((t=>{c($(t))}));document.querySelectorAll(`#${this.#e}.${s} > li > .${a} > .${o} > .il-maincontrols-slate-content > .btn.${n}`).forEach((t=>{c($(t))}))}disengageAllSlates(){this.getEngagedSlates().each(((t,e)=>{this.#o(this.#t(e))}))}disengageAll(){this.disengageAllSlates(),this.disengageAllButtons()}getEngagedSlates(){const t=`#${this.#e} .${r}.${l}`;return this.#t(t)}focusInEngagedSlate(t){const e=function(t,e){let n=t.parentElement;for(;n&&!n.classList.contains(e);)n=n.parentElement;return n||console.warn(`No parent element with class "${e}" found.`),n}(t,s);if(e){const t=e.querySelector(`.${r}.${l}`);if(t){const e=t.querySelector("input, button");e&&e.focus()}}}init(){this.#l(),this.#c(),this.#s()?this.#u():this.#h(),this.#t(`.${s}`).css("visibility","visible"),this.#t(`#${this.#e} .${a}`).children(`.${r}`).attr("aria-hidden",!0)}#u(){this.#g(),this.#d().hide(),this.getMoreButton().show(),this.#y()}#h(){this.getMoreButton().hide(),this.#d().show()}#l(){if(0===this.getMoreButton().length){const t=this.#t(`#${this.#e}.${s}`).find(".btn, .il-link").last();this.#t(t).addClass(i)}}#c(){if(0===this.#S().length){const t=this.#t(`#${this.#e} .${a}`).children(`.${r}`).last();this.#t(t).addClass(o)}}getMoreButton(){return this.#t(`.${i}`)}#S(){return this.#t(`.${o}`)}#d(){return this.#t(`#${this.#e}.${s}`).children("li").children(".btn, .il-link").not(`.${i}`)}#g(){const t=this.#S().children(".il-maincontrols-slate-content");0===t.children().length&&this.#d().clone(!0,!0).appendTo(t)}#y(){const t=this.#a.getCounterObjectOrNull(this.#S());t&&this.#a.getCounterObject(this.getMoreButton()).setNoveltyTo(t.getNoveltyCount()).setStatusTo(t.getStatusCount())}}const h="engaged",g="disengaged";function d(t){return t.hasClass(h)}function y(t){t.removeClass(g),t.addClass(h),t.attr("aria-expanded","true"),t.attr("aria-hidden","false")}function S(t){t.removeClass(h),t.addClass(g),t.attr("aria-expanded","false"),t.attr("aria-hidden","true")}function m(t){d(t)?S(t):y(t)}var f=function(t){var e="il-counter",n={getCounterObject:function(t){let e;return e=s(t),console.assert(e.length>0,"Passed jQuery Object does not contain a counter"),a(e)},getCounterObjectOrNull:function(t){let e;return e=s(t),0===e.length?null:a(e)}},s=function(n){console.assert(n instanceof t,"$object_containing_counter is not a jQuery Object, param: "+n);var s=n;return n.hasClass(e)||(s=n.find("."+e)),s},a=function(e){return b.bind({})(e,t)};return n},b=function(t,e){const n=" Counter does not exist in the DOM. Make sure the respective Counter type has been rendered before applying this operations.",s=" is not a number";this.getStatusCount=function(){return r(o(t))},this.getNoveltyCount=function(){return r(i(t))},this.hasNoveltyObject=function(){return i(t).length>0},this.hasStatusObject=function(){return o(t).length>0},this.setNoveltyTo=function(e){console.assert(this.hasNoveltyObject(),"Novelty "+n),console.assert("number"==typeof e,e+s);var a=i(t);return a.html(e),0===e?a.hide():a.show(),this},this.setStatusTo=function(e){console.assert(this.hasStatusObject(),"Status "+n),console.assert("number"==typeof e,e+s);var a=o(t);return a.html(e),0===e?a.hide():a.show(),this},this.incrementNoveltyCount=function(e){return console.assert(this.hasNoveltyObject(),"Novelty "+n),console.assert("number"==typeof e,e+s),l((function(t){t.hasNoveltyObject()&&t.setNoveltyTo(t.getNoveltyCount()+e)}),t),this},this.decrementNoveltyCount=function(e){return console.assert(this.hasNoveltyObject(),"Novelty "+n),console.assert("number"==typeof e,e+s),l((function(t){t.hasNoveltyObject()&&t.setNoveltyTo(t.getNoveltyCount()-e)}),t),this},this.incrementStatusCount=function(e){return console.assert(this.hasStatusObject(),"Status "+n),console.assert("number"==typeof e,e+s),l((function(t){t.hasStatusObject()&&t.setStatusTo(t.getStatusCount()+e)}),t),this},this.decrementStatusCount=function(e){return console.assert(this.hasStatusObject(),"Status "+n),console.assert("number"==typeof e,e+s),l((function(t){t.hasStatusObject()&&t.setStatusTo(t.getStatusCount()-e)}),t),this},this.setTotalNoveltyToStatusCount=function(){return console.assert(this.hasStatusObject(),"Status "+n),console.assert(this.hasNoveltyObject(),"Novelty "+n),this.incrementStatusCount(this.getNoveltyCount()).setNoveltyTo(0)};var a={getNoveltyCount:this.getNoveltyCount,getStatusCount:this.getStatusCount,hasNoveltyObject:this.hasNoveltyObject,hasStatusObject:this.hasStatusObject,setNoveltyTo:this.setNoveltyTo,setStatusTo:this.setStatusTo,incrementNoveltyCount:this.incrementNoveltyCount,decrementNoveltyCount:this.decrementNoveltyCount,incrementStatusCount:this.incrementStatusCount,decrementStatusCount:this.decrementStatusCount,setTotalNoveltyToStatusCount:this.setTotalNoveltyToStatusCount},i=function(t){return t.find(".il-counter-novelty")},o=function(t){return t.find(".il-counter-status")},r=function(t){var n=0;return t.each((function(){var t=e(this).text();n+=parseInt(t)})),n},l=function(t,n){n.each((function(){var n=f(e).getCounterObject(e(this));t(n,e(this))}))};return a};t.UI=t.UI||{},t.UI.maincontrols=t.UI.maincontrols||{},t.UI.maincontrols.metabar=new class{#t;#m=[];#s;#a;#i;#o;constructor(t,e,n,s,a){this.#t=t,this.#s=e,this.#a=n,this.#i=s,this.#o=a}init(t){if(void 0!==this.#m[t])throw new Error(`Metabar with id '${t}' has already been initialized.`);this.#m[t]=new u(this.#t,t,this.#s,this.#a,this.#i,this.#o)}get(t){return this.#m[t]??null}disengageAll(){Object.values(this.#m).forEach((t=>t.disengageAll()))}}(e,(()=>t.UI.page.isSmallScreen()),f(e),(()=>t.UI.maincontrols.mainbar.disengageAll()),(e=>t.UI.maincontrols.slate.disengage(e))),t.UI.maincontrols.slate=new class{#t;#f;#b;constructor(t,e,n){this.#t=t,this.#f=e,this.#b=n}onSignal(t,e,n,s){const a=this.#t(`#${s}`),{triggerer:i}=n,o=i.parents(".il-metabar-more-slate").length>0;if("toggle"===t)this.#p(a,i,o);else if("engage"===t)y(a);else{if("replace"!==t)throw new Error(`No such SignalType: ${t}`);this.#C(s,n)}}#p(t,e,n){const s=t.closest(".il-maincontrols-metabar").attr("id"),a=this.#b.get(s);e.attr("id")!==a.getMoreButton().attr("id")?(m(t),n||(d(t)?(e.addClass(h),e.removeClass(g),t.trigger("in_view")):(e.removeClass(h),e.addClass(g)))):a.getEngagedSlates().length>0?a.disengageAllSlates():m(t)}disengage=S;#C(t,e){const{url:n}=e.options;this.#f(t,n,"content")}}(e,function(t){return function(e,n,s){t.ajax({url:n,dataType:"html"}).done((function(n){var a=t("
"+n+"
"),i=a.find("[data-replace-marker='"+s+"']").first();0==i.length?t("#"+e+" [data-replace-marker='"+s+"']").html(n):(t("#"+e+" [data-replace-marker='"+s+"']").first().replaceWith(i),t("#"+e+" [data-replace-marker='"+s+"']").first().after(a.find("[data-replace-marker='script']")))}))}}(e),t.UI.maincontrols.metabar)}(il,$); diff --git a/components/ILIAS/UI/resources/js/MainControls/rollup.config.js b/components/ILIAS/UI/resources/js/MainControls/rollup.config.js index 7f10728e5991..e00b3ba52758 100755 --- a/components/ILIAS/UI/resources/js/MainControls/rollup.config.js +++ b/components/ILIAS/UI/resources/js/MainControls/rollup.config.js @@ -15,8 +15,8 @@ ******************************************************************** */ import terser from '@rollup/plugin-terser'; -import copyright from '../../../../../../scripts/Copyright-Checker/copyright'; -import preserveCopyright from '../../../../../../scripts/Copyright-Checker/preserveCopyright'; +import copyright from '../../../../../../scripts/Copyright-Checker/copyright.js'; +import preserveCopyright from '../../../../../../scripts/Copyright-Checker/preserveCopyright.js'; export default [ { diff --git a/components/ILIAS/UI/resources/js/MainControls/src/maincontrols.js b/components/ILIAS/UI/resources/js/MainControls/src/maincontrols.js index bc22aac0ff43..62fe95c398ea 100755 --- a/components/ILIAS/UI/resources/js/MainControls/src/maincontrols.js +++ b/components/ILIAS/UI/resources/js/MainControls/src/maincontrols.js @@ -15,17 +15,17 @@ import il from 'il'; import $ from 'jquery'; -import MetabarFactory from './metabar.factory'; -import Slate from './slate.class'; -import replaceContent from '../../Core/src/core.replaceContent'; -import { counterFactory } from '../../Counter/src/counter.main'; +import MetabarFactory from './metabar.factory.js'; +import Slate from './slate.class.js'; +import replaceContent from '../../Core/src/core.replaceContent.js'; +import { counterFactory } from '../../Counter/src/counter.main.js'; il.UI = il.UI || {}; il.UI.maincontrols = il.UI.maincontrols || {}; il.UI.maincontrols.metabar = new MetabarFactory( $, - il.UI.page.isSmallScreen, + () => il.UI.page.isSmallScreen(), counterFactory($), () => il.UI.maincontrols.mainbar.disengageAll(), (slate) => il.UI.maincontrols.slate.disengage(slate), From f25a2edf11dd7b9615fbb8103d88186389596c7b Mon Sep 17 00:00:00 2001 From: Nils Haagen Date: Mon, 14 Apr 2025 12:20:46 +0200 Subject: [PATCH 066/125] PRG: 44845, acknowledge courses from sub-programmes --- .../classes/class.ilObjStudyProgrammeMembersGUI.php | 5 ----- .../classes/class.ilStudyProgrammeMembersTableGUI.php | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/components/ILIAS/StudyProgramme/classes/class.ilObjStudyProgrammeMembersGUI.php b/components/ILIAS/StudyProgramme/classes/class.ilObjStudyProgrammeMembersGUI.php index c93f8249c680..8708cb8e5919 100755 --- a/components/ILIAS/StudyProgramme/classes/class.ilObjStudyProgrammeMembersGUI.php +++ b/components/ILIAS/StudyProgramme/classes/class.ilObjStudyProgrammeMembersGUI.php @@ -685,11 +685,6 @@ protected function getAssignmentsFromQuery(): array fn($ass_id) => $this->assignment_db->get((int) $ass_id), $ass_ids ); - - $assignments = array_filter( - $assignments, - fn($ass) => $ass->getRootId() === $prg->getId() - ); return $assignments; } diff --git a/components/ILIAS/StudyProgramme/classes/class.ilStudyProgrammeMembersTableGUI.php b/components/ILIAS/StudyProgramme/classes/class.ilStudyProgrammeMembersTableGUI.php index 0d1fc2e64d79..a21861c0e4fe 100755 --- a/components/ILIAS/StudyProgramme/classes/class.ilStudyProgrammeMembersTableGUI.php +++ b/components/ILIAS/StudyProgramme/classes/class.ilStudyProgrammeMembersTableGUI.php @@ -416,7 +416,6 @@ protected function getPossibleActions( $actions[] = ilObjStudyProgrammeMembersGUI::ACTION_SHOW_INDIVIDUAL_PLAN; $actions[] = ilObjStudyProgrammeMembersGUI::ACTION_REMOVE_USER; $actions[] = ilObjStudyProgrammeMembersGUI::ACTION_UPDATE_FROM_CURRENT_PLAN; - $actions[] = ilObjStudyProgrammeMembersGUI::ACTION_ACKNOWLEDGE_COURSES; $actions[] = ilObjStudyProgrammeMembersGUI::ACTION_CHANGE_DEADLINE; $actions[] = ilObjStudyProgrammeMembersGUI::ACTION_CHANGE_EXPIRE_DATE; } @@ -426,6 +425,7 @@ protected function getPossibleActions( } if ($status == ilPRGProgress::STATUS_IN_PROGRESS) { $actions[] = ilObjStudyProgrammeMembersGUI::ACTION_MARK_ACCREDITED; + $actions[] = ilObjStudyProgrammeMembersGUI::ACTION_ACKNOWLEDGE_COURSES; } if (! $is_root && From bbc60e3812d489793f41d87d1550d48d550b47fe Mon Sep 17 00:00:00 2001 From: Thibeau Fuhrer Date: Tue, 8 Apr 2025 11:37:58 +0200 Subject: [PATCH 067/125] [FIX] UI: use `Item\Notification` JavaScript ID as string. --- .../ILIAS/UI/src/Implementation/Component/Item/Renderer.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/ILIAS/UI/src/Implementation/Component/Item/Renderer.php b/components/ILIAS/UI/src/Implementation/Component/Item/Renderer.php index 55e77a821857..89516cec270c 100755 --- a/components/ILIAS/UI/src/Implementation/Component/Item/Renderer.php +++ b/components/ILIAS/UI/src/Implementation/Component/Item/Renderer.php @@ -256,7 +256,7 @@ protected function renderNotification(Notification $component, RendererInterface * @var $component Notification */ $component = $component->withAdditionalOnLoadCode( - fn($id) => "il.UI.item.notification.getNotificationItemObject($($id)).registerAggregates($toggleable);" + fn($id) => "il.UI.item.notification.getNotificationItemObject($('#$id')).registerAggregates($toggleable);" ); //Bind id @@ -274,7 +274,7 @@ protected function renderNotification(Notification $component, RendererInterface * @var $close_action Close */ $close_action = $this->getUIFactory()->button()->close()->withAdditionalOnLoadCode( - fn($id) => "il.UI.item.notification.getNotificationItemObject($($id)).registerCloseAction('$url',1);" + fn($id) => "il.UI.item.notification.getNotificationItemObject($('#$id')).registerCloseAction('$url',1);" ); $tpl->setVariable("CLOSE_ACTION", $default_renderer->render($close_action)); } From d6fe203f4e7c99b24edf4b93ded0730873a07476 Mon Sep 17 00:00:00 2001 From: Nils Haagen Date: Tue, 4 Mar 2025 10:45:59 +0100 Subject: [PATCH 068/125] OrgU: 44453, get _all_ orgus for getOrgUnitsByUserAndPosition --- .../class.ilOrgUnitUserAssignmentDBRepository.php | 3 +-- .../classes/Positions/class.ilOrgUnitPositionDBRepository.php | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/components/ILIAS/OrgUnit/classes/Positions/UserAssignment/class.ilOrgUnitUserAssignmentDBRepository.php b/components/ILIAS/OrgUnit/classes/Positions/UserAssignment/class.ilOrgUnitUserAssignmentDBRepository.php index 79bea6a41446..9ac44e08fe72 100755 --- a/components/ILIAS/OrgUnit/classes/Positions/UserAssignment/class.ilOrgUnitUserAssignmentDBRepository.php +++ b/components/ILIAS/OrgUnit/classes/Positions/UserAssignment/class.ilOrgUnitUserAssignmentDBRepository.php @@ -347,9 +347,8 @@ public function getOrgUnitsByUserAndPosition(int $user_id, int $position_id, boo $recursive_orgu_ids = []; $tree = ilObjOrgUnitTree::_getInstance(); foreach ($orgu_ids as $orgu_id) { - $recursive_orgu_ids = $recursive_orgu_ids + $tree->getAllChildren($orgu_id); + $recursive_orgu_ids = array_merge($recursive_orgu_ids, $tree->getAllChildren($orgu_id)); } - return $recursive_orgu_ids; } diff --git a/components/ILIAS/OrgUnit/classes/Positions/class.ilOrgUnitPositionDBRepository.php b/components/ILIAS/OrgUnit/classes/Positions/class.ilOrgUnitPositionDBRepository.php index 3dc9756248d3..5fed043c3ce5 100755 --- a/components/ILIAS/OrgUnit/classes/Positions/class.ilOrgUnitPositionDBRepository.php +++ b/components/ILIAS/OrgUnit/classes/Positions/class.ilOrgUnitPositionDBRepository.php @@ -340,7 +340,7 @@ public function getRows( $row_id = (string) $pos->getId(); $record = [ 'title' => $pos->getTitle(), - 'description' => $pos->getDescription() . 'dd', + 'description' => $pos->getDescription(), 'authorities' => implode("
", $this->getAuthorityDescription($pos->getAuthorities())), 'is_core_position' => $pos->isCorePosition(), ]; From 1b6b6a5235dad84c269e8f1d6c5aef068a02c66e Mon Sep 17 00:00:00 2001 From: mjansen Date: Mon, 14 Apr 2025 12:52:50 +0200 Subject: [PATCH 069/125] LegalDocuments: Fix `phpunit` issues --- .../tests/AdministrationEditLinksTest.php | 5 ++--- .../ILIAS/LegalDocuments/tests/ConductorTest.php | 11 +++-------- .../LegalDocuments/tests/ConsumerToolbox/UserTest.php | 5 ++--- .../ILIAS/LegalDocuments/tests/ContainerMock.php | 2 +- .../ILIAS/LegalDocuments/tests/HTMLPurifierTest.php | 5 ++--- .../ILIAS/LegalDocuments/tests/LazyProvideTest.php | 5 ++--- .../ILIAS/LegalDocuments/tests/ValidHTMLTest.php | 7 ++----- 7 files changed, 14 insertions(+), 26 deletions(-) diff --git a/components/ILIAS/LegalDocuments/tests/AdministrationEditLinksTest.php b/components/ILIAS/LegalDocuments/tests/AdministrationEditLinksTest.php index 6a15e841c1d0..c47b4f58e995 100755 --- a/components/ILIAS/LegalDocuments/tests/AdministrationEditLinksTest.php +++ b/components/ILIAS/LegalDocuments/tests/AdministrationEditLinksTest.php @@ -26,6 +26,7 @@ use ilLegalDocumentsAdministrationGUI; use ILIAS\LegalDocuments\Value\Document; use ILIAS\LegalDocuments\Value\Criterion; +use PHPUnit\Framework\Attributes\DataProvider; class AdministrationEditLinksTest extends TestCase { @@ -36,9 +37,7 @@ public function testConstruct(): void $this->assertInstanceOf(AdministrationEditLinks::class, new AdministrationEditLinks($gui, $admin)); } - /** - * @dataProvider methods - */ + #[DataProvider('methods')] public function testMethods(string $method, string $target, int $argc): void { $admin = $this->getMockBuilder(Administration::class)->disableOriginalConstructor()->getMock(); diff --git a/components/ILIAS/LegalDocuments/tests/ConductorTest.php b/components/ILIAS/LegalDocuments/tests/ConductorTest.php index 6f79f8ff9120..16316268b8ad 100755 --- a/components/ILIAS/LegalDocuments/tests/ConductorTest.php +++ b/components/ILIAS/LegalDocuments/tests/ConductorTest.php @@ -31,7 +31,6 @@ use ILIAS\Data\Result; use ILIAS\Data\Result\Ok; use ILIAS\LegalDocuments\PageFragment; -use ILIAS\UI\Component\MainControls\Footer; use ILIAS\UI\Renderer; use ILIAS\UI\Component\Component; use ILIAS\UI\Component\Legacy\Content; @@ -47,8 +46,8 @@ use ilObjUser; use ILIAS\LegalDocuments\ConsumerToolbox\Routing; use ILIAS\Data\Result\Error; -use ilStartUpGUI; use Closure; +use PHPUnit\Framework\Attributes\DataProvider; require_once __DIR__ . '/ContainerMock.php'; @@ -138,9 +137,7 @@ public function testModifyFooter(): void $this->assertSame($footer, $instance->modifyFooter($footer)); } - /** - * @dataProvider agreeTypes - */ + #[DataProvider('agreeTypes')] public function testAgree(string $gui, string $key): void { $main_template = $this->mock(ilGlobalTemplateInterface::class); @@ -148,9 +145,7 @@ public function testAgree(string $gui, string $key): void $this->agreement('agree', $gui, $key, $main_template); } - /** - * @dataProvider agreeTypes - */ + #[DataProvider('agreeTypes')] public function testAgreeContent(string $gui, string $key): void { $this->assertSame('rendered', $this->agreement('agreeContent', $gui, $key)); diff --git a/components/ILIAS/LegalDocuments/tests/ConsumerToolbox/UserTest.php b/components/ILIAS/LegalDocuments/tests/ConsumerToolbox/UserTest.php index eacbfc1c99af..292ac04c0e99 100755 --- a/components/ILIAS/LegalDocuments/tests/ConsumerToolbox/UserTest.php +++ b/components/ILIAS/LegalDocuments/tests/ConsumerToolbox/UserTest.php @@ -37,6 +37,7 @@ use ilObjUser; use DateTimeImmutable; use ilAuthUtils; +use PHPUnit\Framework\Attributes\DataProvider; require_once __DIR__ . '/../ContainerMock.php'; @@ -333,9 +334,7 @@ public function testIsLDAPUser(): void $this->assertTrue($instance->isLDAPUser()); } - /** - * @dataProvider externalAuthModes - */ + #[DataProvider('externalAuthModes')] public function testIsExternalUser(int $auth_mode, bool $is_external_account): void { $instance = new User( diff --git a/components/ILIAS/LegalDocuments/tests/ContainerMock.php b/components/ILIAS/LegalDocuments/tests/ContainerMock.php index 971280a55be0..2ebf576cba70 100755 --- a/components/ILIAS/LegalDocuments/tests/ContainerMock.php +++ b/components/ILIAS/LegalDocuments/tests/ContainerMock.php @@ -39,7 +39,7 @@ private function mockMethod(string $class, string $method, array $args, $return, } /** - * @param class-name|object $class_or_instance + * @param class-string|object $class_or_instance * @param array $methods_and_values */ private function assertGetter($class_or_instance, array $methods_and_values): void diff --git a/components/ILIAS/LegalDocuments/tests/HTMLPurifierTest.php b/components/ILIAS/LegalDocuments/tests/HTMLPurifierTest.php index e5b8ceb16c38..0d405fafd106 100755 --- a/components/ILIAS/LegalDocuments/tests/HTMLPurifierTest.php +++ b/components/ILIAS/LegalDocuments/tests/HTMLPurifierTest.php @@ -25,6 +25,7 @@ use org\bovigo\vfs\vfsStreamWrapper; use org\bovigo\vfs\vfsStreamDirectory; use org\bovigo\vfs\vfsStream; +use PHPUnit\Framework\Attributes\DataProvider; class HTMLPurifierTest extends TestCase { @@ -39,9 +40,7 @@ public function testConstruct(): void $this->assertInstanceOf(HTMLPurifier::class, new HTMLPurifier([], vfsStream::url('root/HTMLPurifier'))); } - /** - * @dataProvider documents - */ + #[DataProvider('documents')] public function testPurify(string $input, string $expected): void { $this->skipIfvfsStreamNotSupported(); diff --git a/components/ILIAS/LegalDocuments/tests/LazyProvideTest.php b/components/ILIAS/LegalDocuments/tests/LazyProvideTest.php index c13db18c98d9..a182d7c02b2f 100755 --- a/components/ILIAS/LegalDocuments/tests/LazyProvideTest.php +++ b/components/ILIAS/LegalDocuments/tests/LazyProvideTest.php @@ -23,6 +23,7 @@ use ILIAS\LegalDocuments\Provide; use PHPUnit\Framework\TestCase; use ILIAS\LegalDocuments\LazyProvide; +use PHPUnit\Framework\Attributes\DataProvider; require_once __DIR__ . '/ContainerMock.php'; @@ -35,9 +36,7 @@ public function testConstruct(): void $this->assertInstanceOf(LazyProvide::class, new LazyProvide($this->fail(...))); } - /** - * @dataProvider methods - */ + #[DataProvider('methods')] public function testMethods(string $method, $return = []): void { $called = false; diff --git a/components/ILIAS/LegalDocuments/tests/ValidHTMLTest.php b/components/ILIAS/LegalDocuments/tests/ValidHTMLTest.php index 3dc14b797173..b832cd14f826 100755 --- a/components/ILIAS/LegalDocuments/tests/ValidHTMLTest.php +++ b/components/ILIAS/LegalDocuments/tests/ValidHTMLTest.php @@ -22,6 +22,7 @@ use PHPUnit\Framework\TestCase; use ILIAS\LegalDocuments\ValidHTML; +use PHPUnit\Framework\Attributes\DataProvider; class ValidHTMLTest extends TestCase { @@ -30,11 +31,7 @@ public function testConstruct(): void $this->assertInstanceOf(ValidHTML::class, new ValidHTML()); } - /** - * @dataProvider textProvider - * @param string $text - * @param bool $result - */ + #[DataProvider('textProvider')] public function testIsTrue(string $text, bool $result): void { $instance = new ValidHTML(); From 6bb995ccfa11481875c5019db13039e0e65334bc Mon Sep 17 00:00:00 2001 From: mjansen Date: Mon, 14 Apr 2025 11:46:06 +0200 Subject: [PATCH 070/125] Badge: Fix `phpunit` issues --- .../BadgeManagementSessionRepositoryTest.php | 3 --- components/ILIAS/Badge/tests/ModalTest.php | 1 - .../Badge/tests/PresentationHeaderTest.php | 17 +++++++------- components/ILIAS/Badge/tests/SortingTest.php | 16 ++++++------- components/ILIAS/Badge/tests/TileTest.php | 23 ++++--------------- 5 files changed, 19 insertions(+), 41 deletions(-) diff --git a/components/ILIAS/Badge/tests/BadgeManagementSessionRepositoryTest.php b/components/ILIAS/Badge/tests/BadgeManagementSessionRepositoryTest.php index ad7810aa745a..725ffb02a05b 100755 --- a/components/ILIAS/Badge/tests/BadgeManagementSessionRepositoryTest.php +++ b/components/ILIAS/Badge/tests/BadgeManagementSessionRepositoryTest.php @@ -18,9 +18,6 @@ use PHPUnit\Framework\TestCase; -/** - * @author Alexander Killing - */ class BadgeManagementSessionRepositoryTest extends TestCase { protected ilBadgeManagementSessionRepository $repo; diff --git a/components/ILIAS/Badge/tests/ModalTest.php b/components/ILIAS/Badge/tests/ModalTest.php index 67b24b9fb271..8514f5a0672c 100755 --- a/components/ILIAS/Badge/tests/ModalTest.php +++ b/components/ILIAS/Badge/tests/ModalTest.php @@ -34,7 +34,6 @@ use ILIAS\UI\Component\Item\Standard as Item; use ILIAS\UI\Component\Listing\Factory as Listing; use ILIAS\UI\Factory as UI; -use ILIAS\UI\Renderer; use PHPUnit\Framework\TestCase; use ilBadge; use ilLanguage; diff --git a/components/ILIAS/Badge/tests/PresentationHeaderTest.php b/components/ILIAS/Badge/tests/PresentationHeaderTest.php index 0ef4e69b8762..5d1feb5b02e0 100755 --- a/components/ILIAS/Badge/tests/PresentationHeaderTest.php +++ b/components/ILIAS/Badge/tests/PresentationHeaderTest.php @@ -31,6 +31,7 @@ use ilCtrl; use ILIAS\UI\Component\Component; use ilLanguage; +use PHPUnit\Framework\Attributes\DataProvider; class PresentationHeaderTest extends TestCase { @@ -41,16 +42,14 @@ public function testConstruct(): void $this->assertInstanceOf(PresentationHeader::class, $head); } - /** - * @dataProvider showProvider - */ + #[DataProvider('showProvider')] public function testShow(bool $additional = false): void { $mode = $this->getMockBuilder(Mode::class)->disableOriginalConstructor()->getMock(); - $mode->expects(self::once())->method('withActive')->with('tile_view')->willReturn($mode); + $mode->expects($this->once())->method('withActive')->with('tile_view')->willReturn($mode); $view_control = $this->getMockBuilder(ViewControl::class)->disableOriginalConstructor()->getMock(); - $view_control->expects(self::once())->method('mode')->with([ + $view_control->expects($this->once())->method('mode')->with([ 'tile_view' => 'list URL', 'table_view' => 'manage URL', ])->willReturn($mode); @@ -65,7 +64,7 @@ public function testShow(bool $additional = false): void $toolbar = $this->getMockBuilder(ilToolbarGUI::class)->disableOriginalConstructor()->getMock(); $toolbar - ->expects(self::exactly($additional + 1)) + ->expects($this->exactly($additional + 1)) ->method('addStickyItem') ->willReturnCallback( function ($component) use (&$consecutive_expected) { @@ -76,7 +75,7 @@ function ($component) use (&$consecutive_expected) { $factory = $this->getMockBuilder(UI::class)->disableOriginalConstructor()->getMock(); - $factory->expects(self::once())->method('viewControl')->willReturn($view_control); + $factory->expects($this->once())->method('viewControl')->willReturn($view_control); $ui = $this->getMockBuilder(UIServices::class)->disableOriginalConstructor()->getMock(); $ui->method('factory')->willReturn($factory); @@ -87,7 +86,7 @@ function ($component) use (&$consecutive_expected) { ]; $ctrl = $this->getMockBuilder(ilCtrl::class)->disableOriginalConstructor()->getMock(); $ctrl - ->expects(self::exactly(2)) + ->expects($this->exactly(2)) ->method('getLinkTargetByClass') ->willReturnCallback( function ($class, $cmd) use (&$consecutive) { @@ -102,7 +101,7 @@ function ($class, $cmd) use (&$consecutive) { $language->method('txt')->willReturnCallback(static fn(string $name): string => $name); $container = $this->getMockBuilder(Container::class)->disableOriginalConstructor()->getMock(); - $container->expects(self::once())->method('toolbar')->willReturn($toolbar); + $container->expects($this->once())->method('toolbar')->willReturn($toolbar); $container->method('ui')->willReturn($ui); $container->method('ctrl')->willReturn($ctrl); $container->method('language')->willReturn($language); diff --git a/components/ILIAS/Badge/tests/SortingTest.php b/components/ILIAS/Badge/tests/SortingTest.php index c60035a1fb2d..2d110550e053 100755 --- a/components/ILIAS/Badge/tests/SortingTest.php +++ b/components/ILIAS/Badge/tests/SortingTest.php @@ -24,6 +24,8 @@ use ilBadge; use ilBadgeAssignment; use PHPUnit\Framework\TestCase; +use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\Attributes\Depends; class SortingTest extends TestCase { @@ -33,10 +35,8 @@ public function testConstruct(): void $this->assertInstanceOf(Sorting::class, $sort); } - /** - * @depends testConstruct - * @dataProvider sortProvider - */ + #[DataProvider('sortProvider')] + #[Depends('testConstruct')] public function testSorting(array $input, string $key, string $label, string $what, string $method, array $equal, array $less, array $greater): void { $sort = new Sorting(...$input); @@ -47,9 +47,7 @@ public function testSorting(array $input, string $key, string $label, string $wh $this->assertEquals(1, $this->sign($sort->compare($this->pair($what, $method, $greater[0]), $this->pair($what, $method, $greater[1])))); } - /** - * @depends testConstruct - */ + #[Depends('testConstruct')] public function testOptions(): void { $this->assertEquals([ @@ -65,8 +63,8 @@ public static function sortProvider(): array return [ 'Default sort is title_asc' => [[], 'title_asc', 'sort_by_title_asc', 'badge', 'getTitle', ['A', 'a'], ['f', 'G'], ['d', 'c']], 'Descending title' => [['title_desc'], 'title_desc', 'sort_by_title_desc', 'badge', 'getTitle', ['A', 'a'], ['d', 'c'], ['f', 'G']], - 'Ascending date' => [['date_asc'], 'date_asc', 'sort_by_date_asc', 'assignment', 'getTimestamp', ['7', '7'], [8, 30], [20, 6]], - 'Ascending date' => [['date_desc'], 'date_desc', 'sort_by_date_desc', 'assignment', 'getTimestamp', [7, 7], [20, 6], [8, 30]], + 'Ascending date' => [['date_asc'], 'date_asc', 'sort_by_date_asc', 'assignment', 'getTimestamp', [7, 7], [8, 30], [20, 6]], + 'Descending date' => [['date_desc'], 'date_desc', 'sort_by_date_desc', 'assignment', 'getTimestamp', [7, 7], [20, 6], [8, 30]], 'Random input results in title_asc' => [['Lorem ipsum'], 'title_asc', 'sort_by_title_asc', 'badge', 'getTitle', ['A', 'a'], ['f', 'G'], ['d', 'c']] ]; } diff --git a/components/ILIAS/Badge/tests/TileTest.php b/components/ILIAS/Badge/tests/TileTest.php index 6b15e53cab0b..36f1e8e4a6c6 100755 --- a/components/ILIAS/Badge/tests/TileTest.php +++ b/components/ILIAS/Badge/tests/TileTest.php @@ -20,34 +20,21 @@ namespace ILIAS\Badge\test; -use Exception; use ILIAS\DI\Container; use ILIAS\DI\UIServices; use ILIAS\Badge\BadgeParent; use ILIAS\Badge\Modal; use ILIAS\Badge\ModalContent; use ILIAS\Badge\Tile; -use ILIAS\UI\Component\Button\Factory as Button; -use ILIAS\UI\Component\Button\Standard as StandardButton; use ILIAS\UI\Component\Button\Button as ButtonComponent; -use ILIAS\UI\Component\Card\Factory as Card; -use ILIAS\UI\Component\Card\Standard as StandardCard; -use ILIAS\UI\Component\Component; -use ILIAS\UI\Component\Image\Factory as Image; use ILIAS\UI\Component\Image\Image as ImageComponent; -use ILIAS\UI\Component\Modal\Factory as UIModal; use ILIAS\UI\Component\Modal\Modal as ModalComponent; -use ILIAS\UI\Component\Modal\Lightbox; -use ILIAS\UI\Component\Modal\LightboxCardPage; -use ILIAS\UI\Factory as UI; use PHPUnit\Framework\TestCase; use ilBadge; -use ilBadgeAssignment; use ilCtrl; use ilLanguage; -use ILIAS\ResourceStorage\Identification\ResourceIdentification; use ILIAS\ResourceStorage\Services; -use ILIAS\Badge\ilBadgeImage; +use PHPUnit\Framework\Attributes\DataProvider; class TileTest extends TestCase { @@ -62,9 +49,7 @@ public function testConstruct(): void $this->assertInstanceOf(Tile::class, new Tile($container, $parent, $modal, $sign_file, $format_date)); } - /** - * @dataProvider provideAsVariants - */ + #[DataProvider('provideAsVariants')] public function testAs(string $method, array $expected_components): void { $signed_file = '/some-signed-file'; @@ -88,7 +73,7 @@ public function testAs(string $method, array $expected_components): void $container->method('language')->willReturn($language); $container->method('resourceStorage')->willReturn($resource_storage); $format_date = function (int $x): void { - throw new Exception('Should not be called.'); + throw new \RuntimeException('Should not be called.'); }; $sign_file = function (string $path) use ($signed_file, $badge_image_path): string { return $signed_file; @@ -103,7 +88,7 @@ public function testAs(string $method, array $expected_components): void $components = $tile->$method($modal_content); - $this->assertSame(count($expected_components), count($components)); + $this->assertCount(\count($expected_components), $components); array_map($this->assertInstanceOf(...), $expected_components, $components); } From 7ec046952318e5e3b2c842fad0bca35b3bd4e9e1 Mon Sep 17 00:00:00 2001 From: Thibeau Fuhrer Date: Fri, 4 Apr 2025 11:30:56 +0200 Subject: [PATCH 071/125] Add `jquery` as npm Dependency for ILIAS 11 --- components/ILIAS/jQuery/jQuery.php | 4 ++-- package-lock.json | 7 +++++++ package.json | 8 ++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/components/ILIAS/jQuery/jQuery.php b/components/ILIAS/jQuery/jQuery.php index adc4466ffc79..1acd530bfdb7 100644 --- a/components/ILIAS/jQuery/jQuery.php +++ b/components/ILIAS/jQuery/jQuery.php @@ -36,8 +36,8 @@ public function init( $contribute[Component\Resource\PublicAsset::class] = fn() => new Component\Resource\NodeModule("jquery-migrate/dist/jquery-migrate.min.js"); */ - /* $contribute[Component\Resource\PublicAsset::class] = fn() => - new Component\Resource\NodeModule("jquery/dist/jquery.js"); */ + $contribute[Component\Resource\PublicAsset::class] = fn() => + new Component\Resource\NodeModule("jquery/dist/jquery.js"); /* This library was missing after discussing dependencies for ILIAS 10 $contribute[Component\Resource\PublicAsset::class] = fn() => new Component\Resource\NodeModule("jquery-ui-dist/jquery-ui.js"); diff --git a/package-lock.json b/package-lock.json index 1b1c8517873e..0a8a973fa7a2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "@yaireo/tagify": "^4.32.1", "chart.js": "^4.4.7", "dropzone": "^5.9.3", + "jquery": "^3.7.1", "linkify-element": "^4.1.3", "linkifyjs": "^4.1.3", "mathjax": "^3.2.2", @@ -2009,6 +2010,12 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "node_modules/jquery": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==", + "license": "MIT" + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", diff --git a/package.json b/package.json index 4d93ab8125b9..bb4c99e70366 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "@yaireo/tagify": "^4.32.1", "chart.js": "^4.4.7", "dropzone": "^5.9.3", + "jquery": "^3.7.1", "linkify-element": "^4.1.3", "linkifyjs": "^4.1.3", "mathjax": "^3.2.2", @@ -120,6 +121,13 @@ "developer": "thibsy", "purpose": "JS Module Bundler", "last-update-for-ilias": "11.0" + }, + "jquery": { + "introduction-date": null, + "approved-by": "Jour Fixe", + "developer": null, + "purpose": "We still use jQuery for many JS-related actions in ILIAS, unfortunately.", + "last-update-for-ilias": "10.0" } } } From 244225db385c0be0732b6662b48c7d0cf03acd6a Mon Sep 17 00:00:00 2001 From: Nils Haagen Date: Mon, 14 Apr 2025 14:21:36 +0200 Subject: [PATCH 072/125] [FEATURE] UI: introduce catamorphism for UI components. (#9262) * Adds `UI\Component\Component::reduceWith()` catamorphism. * Adds support for `Input\Container\ViewControl` and `Input\Container\Form` containers. --- .../ILIAS/UI/src/Component/Component.php | 8 ++ .../Component/ComponentHelper.php | 25 ++++++ .../Component/Input/Container/Container.php | 5 ++ .../Component/Input/Field/Group.php | 5 ++ .../Container/Form/Standard/reduce_with.php | 62 +++++++++++++ .../ViewControl/Standard/reduce_with.php | 57 ++++++++++++ components/ILIAS/UI/tests/Base.php | 3 + .../tests/Component/ComponentHelperTest.php | 87 ++++++++++++++++++- .../Input/Container/Filter/FilterTest.php | 3 +- .../Input/Container/Form/FormTest.php | 3 +- .../Component/Modal/InterruptiveTest.php | 2 + .../UI/tests/Component/Panel/PanelTest.php | 2 + 12 files changed, 259 insertions(+), 3 deletions(-) create mode 100644 components/ILIAS/UI/src/examples/Input/Container/Form/Standard/reduce_with.php create mode 100644 components/ILIAS/UI/src/examples/Input/Container/ViewControl/Standard/reduce_with.php diff --git a/components/ILIAS/UI/src/Component/Component.php b/components/ILIAS/UI/src/Component/Component.php index f2110434707e..3019102dd770 100755 --- a/components/ILIAS/UI/src/Component/Component.php +++ b/components/ILIAS/UI/src/Component/Component.php @@ -30,4 +30,12 @@ interface Component * Get the canonical name of the component. */ public function getCanonicalName(): string; + + /** + * The scheme starts at the leaves of the structure and applies the function + * to each leave and moves up the tree recursively. + * @param Closure(Component, array): mixed $fn + */ + public function reduceWith(\Closure $fn): mixed; + } diff --git a/components/ILIAS/UI/src/Implementation/Component/ComponentHelper.php b/components/ILIAS/UI/src/Implementation/Component/ComponentHelper.php index f17ba4fe42c9..311139d00f59 100755 --- a/components/ILIAS/UI/src/Implementation/Component/ComponentHelper.php +++ b/components/ILIAS/UI/src/Implementation/Component/ComponentHelper.php @@ -23,6 +23,7 @@ use ILIAS\UI\Component\Signal; use InvalidArgumentException; use Closure; +use ILIAS\UI\Component\Component; /** * Provides common functionality for component implementations. @@ -239,4 +240,28 @@ protected function wrongTypeMessage(string $expected, $value): string return "expected $expected, got $type"; } } + + public function reduceWith(\Closure $fn): mixed + { + $clone = clone $this; + $results = []; + foreach ($clone->getSubComponents() ?? [] as $component) { + $results[] = $component->reduceWith($fn); + } + return $fn($clone, $results); + } + + /** + * Get all components that are contained within this component. Sub components + * could either be contained by construction (like a bulky button gets a glyph + * when it is created) or by internal composition (like a launcher uses a bulky + * button internally). + * + * Defaults to empty array, as many components do not contain any substructure. + */ + protected function getSubComponents(): ?array + { + return null; + } + } diff --git a/components/ILIAS/UI/src/Implementation/Component/Input/Container/Container.php b/components/ILIAS/UI/src/Implementation/Component/Input/Container/Container.php index 3b39197bf728..d8c0a8c8d7f4 100755 --- a/components/ILIAS/UI/src/Implementation/Component/Input/Container/Container.php +++ b/components/ILIAS/UI/src/Implementation/Component/Input/Container/Container.php @@ -149,4 +149,9 @@ protected function setInputGroup(C\Input\Group $input_group): void * since different containers may allow different request methods. */ abstract protected function extractRequestData(ServerRequestInterface $request): InputData; + + public function getSubComponents(): array + { + return $this->getInputs(); + } } diff --git a/components/ILIAS/UI/src/Implementation/Component/Input/Field/Group.php b/components/ILIAS/UI/src/Implementation/Component/Input/Field/Group.php index 91f93e362d70..7ce7d2976a8b 100755 --- a/components/ILIAS/UI/src/Implementation/Component/Input/Field/Group.php +++ b/components/ILIAS/UI/src/Implementation/Component/Input/Field/Group.php @@ -157,4 +157,9 @@ protected function isClientSideValueOk($value): bool { return $this->_isClientSideValueOk($value); } + + protected function getSubComponents(): ?array + { + return $this->getInputs(); + } } diff --git a/components/ILIAS/UI/src/examples/Input/Container/Form/Standard/reduce_with.php b/components/ILIAS/UI/src/examples/Input/Container/Form/Standard/reduce_with.php new file mode 100644 index 000000000000..f5f5240b0ce2 --- /dev/null +++ b/components/ILIAS/UI/src/examples/Input/Container/Form/Standard/reduce_with.php @@ -0,0 +1,62 @@ + + * Example showing reduceWith-"catamorphism" with Form to factor out classes and structure as JSON. + * + * expected output: > + * ILIAS shows a JSON like that: + * { + * "Standard Form Container Input": [ + * { + * "Section Field Input": [ + * { + * "Text Field Input": [] + * } + * ] + * }, + * { + * "Section Field Input": [ + * { + * "Text Field Input": [] + * } + * ] + * }, + * { + * "Text Field Input": [] + * } + * ] + * } + *--- + */ +function reduce_with() +{ + global $DIC; + $ui = $DIC->ui()->factory(); + $renderer = $DIC->ui()->renderer(); + + $text_input = $ui->input()->field() + ->text("Required Input", "User needs to fill this field") + ->withRequired(true); + + $section = $ui->input()->field()->section( + [$text_input], + "Section with required field", + "The Form should show an explaining hint at the bottom" + ); + + $form = $ui->input()->container()->form()->standard("", [$section, $section, $text_input]); + + $array = $form->reduceWith( + fn($c, $res) => [$c->getCanonicalName() => $res] + ); + + return $renderer->render([ + $ui->legacy()->content('
' . print_r(json_encode($array, JSON_PRETTY_PRINT), true) . '
'), + ]); +} diff --git a/components/ILIAS/UI/src/examples/Input/Container/ViewControl/Standard/reduce_with.php b/components/ILIAS/UI/src/examples/Input/Container/ViewControl/Standard/reduce_with.php new file mode 100644 index 000000000000..0f2a15825a4c --- /dev/null +++ b/components/ILIAS/UI/src/examples/Input/Container/ViewControl/Standard/reduce_with.php @@ -0,0 +1,57 @@ + + * ILIAS shows a JSON like that: + * { + * "Standard View Control Container Input": [ + * { + * "Pagination View Control Input": [] + * }, + * { + * "Sortation View Control Input": [] + * }, + * { + * "Field Selection View Control Input": [] + * } + * ] + * } + * --- + */ +function reduce_with() +{ + global $DIC; + $f = $DIC->ui()->factory(); + $r = $DIC->ui()->renderer(); + + $vcs = [ + $f->input()->viewControl()->pagination(), + $f->input()->viewControl()->sortation([ + 'Field 1, ascending' => new Order('field1', 'ASC'), + 'Field 1, descending' => new Order('field1', 'DESC'), + 'Field 2, descending' => new Order('field2', 'ASC') + ]), + $f->input()->viewControl()->fieldSelection([ + 'field1' => 'Feld 1', + 'field2' => 'Feld 2' + ], 'shown columns', 'apply'), + ]; + + $vc_container = $f->input()->container()->viewControl()->standard($vcs); + + $array = $vc_container->reduceWith( + fn($c, $res) => [$c->getCanonicalName() => $res] + ); + + return $r->render([ + $f->legacy()->content('
' . print_r(json_encode($array, JSON_PRETTY_PRINT), true) . '
') + ]); +} diff --git a/components/ILIAS/UI/tests/Base.php b/components/ILIAS/UI/tests/Base.php index ba8b463ca5f2..794401f0ca92 100755 --- a/components/ILIAS/UI/tests/Base.php +++ b/components/ILIAS/UI/tests/Base.php @@ -39,6 +39,7 @@ use ILIAS\UI\Implementation\Component\SignalGenerator; use PHPUnit\Framework\MockObject\MockObject; use ILIAS\UI\Component\Component; +use ILIAS\UI\Implementation\Component\ComponentHelper; use ILIAS\Data\Factory as DataFactory; use ILIAS\UI\HelpTextRetriever; use ILIAS\UI\Help; @@ -318,6 +319,8 @@ class SignalGeneratorMock extends SignalGenerator class DummyComponent implements IComponent { + use ComponentHelper; + public function getCanonicalName(): string { return "DummyComponent"; diff --git a/components/ILIAS/UI/tests/Component/ComponentHelperTest.php b/components/ILIAS/UI/tests/Component/ComponentHelperTest.php index 4ac3906a12d8..3e26ea041066 100755 --- a/components/ILIAS/UI/tests/Component/ComponentHelperTest.php +++ b/components/ILIAS/UI/tests/Component/ComponentHelperTest.php @@ -20,13 +20,14 @@ use PHPUnit\Framework\TestCase; use ILIAS\UI\Implementation\Component\ComponentHelper; +use ILIAS\UI\Component\Component; use ILIAS\UI\Component\Test\TestComponent; require_once("vendor/composer/vendor/autoload.php"); require_once(__DIR__ . "/../Renderer/TestComponent.php"); -class ComponentMock +class ComponentMock implements Component { use ComponentHelper; @@ -69,6 +70,14 @@ public function _checkArgList(string $which, array &$value, Closure $check, Clos { $this->checkArgList($which, $value, $check, $message); } + + public $sub_components = null; + public $random_data; + + public function getSubComponents(): ?array + { + return $this->sub_components; + } } class Class1 @@ -281,4 +290,80 @@ public function testCheckArgListNotOk2(): void return "expected keys of type string and integer values, got ($k => $v)"; }); } + + public function testReduceWith() + { + $a = new ComponentMock(); + $a->random_data = "A"; + $b = new ComponentMock(); + $b->random_data = "B"; + $c = new ComponentMock(); + $c->random_data = "C"; + $c->sub_components = [$a, $b]; + + $f = fn($c, $res) => [$c->random_data => $res]; + $res = $c->reduceWith($f); + + $this->assertEquals( + ["C" => + [ + ["A" => []], + ["B" => []], + ] + ], + $res + ); + } + + public function testReduceWithDoesNotModify() + { + $a = new ComponentMock(); + $a->random_data = "A"; + $b = new ComponentMock(); + $b->random_data = "B"; + $c = new ComponentMock(); + $c->random_data = "C"; + $c->sub_components = [$a, $b]; + + $f = function ($c, $res) { + $clone = clone $c; + $clone->random_data = strtolower($c->random_data); + $clone->sub_components = $res; + return $clone; + }; + $c2 = $c->reduceWith($f); + + [$a2, $b2] = $c2->sub_components; + + $this->assertNotEquals(spl_object_id($a), spl_object_id($a2)); + $this->assertNotEquals(spl_object_id($b), spl_object_id($b2)); + $this->assertNotEquals(spl_object_id($c), spl_object_id($c2)); + + $this->assertEquals("A", $a->random_data); + $this->assertEquals("B", $b->random_data); + $this->assertEquals("C", $c->random_data); + $this->assertEquals([$a, $b], $c->sub_components); + + $this->assertEquals("a", $a2->random_data); + $this->assertEquals("b", $b2->random_data); + $this->assertEquals("c", $c2->random_data); + } + + public function testReduceWithSubStructureIsTransient() + { + $a = new ComponentMock(); + $a->random_data = "A"; + $b = new ComponentMock(); + $b->random_data = "B"; + $c = new ComponentMock(); + $c->random_data = "C"; + $c->sub_components = [$a, $b]; + + $f = function ($c, $res) { + return [$c, $c->random_data]; + }; + + [$res, $_] = $c->reduceWith($f); + $this->assertEquals([$a, $b], $res->sub_components); + } } diff --git a/components/ILIAS/UI/tests/Component/Input/Container/Filter/FilterTest.php b/components/ILIAS/UI/tests/Component/Input/Container/Filter/FilterTest.php index 726ffe94ca77..0e764cac8381 100755 --- a/components/ILIAS/UI/tests/Component/Input/Container/Filter/FilterTest.php +++ b/components/ILIAS/UI/tests/Component/Input/Container/Filter/FilterTest.php @@ -476,7 +476,8 @@ protected function inputMock() "withOnUpdate", "appendOnUpdate", "withResetTriggeredSignals", - "getTriggeredSignals" + "getTriggeredSignals", + "reduceWith" ]) ->setMockClassName("Mock_InputNo" . ($no++)) ->getMock(); diff --git a/components/ILIAS/UI/tests/Component/Input/Container/Form/FormTest.php b/components/ILIAS/UI/tests/Component/Input/Container/Form/FormTest.php index 1de73184b9f5..cae44389c8ce 100755 --- a/components/ILIAS/UI/tests/Component/Input/Container/Form/FormTest.php +++ b/components/ILIAS/UI/tests/Component/Input/Container/Form/FormTest.php @@ -461,7 +461,8 @@ protected function inputMock() "withOnUpdate", "appendOnUpdate", "withResetTriggeredSignals", - "getTriggeredSignals" + "getTriggeredSignals", + "reduceWith" ]) ->setMockClassName("Mock_InputNo" . ($no++)) ->getMock(); diff --git a/components/ILIAS/UI/tests/Component/Modal/InterruptiveTest.php b/components/ILIAS/UI/tests/Component/Modal/InterruptiveTest.php index ccd5492af82d..3746358047b5 100755 --- a/components/ILIAS/UI/tests/Component/Modal/InterruptiveTest.php +++ b/components/ILIAS/UI/tests/Component/Modal/InterruptiveTest.php @@ -178,6 +178,8 @@ public function testLabels(): void class InterruptiveItemMock implements C\Modal\InterruptiveItem\InterruptiveItem { + use I\Component\ComponentHelper; + protected string $canonical_name; public function __construct(string $canonical_name = '') diff --git a/components/ILIAS/UI/tests/Component/Panel/PanelTest.php b/components/ILIAS/UI/tests/Component/Panel/PanelTest.php index f0536e5c1394..4991e9c7ae56 100755 --- a/components/ILIAS/UI/tests/Component/Panel/PanelTest.php +++ b/components/ILIAS/UI/tests/Component/Panel/PanelTest.php @@ -27,6 +27,8 @@ class ComponentDummy implements C\Component { + use I\Component\ComponentHelper; + protected string $id; public function __construct($id = "") From 43a98fc17d7f7ffb83be82ed767509c601058780 Mon Sep 17 00:00:00 2001 From: mjansen Date: Mon, 14 Apr 2025 13:17:15 +0200 Subject: [PATCH 073/125] Contact: Fix `phpunit` issues --- ...ssUserProviderApprovedContactsTestCase.php | 27 ++++++++--------- ...essUserProviderContactRequestsTestCase.php | 21 +++++-------- .../Contact/tests/ilBuddyListTestCase.php | 5 ---- ...lBuddySystemRelationCollectionTestCase.php | 30 +++++++------------ ...lBuddySystemRelationRepositoryTestCase.php | 4 --- .../tests/ilBuddySystemRelationTestCase.php | 4 --- .../states/ilBuddySystemBaseStateTestCase.php | 4 --- .../ilBuddySystemLinkedStateRelationTest.php | 4 --- ...bleToApproveIgnoredRequestRuleTestCase.php | 12 ++++---- ...dOnlyBeAbleToCancelRequestRuleTestCase.php | 12 ++++---- ...temRelationStateNullFilterRuleTestCase.php | 16 +++++----- ...ldNotBeAbleToCancelRequestRuleTestCase.php | 12 ++++---- ...bleToApproveIgnoredRequestRuleTestCase.php | 12 ++++---- ...ySystemRequestIgnoredStateRelationTest.php | 4 --- ...lBuddySystemRequestedStateRelationTest.php | 4 --- ...ilBuddySystemUnlinkedStateRelationTest.php | 4 --- 16 files changed, 61 insertions(+), 114 deletions(-) diff --git a/components/ILIAS/Contact/tests/ilAwarenessUserProviderApprovedContactsTestCase.php b/components/ILIAS/Contact/tests/ilAwarenessUserProviderApprovedContactsTestCase.php index 822be592c0ef..164b4813087d 100644 --- a/components/ILIAS/Contact/tests/ilAwarenessUserProviderApprovedContactsTestCase.php +++ b/components/ILIAS/Contact/tests/ilAwarenessUserProviderApprovedContactsTestCase.php @@ -20,6 +20,7 @@ use ILIAS\DI\Container; use ilAwarenessUserProviderApprovedContacts as ApprovedContacts; +use PHPUnit\Framework\Attributes\Depends; class ilAwarenessUserProviderApprovedContactsTestCase extends ilBuddySystemBaseTestCase { @@ -28,8 +29,8 @@ public function testConstruct(): ApprovedContacts $user = $this->getMockBuilder(ilObjUser::class)->disableOriginalConstructor()->getMock(); $language = $this->getMockBuilder(ilLanguage::class)->disableOriginalConstructor()->getMock(); $container = $this->getMockBuilder(Container::class)->disableOriginalConstructor()->getMock(); - $container->expects(self::once())->method('user')->willReturn($user); - $container->expects(self::once())->method('language')->willReturn($language); + $container->expects($this->once())->method('user')->willReturn($user); + $container->expects($this->once())->method('language')->willReturn($language); $instance = new ApprovedContacts($container); @@ -38,9 +39,7 @@ public function testConstruct(): ApprovedContacts return $instance; } - /** - * @depends testConstruct - */ + #[Depends('testConstruct')] public function testGetProviderId(ApprovedContacts $instance): void { $this->assertSame('contact_requests', $instance->getProviderId()); @@ -59,20 +58,18 @@ public function testGetInfo(): void public function testGetInitialUserSet(): void { $user = $this->getMockBuilder(ilObjUser::class)->disableOriginalConstructor()->getMock(); - $user->expects(self::once())->method('isAnonymous')->willReturn(true); + $user->expects($this->once())->method('isAnonymous')->willReturn(true); $language = $this->getMockBuilder(ilLanguage::class)->disableOriginalConstructor()->getMock(); $container = $this->getMockBuilder(Container::class)->disableOriginalConstructor()->getMock(); - $container->expects(self::once())->method('user')->willReturn($user); - $container->expects(self::once())->method('language')->willReturn($language); + $container->expects($this->once())->method('user')->willReturn($user); + $container->expects($this->once())->method('language')->willReturn($language); $instance = new ApprovedContacts($container); $this->assertEquals([], $instance->getInitialUserSet()); } - /** - * @depends testConstruct - */ + #[Depends('testConstruct')] public function testIsHighlighted(ApprovedContacts $instance): void { $this->assertFalse($instance->isHighlighted()); @@ -84,12 +81,12 @@ private function expectTranslation(string $method, string $languageKey): void $user = $this->getMockBuilder(ilObjUser::class)->disableOriginalConstructor()->getMock(); $language = $this->getMockBuilder(ilLanguage::class)->disableOriginalConstructor()->getMock(); - $language->expects(self::once())->method('loadLanguageModule')->with('contact'); - $language->expects(self::once())->method('txt')->with($languageKey)->willReturn($expected); + $language->expects($this->once())->method('loadLanguageModule')->with('contact'); + $language->expects($this->once())->method('txt')->with($languageKey)->willReturn($expected); $container = $this->getMockBuilder(Container::class)->disableOriginalConstructor()->getMock(); - $container->expects(self::once())->method('user')->willReturn($user); - $container->expects(self::once())->method('language')->willReturn($language); + $container->expects($this->once())->method('user')->willReturn($user); + $container->expects($this->once())->method('language')->willReturn($language); $instance = new ApprovedContacts($container); $this->assertSame($expected, $instance->$method()); diff --git a/components/ILIAS/Contact/tests/ilAwarenessUserProviderContactRequestsTestCase.php b/components/ILIAS/Contact/tests/ilAwarenessUserProviderContactRequestsTestCase.php index 4845f2b46500..d2d29a1ea202 100644 --- a/components/ILIAS/Contact/tests/ilAwarenessUserProviderContactRequestsTestCase.php +++ b/components/ILIAS/Contact/tests/ilAwarenessUserProviderContactRequestsTestCase.php @@ -24,15 +24,8 @@ class ilAwarenessUserProviderContactRequestsTestCase extends ilBuddySystemBaseTestCase { - /** - * @var ilObjUser|MockObject - */ - private $user; - - /** - * @var ilLanguage|MockObject - */ - private $language; + private ilObjUser|MockObject $user; + private ilLanguage|MockObject $language; public function testConstruct(): void { @@ -58,7 +51,7 @@ public function testGetInitialUserSet(): void { $instance = $this->create(); - $this->user->expects(self::once())->method('isAnonymous')->willReturn(true); + $this->user->expects($this->once())->method('isAnonymous')->willReturn(true); $this->assertEquals([], $instance->getInitialUserSet()); } @@ -74,8 +67,8 @@ private function expectTranslation(string $method, string $languageKey): void $instance = $this->create(); - $this->language->expects(self::once())->method('loadLanguageModule')->with('contact'); - $this->language->expects(self::once())->method('txt')->with($languageKey)->willReturn($expected); + $this->language->expects($this->once())->method('loadLanguageModule')->with('contact'); + $this->language->expects($this->once())->method('txt')->with($languageKey)->willReturn($expected); $this->assertSame($expected, $instance->$method()); } @@ -86,8 +79,8 @@ private function create(): Contacts $this->language = $this->getMockBuilder(ilLanguage::class)->disableOriginalConstructor()->getMock(); $container = $this->getMockBuilder(Container::class)->disableOriginalConstructor()->getMock(); - $container->expects(self::once())->method('user')->willReturn($this->user); - $container->expects(self::once())->method('language')->willReturn($this->language); + $container->expects($this->once())->method('user')->willReturn($this->user); + $container->expects($this->once())->method('language')->willReturn($this->language); return new Contacts($container); } diff --git a/components/ILIAS/Contact/tests/ilBuddyListTestCase.php b/components/ILIAS/Contact/tests/ilBuddyListTestCase.php index f5d796c1345c..cd8bbf5f0a46 100644 --- a/components/ILIAS/Contact/tests/ilBuddyListTestCase.php +++ b/components/ILIAS/Contact/tests/ilBuddyListTestCase.php @@ -18,10 +18,6 @@ declare(strict_types=1); -/** - * Class ilBuddyListTest - * @author Michael Jansen - */ class ilBuddyListTestCase extends ilBuddySystemBaseTestCase { private const BUDDY_LIST_OWNER_ID = -1; @@ -516,7 +512,6 @@ private function setPriorRelationState( ): void { $object = new ReflectionObject($relation); $property = $object->getProperty('priorState'); - $property->setAccessible(true); $property->setValue($relation, $state); } diff --git a/components/ILIAS/Contact/tests/ilBuddySystemRelationCollectionTestCase.php b/components/ILIAS/Contact/tests/ilBuddySystemRelationCollectionTestCase.php index b51378644535..4a91de8def46 100644 --- a/components/ILIAS/Contact/tests/ilBuddySystemRelationCollectionTestCase.php +++ b/components/ILIAS/Contact/tests/ilBuddySystemRelationCollectionTestCase.php @@ -18,15 +18,11 @@ declare(strict_types=1); -/** - * Class ilBuddySystemRelationCollectionTest - * @author Michael Jansen - */ +use PHPUnit\Framework\Attributes\DataProvider; + class ilBuddySystemRelationCollectionTestCase extends ilBuddySystemBaseTestCase { - /** - * @dataProvider provideElements - */ + #[DataProvider('provideElements')] public function testElementsCanBeInitiallyAdded(array $elements): void { $collection = new ilBuddySystemRelationCollection($elements); @@ -43,9 +39,7 @@ public function testElementsCanBeInitiallyAdded(array $elements): void } } - /** - * @dataProvider provideElements - */ + #[DataProvider('provideElements')] public function testElementsCanBeAddedAndRemoved(array $elements): void { $collection = new ilBuddySystemRelationCollection(); @@ -94,14 +88,12 @@ public function testElementsCanBeAddedAndRemoved(array $elements): void $this->assertSame(5, reset($data)); } - /** - * @dataProvider provideElements - */ + #[DataProvider('provideElements')] public function testIterator(array $elements): void { $collection = new ilBuddySystemRelationCollection($elements); $iterations = 0; - foreach ($collection->getIterator() as $key => $item) { + foreach ($collection as $key => $item) { $this->assertSame($elements[$key], $item, "Item $key not match"); $iterations++; } @@ -149,11 +141,11 @@ public function testElementsCanBeFiltered(): void */ public static function provideElements(): array { - $relation1 = $this->getMockBuilder(ilBuddySystemRelation::class)->disableOriginalConstructor()->getMock(); - $relation2 = $this->getMockBuilder(ilBuddySystemRelation::class)->disableOriginalConstructor()->getMock(); - $relation3 = $this->getMockBuilder(ilBuddySystemRelation::class)->disableOriginalConstructor()->getMock(); - $relation4 = $this->getMockBuilder(ilBuddySystemRelation::class)->disableOriginalConstructor()->getMock(); - $relation5 = $this->getMockBuilder(ilBuddySystemRelation::class)->disableOriginalConstructor()->getMock(); + $relation1 = new ilBuddySystemRelation(new ilBuddySystemUnlinkedRelationState(), 1, 2, false, time()); + $relation2 = new ilBuddySystemRelation(new ilBuddySystemUnlinkedRelationState(), 3, 4, false, time()); + $relation3 = new ilBuddySystemRelation(new ilBuddySystemUnlinkedRelationState(), 5, 6, false, time()); + $relation4 = new ilBuddySystemRelation(new ilBuddySystemUnlinkedRelationState(), 7, 8, false, time()); + $relation5 = new ilBuddySystemRelation(new ilBuddySystemUnlinkedRelationState(), 9, 10, false, time()); return [ 'indexed' => [[0, 1, 2, 3, 4, 5]], diff --git a/components/ILIAS/Contact/tests/ilBuddySystemRelationRepositoryTestCase.php b/components/ILIAS/Contact/tests/ilBuddySystemRelationRepositoryTestCase.php index c16421fab605..61edaa58fef7 100644 --- a/components/ILIAS/Contact/tests/ilBuddySystemRelationRepositoryTestCase.php +++ b/components/ILIAS/Contact/tests/ilBuddySystemRelationRepositoryTestCase.php @@ -18,10 +18,6 @@ declare(strict_types=1); -/** - * Class ilBuddySystemRelationRepositoryTest - * @author Michael Jansen - */ class ilBuddySystemRelationRepositoryTestCase extends ilBuddySystemBaseTestCase { public function testSqlRepositoryDelegatesDeletionToDatabaseAbstraction(): void diff --git a/components/ILIAS/Contact/tests/ilBuddySystemRelationTestCase.php b/components/ILIAS/Contact/tests/ilBuddySystemRelationTestCase.php index 0c4b6c491f96..bddef18fd9fd 100644 --- a/components/ILIAS/Contact/tests/ilBuddySystemRelationTestCase.php +++ b/components/ILIAS/Contact/tests/ilBuddySystemRelationTestCase.php @@ -18,10 +18,6 @@ declare(strict_types=1); -/** - * Class ilBuddySystemRelationTest - * @author Michael Jansen - */ class ilBuddySystemRelationTestCase extends ilBuddySystemBaseTestCase { private const RELATION_OWNER_ID = -1; diff --git a/components/ILIAS/Contact/tests/states/ilBuddySystemBaseStateTestCase.php b/components/ILIAS/Contact/tests/states/ilBuddySystemBaseStateTestCase.php index a46e0d530175..a91a0a7d414b 100644 --- a/components/ILIAS/Contact/tests/states/ilBuddySystemBaseStateTestCase.php +++ b/components/ILIAS/Contact/tests/states/ilBuddySystemBaseStateTestCase.php @@ -18,10 +18,6 @@ declare(strict_types=1); -/** - * Class ilBuddySystemBaseStateTest - * @author Michael Jansen - */ abstract class ilBuddySystemBaseStateTestCase extends ilBuddySystemBaseTestCase { private const RELATION_OWNER_ID = -1; diff --git a/components/ILIAS/Contact/tests/states/ilBuddySystemLinkedStateRelationTest.php b/components/ILIAS/Contact/tests/states/ilBuddySystemLinkedStateRelationTest.php index fd275ddb557c..dca5945365da 100644 --- a/components/ILIAS/Contact/tests/states/ilBuddySystemLinkedStateRelationTest.php +++ b/components/ILIAS/Contact/tests/states/ilBuddySystemLinkedStateRelationTest.php @@ -18,10 +18,6 @@ declare(strict_types=1); -/** - * Class ilBuddySystemLinkedStateRelationTest - * @author Michael Jansen - */ class ilBuddySystemLinkedStateRelationTest extends ilBuddySystemBaseStateTestCase { public function getInitialState(): ilBuddySystemRelationState diff --git a/components/ILIAS/Contact/tests/states/ilBuddySystemRelationStateInitiatorShouldNotBeAbleToApproveIgnoredRequestRuleTestCase.php b/components/ILIAS/Contact/tests/states/ilBuddySystemRelationStateInitiatorShouldNotBeAbleToApproveIgnoredRequestRuleTestCase.php index 64f2ee185ea7..b06ab14e7e9a 100644 --- a/components/ILIAS/Contact/tests/states/ilBuddySystemRelationStateInitiatorShouldNotBeAbleToApproveIgnoredRequestRuleTestCase.php +++ b/components/ILIAS/Contact/tests/states/ilBuddySystemRelationStateInitiatorShouldNotBeAbleToApproveIgnoredRequestRuleTestCase.php @@ -34,8 +34,8 @@ public function testConstruct(): void public function testMatches(): void { $relation = $this->getMockBuilder(ilBuddySystemRelation::class)->disableOriginalConstructor()->getMock(); - $relation->expects(self::once())->method('isIgnored')->willReturn(true); - $relation->expects(self::once())->method('isOwnedByActor')->willReturn(true); + $relation->expects($this->once())->method('isIgnored')->willReturn(true); + $relation->expects($this->once())->method('isOwnedByActor')->willReturn(true); $instance = new DontApprove($relation); $this->assertTrue($instance->matches()); @@ -44,8 +44,8 @@ public function testMatches(): void public function testMatchesIgnored(): void { $relation = $this->getMockBuilder(ilBuddySystemRelation::class)->disableOriginalConstructor()->getMock(); - $relation->expects(self::once())->method('isIgnored')->willReturn(false); - $relation->expects(self::never())->method('isOwnedByActor'); + $relation->expects($this->once())->method('isIgnored')->willReturn(false); + $relation->expects($this->never())->method('isOwnedByActor'); $instance = new DontApprove($relation); $this->assertFalse($instance->matches()); @@ -54,8 +54,8 @@ public function testMatchesIgnored(): void public function testMatchesOwned(): void { $relation = $this->getMockBuilder(ilBuddySystemRelation::class)->disableOriginalConstructor()->getMock(); - $relation->expects(self::once())->method('isIgnored')->willReturn(true); - $relation->expects(self::once())->method('isOwnedByActor')->willReturn(false); + $relation->expects($this->once())->method('isIgnored')->willReturn(true); + $relation->expects($this->once())->method('isOwnedByActor')->willReturn(false); $instance = new DontApprove($relation); $this->assertFalse($instance->matches()); diff --git a/components/ILIAS/Contact/tests/states/ilBuddySystemRelationStateInitiatorShouldOnlyBeAbleToCancelRequestRuleTestCase.php b/components/ILIAS/Contact/tests/states/ilBuddySystemRelationStateInitiatorShouldOnlyBeAbleToCancelRequestRuleTestCase.php index 756d3e443601..785c1f4d1e21 100644 --- a/components/ILIAS/Contact/tests/states/ilBuddySystemRelationStateInitiatorShouldOnlyBeAbleToCancelRequestRuleTestCase.php +++ b/components/ILIAS/Contact/tests/states/ilBuddySystemRelationStateInitiatorShouldOnlyBeAbleToCancelRequestRuleTestCase.php @@ -34,8 +34,8 @@ public function testConstruct(): void public function testMatches(): void { $relation = $this->mock(ilBuddySystemRelation::class); - $relation->expects(self::once())->method('isRequested')->willReturn(true); - $relation->expects(self::once())->method('isOwnedByActor')->willReturn(true); + $relation->expects($this->once())->method('isRequested')->willReturn(true); + $relation->expects($this->once())->method('isOwnedByActor')->willReturn(true); $instance = new Cancel($relation); $this->assertTrue($instance->matches()); @@ -44,8 +44,8 @@ public function testMatches(): void public function testMatchesRequested(): void { $relation = $this->mock(ilBuddySystemRelation::class); - $relation->expects(self::once())->method('isRequested')->willReturn(false); - $relation->expects(self::never())->method('isOwnedByActor'); + $relation->expects($this->once())->method('isRequested')->willReturn(false); + $relation->expects($this->never())->method('isOwnedByActor'); $instance = new Cancel($relation); $this->assertFalse($instance->matches()); @@ -54,8 +54,8 @@ public function testMatchesRequested(): void public function testMatchesOwned(): void { $relation = $this->mock(ilBuddySystemRelation::class); - $relation->expects(self::once())->method('isRequested')->willReturn(true); - $relation->expects(self::once())->method('isOwnedByActor')->willReturn(false); + $relation->expects($this->once())->method('isRequested')->willReturn(true); + $relation->expects($this->once())->method('isOwnedByActor')->willReturn(false); $instance = new Cancel($relation); $this->assertFalse($instance->matches()); diff --git a/components/ILIAS/Contact/tests/states/ilBuddySystemRelationStateNullFilterRuleTestCase.php b/components/ILIAS/Contact/tests/states/ilBuddySystemRelationStateNullFilterRuleTestCase.php index b9dd60aa7a0b..f7f83b6eed40 100644 --- a/components/ILIAS/Contact/tests/states/ilBuddySystemRelationStateNullFilterRuleTestCase.php +++ b/components/ILIAS/Contact/tests/states/ilBuddySystemRelationStateNullFilterRuleTestCase.php @@ -18,6 +18,8 @@ declare(strict_types=1); +use PHPUnit\Framework\Attributes\Depends; + class ilBuddySystemRelationStateNullFilterRuleTestCase extends ilBuddySystemBaseTestCase { public function testConstruct(): ilBuddySystemRelationStateNullFilterRule @@ -32,17 +34,13 @@ public function testConstruct(): ilBuddySystemRelationStateNullFilterRule return $instance; } - /** - * @depends testConstruct - */ + #[Depends('testConstruct')] public function testMatches(ilBuddySystemRelationStateNullFilterRule $instance): void { $this->assertTrue($instance->matches()); } - /** - * @depends testConstruct - */ + #[Depends('testConstruct')] public function testInvoke(ilBuddySystemRelationStateNullFilterRule $instance): void { $this->assertTrue($instance($this->getMockBuilder(ilBuddySystemRelationState::class)->disableOriginalConstructor()->getMock())); @@ -57,12 +55,12 @@ public function testGetStates(): void $filtered = $this->getMockBuilder(ilBuddySystemRelationStateCollection::class)->disableOriginalConstructor()->getMock(); $collection = $this->getMockBuilder(ilBuddySystemRelationStateCollection::class)->disableOriginalConstructor()->getMock(); - $collection->expects(self::once())->method('filter')->with($instance)->willReturn($filtered); + $collection->expects($this->once())->method('filter')->with($instance)->willReturn($filtered); $state = $this->getMockBuilder(ilBuddySystemRelationState::class)->disableOriginalConstructor()->getMock(); - $state->expects(self::once())->method('getPossibleTargetStates')->willReturn($collection); + $state->expects($this->once())->method('getPossibleTargetStates')->willReturn($collection); - $relation->expects(self::once())->method('getState')->willReturn($state); + $relation->expects($this->once())->method('getState')->willReturn($state); $this->assertEquals($filtered, $instance->getStates()); } diff --git a/components/ILIAS/Contact/tests/states/ilBuddySystemRelationStateReceiverShouldNotBeAbleToCancelRequestRuleTestCase.php b/components/ILIAS/Contact/tests/states/ilBuddySystemRelationStateReceiverShouldNotBeAbleToCancelRequestRuleTestCase.php index 1ca0d427e1e9..5954bb8642dd 100644 --- a/components/ILIAS/Contact/tests/states/ilBuddySystemRelationStateReceiverShouldNotBeAbleToCancelRequestRuleTestCase.php +++ b/components/ILIAS/Contact/tests/states/ilBuddySystemRelationStateReceiverShouldNotBeAbleToCancelRequestRuleTestCase.php @@ -34,8 +34,8 @@ public function testConstruct(): void public function testMatches(): void { $relation = $this->mock(ilBuddySystemRelation::class); - $relation->expects(self::once())->method('isRequested')->willReturn(true); - $relation->expects(self::once())->method('isOwnedByActor')->willReturn(false); + $relation->expects($this->once())->method('isRequested')->willReturn(true); + $relation->expects($this->once())->method('isOwnedByActor')->willReturn(false); $instance = new DontCancel($relation); $this->assertTrue($instance->matches()); @@ -44,8 +44,8 @@ public function testMatches(): void public function testMatchesRequested(): void { $relation = $this->mock(ilBuddySystemRelation::class); - $relation->expects(self::once())->method('isRequested')->willReturn(false); - $relation->expects(self::never())->method('isOwnedByActor'); + $relation->expects($this->once())->method('isRequested')->willReturn(false); + $relation->expects($this->never())->method('isOwnedByActor'); $instance = new DontCancel($relation); $this->assertFalse($instance->matches()); @@ -54,8 +54,8 @@ public function testMatchesRequested(): void public function testMatchesOwned(): void { $relation = $this->mock(ilBuddySystemRelation::class); - $relation->expects(self::once())->method('isRequested')->willReturn(true); - $relation->expects(self::once())->method('isOwnedByActor')->willReturn(true); + $relation->expects($this->once())->method('isRequested')->willReturn(true); + $relation->expects($this->once())->method('isOwnedByActor')->willReturn(true); $instance = new DontCancel($relation); $this->assertFalse($instance->matches()); diff --git a/components/ILIAS/Contact/tests/states/ilBuddySystemRelationStateReceiverShouldOnlyBeAbleToApproveIgnoredRequestRuleTestCase.php b/components/ILIAS/Contact/tests/states/ilBuddySystemRelationStateReceiverShouldOnlyBeAbleToApproveIgnoredRequestRuleTestCase.php index 4e3641febd5b..a8ea1524ce56 100644 --- a/components/ILIAS/Contact/tests/states/ilBuddySystemRelationStateReceiverShouldOnlyBeAbleToApproveIgnoredRequestRuleTestCase.php +++ b/components/ILIAS/Contact/tests/states/ilBuddySystemRelationStateReceiverShouldOnlyBeAbleToApproveIgnoredRequestRuleTestCase.php @@ -34,8 +34,8 @@ public function testConstruct(): void public function testMatches(): void { $relation = $this->mock(ilBuddySystemRelation::class); - $relation->expects(self::once())->method('isIgnored')->willReturn(true); - $relation->expects(self::once())->method('isOwnedByActor')->willReturn(false); + $relation->expects($this->once())->method('isIgnored')->willReturn(true); + $relation->expects($this->once())->method('isOwnedByActor')->willReturn(false); $instance = new Approve($relation); $this->assertTrue($instance->matches()); @@ -44,8 +44,8 @@ public function testMatches(): void public function testMatchesIgnored(): void { $relation = $this->mock(ilBuddySystemRelation::class); - $relation->expects(self::once())->method('isIgnored')->willReturn(false); - $relation->expects(self::never())->method('isOwnedByActor'); + $relation->expects($this->once())->method('isIgnored')->willReturn(false); + $relation->expects($this->never())->method('isOwnedByActor'); $instance = new Approve($relation); $this->assertFalse($instance->matches()); @@ -54,8 +54,8 @@ public function testMatchesIgnored(): void public function testMatchesOwned(): void { $relation = $this->mock(ilBuddySystemRelation::class); - $relation->expects(self::once())->method('isIgnored')->willReturn(true); - $relation->expects(self::once())->method('isOwnedByActor')->willReturn(true); + $relation->expects($this->once())->method('isIgnored')->willReturn(true); + $relation->expects($this->once())->method('isOwnedByActor')->willReturn(true); $instance = new Approve($relation); $this->assertFalse($instance->matches()); diff --git a/components/ILIAS/Contact/tests/states/ilBuddySystemRequestIgnoredStateRelationTest.php b/components/ILIAS/Contact/tests/states/ilBuddySystemRequestIgnoredStateRelationTest.php index 615c276cc429..37b028da40cc 100644 --- a/components/ILIAS/Contact/tests/states/ilBuddySystemRequestIgnoredStateRelationTest.php +++ b/components/ILIAS/Contact/tests/states/ilBuddySystemRequestIgnoredStateRelationTest.php @@ -18,10 +18,6 @@ declare(strict_types=1); -/** - * Class ilBuddySystemRequestIgnoredStateRelationTest - * @author Michael Jansen - */ class ilBuddySystemRequestIgnoredStateRelationTest extends ilBuddySystemBaseStateTestCase { public function getInitialState(): ilBuddySystemRelationState diff --git a/components/ILIAS/Contact/tests/states/ilBuddySystemRequestedStateRelationTest.php b/components/ILIAS/Contact/tests/states/ilBuddySystemRequestedStateRelationTest.php index 24c04f7e7693..58ba9a722827 100644 --- a/components/ILIAS/Contact/tests/states/ilBuddySystemRequestedStateRelationTest.php +++ b/components/ILIAS/Contact/tests/states/ilBuddySystemRequestedStateRelationTest.php @@ -18,10 +18,6 @@ declare(strict_types=1); -/** - * Class ilBuddySystemRequestedStateRelationTest - * @author Michael Jansen - */ class ilBuddySystemRequestedStateRelationTest extends ilBuddySystemBaseStateTestCase { public function getInitialState(): ilBuddySystemRelationState diff --git a/components/ILIAS/Contact/tests/states/ilBuddySystemUnlinkedStateRelationTest.php b/components/ILIAS/Contact/tests/states/ilBuddySystemUnlinkedStateRelationTest.php index bb97dc176c26..c788b2264611 100644 --- a/components/ILIAS/Contact/tests/states/ilBuddySystemUnlinkedStateRelationTest.php +++ b/components/ILIAS/Contact/tests/states/ilBuddySystemUnlinkedStateRelationTest.php @@ -18,10 +18,6 @@ declare(strict_types=1); -/** - * Class ilBuddySystemUnlinkedStateRelationTest - * @author Michael Jansen - */ class ilBuddySystemUnlinkedStateRelationTest extends ilBuddySystemBaseStateTestCase { public function getInitialState(): ilBuddySystemRelationState From 98e592c7fde1dc9ab1caf830482e2a422155a3b5 Mon Sep 17 00:00:00 2001 From: mjansen Date: Mon, 14 Apr 2025 14:36:38 +0200 Subject: [PATCH 074/125] Mail: Use different approach to bin closure --- .../ILIAS/Mail/tests/ilMailTemplateContextTest.php | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/components/ILIAS/Mail/tests/ilMailTemplateContextTest.php b/components/ILIAS/Mail/tests/ilMailTemplateContextTest.php index c94cc2293c30..5e4060245013 100755 --- a/components/ILIAS/Mail/tests/ilMailTemplateContextTest.php +++ b/components/ILIAS/Mail/tests/ilMailTemplateContextTest.php @@ -86,7 +86,7 @@ private function generateOrgUnitUsers(Closure $mock_builder, int $amount): array } /** - * @return array + * @return array): ilObjUser, 1: Closure(Closure(): MockBuilder): array{0: ilOrgUnitUser, 1: list}}> */ public static function userProvider(): array { @@ -155,8 +155,8 @@ public static function userProvider(): array } /** - * @param callable(Closure(): MockBuilder): ilObjUser $user_callable - * @param callable(Closure(): MockBuilder): array{0: ilOrgUnitUser, 1: list} $ou_user_callable + * @param Closure(Closure(): MockBuilder): ilObjUser $user_callable + * @param Closure(Closure(): MockBuilder): array{0: ilOrgUnitUser, 1: list} $ou_user_callable */ #[DataProvider('userProvider')] public function testGlobalPlaceholdersCanBeResolvedWithCorrespondingValues( @@ -170,8 +170,11 @@ public function testGlobalPlaceholdersCanBeResolvedWithCorrespondingValues( return $this->getMockBuilder(ilOrgUnitUser::class); }; - $user = $user_callable->call($this, $mock_builder_user_callable); - [$ou_user, $ou_superiors] = $ou_user_callable->call($this, $mock_builder_ou_user_callable); + $user_callable = Closure::bind($user_callable, $this, self::class); + $ou_user_callable = Closure::bind($ou_user_callable, $this, self::class); + + $user = $user_callable($mock_builder_user_callable); + [$ou_user, $ou_superiors] = $ou_user_callable($mock_builder_ou_user_callable); $ou_service = $this->getMockBuilder(OrgUnitUserService::class) ->disableOriginalConstructor() From db860814489f46b3c39904d324c96b239631ee04 Mon Sep 17 00:00:00 2001 From: Lukas Scharmer Date: Thu, 10 Apr 2025 16:18:32 +0200 Subject: [PATCH 075/125] Change "Copy Permanentlink" button from shy to standard --- .../Component/MainControls/Renderer.php | 2 +- .../tests/Component/MainControls/FooterTest.php | 15 +++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/components/ILIAS/UI/src/Implementation/Component/MainControls/Renderer.php b/components/ILIAS/UI/src/Implementation/Component/MainControls/Renderer.php index 941a804ea4c5..76d1623ca97f 100755 --- a/components/ILIAS/UI/src/Implementation/Component/MainControls/Renderer.php +++ b/components/ILIAS/UI/src/Implementation/Component/MainControls/Renderer.php @@ -600,7 +600,7 @@ private function permanentLink(string $permanent_url, RendererInterface $rendere return "document.getElementById($id).addEventListener('click', e => il.Footer.permalink.copyText($perm_url) .then(() => il.Footer.permalink.showTooltip(e.target.nextElementSibling, 5000)));"; }; - $button = $this->getUIFactory()->button()->shy($this->txt('copy_perma_link'), '')->withAdditionalOnLoadCode($code); + $button = $this->getUIFactory()->button()->standard($this->txt('copy_perma_link'), '')->withAdditionalOnLoadCode($code); $template->setVariable('PERMANENT', $renderer->render($button)); $template->setVariable('PERMANENT_TOOLTIP', $this->txt('perma_link_copied')); diff --git a/components/ILIAS/UI/tests/Component/MainControls/FooterTest.php b/components/ILIAS/UI/tests/Component/MainControls/FooterTest.php index 2529fb99a43b..4bc7129cbaab 100755 --- a/components/ILIAS/UI/tests/Component/MainControls/FooterTest.php +++ b/components/ILIAS/UI/tests/Component/MainControls/FooterTest.php @@ -30,6 +30,7 @@ class FooterTest extends ILIAS_UI_TestBase protected I\Link\Standard $link_mock; protected I\Symbol\Icon\Icon $icon_mock; protected I\Button\Shy $shy_mock; + protected I\Button\Standard $button_mock; protected I\Listing\Unordered $unordered_mock; protected I\Button\Factory $button_factory; protected I\Link\Factory $link_factory; @@ -38,6 +39,7 @@ class FooterTest extends ILIAS_UI_TestBase protected string $link_html; protected string $icon_html; protected string $shy_html; + protected string $button_html; protected string $unordered_html; protected function setUp(): void @@ -45,6 +47,7 @@ protected function setUp(): void $this->link_html = sha1(C\Link\Standard::class); $this->icon_html = sha1(C\Symbol\Icon\Icon::class); $this->shy_html = sha1(C\Button\Shy::class); + $this->button_html = sha1(C\Button\Standard::class); $this->unordered_html = sha1(C\Listing\Unordered::class); $this->link_mock = $this->createMock(I\Link\Standard::class); @@ -56,11 +59,15 @@ protected function setUp(): void $this->shy_mock = $this->createMock(I\Button\Shy::class); $this->shy_mock->method('getCanonicalName')->willReturn($this->shy_html); + $this->button_mock = $this->createMock(I\Button\Standard::class); + $this->button_mock->method('getCanonicalName')->willReturn($this->button_html); + $this->unordered_mock = $this->createMock(I\Listing\Unordered::class); $this->unordered_mock->method('getCanonicalName')->willReturn($this->unordered_html); $this->button_factory = $this->createMock(I\Button\Factory::class); $this->button_factory->method('shy')->willReturn($this->shy_mock); + $this->button_factory->method('standard')->willReturn($this->button_mock); $this->link_factory = $this->createMock(I\Link\Factory::class); $this->link_factory->method('standard')->willReturn($this->link_mock); @@ -99,10 +106,10 @@ public function testRenderWithPermanentUrl(): void $footer = $this->getUIFactory()->mainControls()->footer(); $footer = $footer->withPermanentURL($this->uri_mock); - $this->button_factory->expects($this->once())->method('shy')->with('copy_perma_link', ''); - $this->shy_mock->expects($this->once())->method('withAdditionalOnLoadCode')->willReturnSelf(); + $this->button_factory->expects($this->once())->method('standard')->with('copy_perma_link', ''); + $this->button_mock->expects($this->once())->method('withAdditionalOnLoadCode')->willReturnSelf(); - $renderer = $this->getDefaultRenderer(null, [$this->shy_mock]); + $renderer = $this->getDefaultRenderer(null, [$this->button_mock]); $actual_html = $renderer->render($footer); $expected_html = <<