From a54bf6c729efddecc52ab44690b5f013f1eae69f Mon Sep 17 00:00:00 2001 From: Fabian Schmid Date: Mon, 13 Apr 2026 16:07:25 +0200 Subject: [PATCH] [IMPR] Language handling for Components --- components/ILIAS/File/File.php | 7 + components/ILIAS/File/lang/ilias_de.lang | 115 +++++++++ components/ILIAS/File/lang/ilias_en.lang | 115 +++++++++ components/ILIAS/Language/Language.php | 18 +- .../classes/Setup/class.ilSetupLanguage.php | 236 ++++++++++-------- .../ComponentLanguageFileDirectory.php | 53 ++++ .../LanguageFileDirectory.php | 43 ++++ .../LanguageFileDirectoryManager.php | 88 +++++++ .../MainLanguageFileDirectory.php | 38 +++ lang/ilias_de.lang | 116 ++------- lang/ilias_en.lang | 96 +------ 11 files changed, 624 insertions(+), 301 deletions(-) create mode 100644 components/ILIAS/File/lang/ilias_de.lang create mode 100644 components/ILIAS/File/lang/ilias_en.lang create mode 100644 components/ILIAS/Language/src/ComponentTranslation/ComponentLanguageFileDirectory.php create mode 100644 components/ILIAS/Language/src/ComponentTranslation/LanguageFileDirectory.php create mode 100644 components/ILIAS/Language/src/ComponentTranslation/LanguageFileDirectoryManager.php create mode 100644 components/ILIAS/Language/src/ComponentTranslation/MainLanguageFileDirectory.php diff --git a/components/ILIAS/File/File.php b/components/ILIAS/File/File.php index 1ae7f0b6c4da..a6e1f4bacfd5 100644 --- a/components/ILIAS/File/File.php +++ b/components/ILIAS/File/File.php @@ -23,6 +23,8 @@ use ILIAS\Component\Component; use ILIAS\Setup\Agent; use ILIAS\Refinery\Factory; +use ILIAS\Language\ComponentTranslation\LanguageFileDirectory; +use ILIAS\Language\ComponentTranslation\ComponentLanguageFileDirectory; class File implements Component { @@ -40,5 +42,10 @@ public function init( new \ilFileObjectAgent( $pull[Factory::class] ); + + $contribute[LanguageFileDirectory::class] = fn(): LanguageFileDirectory => new ComponentLanguageFileDirectory( + $this, + 'file' + ); } } diff --git a/components/ILIAS/File/lang/ilias_de.lang b/components/ILIAS/File/lang/ilias_de.lang new file mode 100644 index 000000000000..b1f7972e012e --- /dev/null +++ b/components/ILIAS/File/lang/ilias_de.lang @@ -0,0 +1,115 @@ +/** +* This file is part of ILIAS, a powerful learning management system +* published by ILIAS open source e-Learning e.V. +* +* ILIAS is licensed with the GPL-3.0, +* see https://www.gnu.org/licenses/gpl-3.0.en.html +* You should have received a copy of said license along with the +* source code, too. +* +* If this is not the case or you just want to try ILIAS, you'll find +* us at: +* https://www.ilias.de +* https://github.com/ILIAS-eLearning +* +******************************************************************** +*/ +/** +* ILIAS language file +* +* @module language file German +* @modulegroup language +* @author Matthias Kunkel +* @version $Id$ +*/ +// 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 + +add_icon#:#Icon hinzufügen +amount_of_downloads#:#Downloads +amount_of_downloads_since#:#%d seit %s +copyright_custom#:#Benutzerdefiniert +copyright_custom_info#:#Lizenz auswählen, welche auf alle entpackten Dateien dieses Archivs angewandt wird. +copyright_inherited#:#Vererbt +copyright_inherited_info#:#Lizenz des Zip-Archivs auf seine entpackten Dateien anwenden.
Lizenz des Zip-Archivs: %s. +could_not_create_file_objs#:#Beim Erstellen der Dateiobjekte ist ein Fehler aufgetreten, wenden Sie sich an die Administrierenden der Plattform. +de_activate_icon#:#(De-)Aktivieren +download_ascii_filename#:#Nur ASCII-Zeichen im Download +download_ascii_filename_info#:#Die Namen heruntergeladener Dateien enthalten nur ASCII-Zeichen und können so auf allen Systemen problemlos genutzt werden. Andere Zeichen werden durch Unterstriche ersetzt. Auf Installationen, die Dateinamen mit nicht-lateinischen Schriftzeichen nutzen, muss diese Option deaktiviert werden. +file_action_download#:#Datei herunterladen oder Inhalt anzeigen +file_action_download_info#:#Wenn WOPI aktiviert ist und die Berechtigung „Inhalt anzeigen“ erteilt wurde, wird die Datei auf der Registerkarte „Inhalt“ angezeigt. Wenn nicht, wird die Datei zum direkten Download angeboten. +file_action_show#:#Zunächst Reiter „Info“ anzeigen +file_action_show_info#:#Der Reiter „Info“ wird angezeigt, wo die Datei in einem zweiten Schritt heruntergeladen werden kann. +file_btn_lp_toggle_state_completed#:#Auf „Nicht bearbeitet“ setzen +file_btn_lp_toggle_state_not_completed#:#Auf „Bearbeitet“ setzen +file_copy#:#Datei kopieren +file_download#:#Datei herunterladen +file_import#:#Dateiimport +file_new_version#:#Neue Version anlegen +file_new_version_info#:#Eine neue Dateiversion anlegen. Alte Versionen bleiben erhalten. +file_publish#:#Entwurf veröffentlichen +file_rollback_rollback_first#:#Die Version konnte nicht zurückgesetzt werden, weil ein unveröffentlichter Entwurf existiert. +file_rollback_same_version#:#Dies ist bereits die veröffentlichte Version +file_unpublish#:#Als Entwurf markieren +file_upload_info_file_with_critical_extension#:#Mindestens eine Datei enthält eine kritische oder unbekannte Dateiendung. Die Dateiendung wird bei jedem Download zu .sec geändert. Bitte kontaktieren Sie gegebenenfalls Ihre technische Betreuung. Dateiname(n): %s +file_uploaded_by#:#Hochgeladen von +file_version_draft#:#Entwurf +file_version_draft_info#:#Die aktuellste Version ist im Status „Entwurf“. Solange diese Version nicht veröffentlicht wurde, können keine neuen Versionen angelegt werden. Personen mit Leserecht auf die Datei erhalten die aktuell veröffentlichte Version. +form_icon_creation#:#Icon erstellen +form_icon_updating#:#Icon aktualisieren +general_upload_error_occured#:#Beim Verarbeiten der Datei ist ein unerwartetet Fehler aufgetreten. +important_info#:#Wichtige Informationen +important_info_byline#:#Die Angaben werden im Reiter „Info“ angezeigt. +input_active#:#Aktiv +input_desc_active#:#Dieses Icon aktivieren. +input_desc_icon#:#Bild welches als Icon für Dateien mit den spezifizierten Suffixen verwendet werden soll. +input_desc_suffixes#:#Liste Komma-separierter Suffixe (Nur Buchstaben und Zahlen ohne vorangehenden Punkt). +input_icon#:#Icon +input_suffixes#:#Suffix(e) +migrated#:#Status +mime_type#:#MIME-Type +msg_cant_unpublish#:#Aktion konnte nicht ausgeführt werden +msg_confirm_entry_deletion#:#Wollen Sie den nachfolgenden Eintrag wirklich löschen?: +msg_error_active_suffixes_blacklisted#:#Eine der gewählten Dateiendungen ist auf der globalen Blacklist und kann derzeit nicht genutzt werden. +msg_error_active_suffixes_conflict#:#Fehler: Es dürfen nicht mehrere Icons für ein Suffix aktiv sein. Bitte deaktivieren Sie entweder dieses Icon oder das andere aktivierte Icon, dessen Suffixe sich mit jenen dieses Icons überschneiden. +msg_error_active_suffixes_not_whitelisted#:#Die gewählte Dateiendung ist nicht auf der globalen Whitelist, beim Download werden die Dateine zu .sec. umbenannt. +msg_error_duplicate_suffix_entries#:#Fehler: Die Komma-separierte Suffix-Liste enthält Duplikate. +msg_error_icon_deletion#:#Fehler: Icon Löschung fehlgeschlagen. +msg_error_suffixes_with_forbidden_characters#:#Fehler: unerlaubte Zeichen. Nur Buchstaben, Nummern, Leerzeichen und Kommas sind erlaubt. +msg_icon_missing_from_db#:#Icon ist nicht in der Datenbank. +msg_icon_missing_from_irss#:#Icon ist nicht im Resource Storage. +msg_success_icon_activated#:#Icon erfolgreich aktiviert. +msg_success_icon_created#:#Icon erfolgreich erstellt. +msg_success_icon_deactivated#:#Icon erfolgreich deaktiviert. +msg_success_icon_deletion#:#Icon erfolgreich gelöscht. +msg_success_icon_updated#:#Icon erfolgreich aktualisiert. +msg_unzip_success#:#Archiv wurde erfolreich entpackt. +on_click_action#:#Klick auf Titel +preview_caption#:#Vorschau %svon %s +preview_image_size_info#:#Die Vorschauversionen der Bilder werden je nach Bedarf verkleinert oder vergrößert, so dass ihre längste Seite der hier eingegebenen Länge (in px) entspricht. +preview_persisting#:#Vorschaubilder speichern +preview_persisting_info#:#Vorschaubilder werden generiert und gespeichert. Sie müssen nicht mehr bei jedem Aufruf neu erzeugt werden. Das verbessert die Performanz. +previews_for_tiles#:#Kachelbilder +previews_for_tiles_info#:#Verwende Vorschaubilder für Kacheln. +publish_before_delete#:#Version(en) konnte(n) nicht gelöscht werden, da ein noch unveröffentlichter Entwurf existiert. +replace_file_info#:#Alle früheren Dateiversionen werden gelöscht. +resource_id#:#Ressourcen ID +service_settings#:#Weitere Funktionen +service_settings_saved#:#Gespeichert +set_license_for_all_files#:#Lizenz für alle Dateien festlegen +show_amount_of_downloads#:#Anzahl Downloads anzeigen +show_amount_of_downloads_info#:#Die Anzahl der Downloads wird im Reiter „Info“ des Dateiobjekts angezeigt. +storage_id#:#Storage ID +suffix_specific_icons#:#Suffix-spezifische Icons +suffixes#:#Suffix(e) +upload_files#:#Dateien hochladen +upload_files_limit#:#Die maximale Größe einer Datei beträgt %s. +upload_files_title#:#Dateien hochladen +upload_info#:#Datei +upload_info_desc#:#Sie können die Dateien und die Dateiversionen im Tab "Versionen" verwalten. +version_uploaded#:#Version hochgeladen am +versionname#:#Angezeigter Titel diff --git a/components/ILIAS/File/lang/ilias_en.lang b/components/ILIAS/File/lang/ilias_en.lang new file mode 100644 index 000000000000..ac9f57e3ef19 --- /dev/null +++ b/components/ILIAS/File/lang/ilias_en.lang @@ -0,0 +1,115 @@ +/** +* This file is part of ILIAS, a powerful learning management system +* published by ILIAS open source e-Learning e.V. +* +* ILIAS is licensed with the GPL-3.0, +* see https://www.gnu.org/licenses/gpl-3.0.en.html +* You should have received a copy of said license along with the +* source code, too. +* +* If this is not the case or you just want to try ILIAS, you'll find +* us at: +* https://www.ilias.de +* https://github.com/ILIAS-eLearning +* +******************************************************************** +*/ +/** +* ILIAS language file +* +* @module language file English +* @modulegroup language +* @author Matthias Kunkel , Chris Potter +* @version $Id$ +*/ +// 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 + +add_icon#:#Add Icon +amount_of_downloads#:#Downloads +amount_of_downloads_since#:#%d times since %s +copyright_custom#:#Custom +copyright_custom_info#:#Choose a custom copyright which will be applied to all unzipped files of this archive. +copyright_inherited#:#Inherited +copyright_inherited_info#:#Apply the copyright of the zip archive to its unzipped files.
Copyright of zip archive: %s. +could_not_create_file_objs#:#An error occurred while creating your file objects. Please contact the administrators of this platform. +de_activate_icon#:#Activate / Deactivate +download_ascii_filename#:#Allow Only ASCII Characters in Downloaded Filenames +download_ascii_filename_info#:#Downloaded files should only have ASCII-characters in their filename. Deactivate to use all characters. +file_action_download#:#Download file or view content +file_action_download_info#:#If WOPI is activated and the permission 'View Content' is given, the file is shown in tab 'Content'. If not, the file will be offered for direct download. +file_action_show#:#Redirect user to the file’s ‘Info’ tab +file_action_show_info#:#The 'Info' tab is shown where the file could be downloaded in a second step. +file_btn_lp_toggle_state_completed#:#Set Not Completed +file_btn_lp_toggle_state_not_completed#:#Set Completed +file_copy#:#Copy File +file_download#:#Download File +file_import#:#Import File +file_new_version#:#Create New Version +file_new_version_info#:#Create new file version. Previous versions will not be modified. +file_publish#:#Publish Draft +file_rollback_rollback_first#:#The selected version could not be published because an unpublished draft exists. +file_rollback_same_version#:#This is already the published version! +file_unpublish#:#Mark as Draft +file_upload_info_file_with_critical_extension#:#At least one uploaded file contains a critical or unknown file ending. Whenever the file is downloaded, its ending will be changed to ‘.sec’. If necessary, contact your administrator. Filename(s): %s +file_uploaded_by#:#Uploaded By +file_version_draft#:#Draft Version +file_version_draft_info#:#The latest version of this file has the status ‘Draft’. As long as this version has not been published, no new versions can be created. People with read permission for the file get the most recent previously published version. +form_icon_creation#:#Create Icon +form_icon_updating#:#Update Icon +general_upload_error_occured#:#An unexpected error occurred during upload. +important_info#:#Important Information +important_info_byline#:#The information will be displayed in the ‘Info’ tab. +input_active#:#Active +input_desc_active#:#Activate this icon. +input_desc_icon#:#Image to be used as the icon for files with the specified suffixes. +input_desc_suffixes#:#List of comma-separated suffixes (characters and numbers only, without preceding full stop). +input_icon#:#Icon +input_suffixes#:#Suffix(es) +migrated#:#Status +mime_type#:#MIME Type +msg_cant_unpublish#:#File could not be unpublished. +msg_confirm_entry_deletion#:#Are you sure you want to delete the following entry?: +msg_error_active_suffixes_blacklisted#:#One of the selected file extensions is on the global blacklist and cannot therefore be currently used. +msg_error_active_suffixes_conflict#:#Error: It is not possible to have multiple icons activated for the same suffix. Please deactivate either this icon or the other activated icon whose suffixes overlap with those of this icon. +msg_error_active_suffixes_not_whitelisted#:#The selected file extension is not on the global whitelist. The file suffixes will be changed to ‘.sec’ when downloaded. +msg_error_duplicate_suffix_entries#:#Error: the comma separated list of suffixes contains duplicate entries. +msg_error_icon_deletion#:#Error: icon deletion failed. +msg_error_suffixes_with_forbidden_characters#:#Error: forbidden characters. Only letters, numbers, spaces and commas are allowed. +msg_icon_missing_from_db#:#Icon missing from database. +msg_icon_missing_from_irss#:#Icon missing from resource storage. +msg_success_icon_activated#:#Icon successfully activated. +msg_success_icon_created#:#Icon successfully created. +msg_success_icon_deactivated#:#Icon successfully deactivated. +msg_success_icon_deletion#:#Icon successfully deleted. +msg_success_icon_updated#:#Icon successfully updated. +msg_unzip_success#:#Archive successfully unzipped. +on_click_action#:#Action When Title Clicked +preview_caption#:#Preview %sof %s +preview_image_size_info#:#The preview versions of images will be downscaled or upscaled as appropriate, so that their longest side is the length (in px) entered here. +preview_persisting#:#Persistent Preview Images +preview_persisting_info#:#Generated preview images will be stored by ILIAS and used from then on each time the preview icon for that file is clicked on. If deactivated, previews will be generated anew each time. +previews_for_tiles#:#Tiles +previews_for_tiles_info#:#Use Preview for Tiles where possible. +publish_before_delete#:#It was not possible to delete any of the existing versions because an unpublished draft exists. +replace_file_info#:#All previous file versions will be deleted. +resource_id#:#Resource ID +service_settings#:#Additional Features +service_settings_saved#:#Changes saved. +set_license_for_all_files#:#Set License for All Files +show_amount_of_downloads#:#Show Number of Downloads +show_amount_of_downloads_info#:#Display the number of times a file object has been downloaded on its 'Info' page. +storage_id#:#Storage ID +suffix_specific_icons#:#Suffix-Specific Icons +suffixes#:#Suffix(es) +upload_files#:#Upload Files +upload_files_limit#:#The maximum file size allowed is %s. +upload_files_title#:#Upload Files +upload_info#:#File +upload_info_desc#:#Uploads and versions can be managed in the ‘Versions’ tab. +version_uploaded#:#Version Uploaded +versionname#:#Title diff --git a/components/ILIAS/Language/Language.php b/components/ILIAS/Language/Language.php index 2cbc888fc36a..2c1ec8641867 100644 --- a/components/ILIAS/Language/Language.php +++ b/components/ILIAS/Language/Language.php @@ -19,6 +19,9 @@ declare(strict_types=1); namespace ILIAS; +use ILIAS\Language\ComponentTranslation\LanguageFileDirectoryManager; +use ILIAS\Language\ComponentTranslation\LanguageFileDirectory; +use ILIAS\Language\ComponentTranslation\MainLanguageFileDirectory; class Language implements Component\Component { @@ -33,6 +36,7 @@ public function init( array | \ArrayAccess &$internal, ): void { $define[] = \ILIAS\Language\Language::class; + $contribute[LanguageFileDirectory::class] = static fn()=> new MainLanguageFileDirectory(); $implement[\ILIAS\Language\Language::class] = static fn() => $internal[\ilSetupLanguage::class]; @@ -46,11 +50,21 @@ public function init( $internal[\ilSetupLanguage::class] ); + $internal[LanguageFileDirectoryManager::class] = static fn() => + new LanguageFileDirectoryManager( + ...$seek[LanguageFileDirectory::class] + ); + $internal[\ilSetupLanguage::class] = static fn() => - new \ilSetupLanguage("en"); + new \ilSetupLanguage( + "en", + $internal[LanguageFileDirectoryManager::class] + ); $internal[\ilLanguage::class] = static fn() => - new Language\LanguageLegacyInitialisationAdapter(); + new Language\LanguageLegacyInitialisationAdapter( + $internal[LanguageFileDirectoryManager::class] + ); $contribute[User\Settings\UserSettings::class] = fn() => new Language\UserSettings\Settings(); diff --git a/components/ILIAS/Language/classes/Setup/class.ilSetupLanguage.php b/components/ILIAS/Language/classes/Setup/class.ilSetupLanguage.php index 89b7e55efa37..1d252ac97eaa 100755 --- a/components/ILIAS/Language/classes/Setup/class.ilSetupLanguage.php +++ b/components/ILIAS/Language/classes/Setup/class.ilSetupLanguage.php @@ -18,6 +18,9 @@ declare(strict_types=1); +use ILIAS\Language\ComponentTranslation\LanguageFileDirectoryManager; +use ILIAS\Language\ComponentTranslation\ComponentLanguageFileDirectory; + /** * language handling for setup * @@ -41,19 +44,21 @@ */ class ilSetupLanguage extends ilLanguage { + private string $absolute_path; public array $text; public string $lang_default = "en"; - public string $lang_path; public string $lang_key; public string $separator = "#:#"; public string $comment_separator = "###"; protected ilDBInterface $db; - public function __construct(string $a_lang_key) + public function __construct( + string $a_lang_key, + private LanguageFileDirectoryManager $language_file_directory_manager, + ) { $this->lang_key = $a_lang_key ?: $this->lang_default; - $il_absolute_path = realpath(__DIR__ . "/../../../../../"); - $this->lang_path = $il_absolute_path . "/lang"; + $this->absolute_path = realpath(__DIR__ . "/../../../../../"); $this->cust_lang_path = $il_absolute_path . "/lang/customizing"; } @@ -270,7 +275,7 @@ protected function checkLanguage(string $a_lang_key, string $scope = ""): bool } } - $path = $this->lang_path; + $path = 'lang/'; // TODO this must be chnaged when we switch to full Component-dased language files if ($scope === "local") { $path = $this->cust_lang_path; } @@ -423,130 +428,143 @@ protected function insertLanguage(string $lang_key, string $scope = ""): void } } - $path = $this->lang_path; - if ($scope === "local") { - $path = $this->cust_lang_path; - } + foreach ($this->language_file_directory_manager->getDirectories() as $directory) { + $this->lang_path = rtrim($this->absolute_path, '/') . '/' . ltrim($directory->getPath(), '/'); - $tmpPath = getcwd(); - chdir($path); + $path = $this->lang_path; + if ($scope === "local") { // TODO: Move this to another implementation of \ILIAS\Language\ComponentTranslation\LanguageFileDirectory + $path = $this->cust_lang_path; + } - $lang_file = "ilias_" . $lang_key . ".lang" . $scopeExtension; - $change_date = null; - - if (is_file($lang_file)) { - // initialize the array for updating lng_modules below - $lang_array = []; - $lang_array["common"] = []; - - // remove header first - if ($content = $this->cut_header(file($lang_file))) { - // get the local changes from the database - if (empty($scope)) { - $local_changes = $this->getLocalChanges($lang_key); - } elseif ($scope === "local") { - // set the change date to import time for a local file - // get the modification date of the local file - // get the newer local changes for a local file - $change_date = gmdate("Y-m-d H:i:s", time()); - $min_date = gmdate("Y-m-d H:i:s", filemtime($lang_file)); - $local_changes = $this->getLocalChanges($lang_key, $min_date); - } + $tmpPath = getcwd(); + chdir($path); + + $lang_file = "ilias_" . $lang_key . ".lang" . $scopeExtension; + $change_date = null; + + if (is_file($lang_file)) { + // initialize the array for updating lng_modules below + $lang_array = []; + $lang_array["common"] = []; - $query_check = false; - $query = "INSERT INTO lng_data (module,identifier,lang_key,value,local_change,remarks) VALUES "; - foreach ($content as $key => $val) { - // split the line of the language file - // [0]: module - // [1]: identifier - // [2]: value - // [3]: comment (optional) - $separated = explode($this->separator, trim($val)); - - //get position of the comment_separator - $pos = strpos($separated[2], $this->comment_separator); - - if ($pos !== false) { - //cut comment of - $separated[2] = substr($separated[2], 0, $pos); + // remove header first + if ($content = $this->cut_header(file($lang_file))) { + // get the local changes from the database + if (empty($scope)) { + $local_changes = $this->getLocalChanges($lang_key); + } elseif ($scope === "local") { + // set the change date to import time for a local file + // get the modification date of the local file + // get the newer local changes for a local file + $change_date = gmdate("Y-m-d H:i:s", time()); + $min_date = gmdate("Y-m-d H:i:s", filemtime($lang_file)); + $local_changes = $this->getLocalChanges($lang_key, $min_date); } - // check if the value has a local change - if (isset($local_changes[$separated[0]])) { - $local_value = $local_changes[$separated[0]][$separated[1]] ?? ""; - } else { - $local_value = ""; + $query_check = false; + $query = "INSERT INTO lng_data (module,identifier,lang_key,value,local_change,remarks) VALUES "; + $prefix = $directory->getPrefix(); + foreach ($content as $key => $val) { + // split the line of the language file + // [0]: module + // [1]: identifier + // [2]: value + // [3]: comment (optional) + $separated = explode($this->separator, trim($val)); + + if (!empty($prefix)) { + // preprend $directory->getPrefix() as first element of the array + array_unshift($separated, $prefix); + } + + + //get position of the comment_separator + $pos = strpos($separated[2], $this->comment_separator); + + if ($pos !== false) { + //cut comment of + $separated[2] = substr($separated[2], 0, $pos); + } + + // check if the value has a local change + if (isset($local_changes[$separated[0]])) { + $local_value = $local_changes[$separated[0]][$separated[1]] ?? ""; + } else { + $local_value = ""; + } + + if (empty($scope)) { + if ($local_value !== "" && $local_value !== $separated[2]) { + // keep the locally changed value + $lang_array[$separated[0]][$separated[1]] = $local_value; + continue; + } + } elseif ($scope === "local") { + if ($local_value !== "") { + // keep a locally changed value that is newer than the local file + $lang_array[$separated[0]][$separated[1]] = $local_value; + continue; + } + } + + $query .= sprintf( + "(%s,%s,%s,%s,%s,%s),", + $ilDB->quote($separated[0], "text"), + $ilDB->quote($separated[1], "text"), + $ilDB->quote($lang_key, "text"), + $ilDB->quote($separated[2], "text"), + $ilDB->quote($change_date, "timestamp"), + $ilDB->quote($separated[3] ?? null, "text") + ); + $query_check = true; + $lang_array[$separated[0]][$separated[1]] = $separated[2]; } + $query = rtrim($query, ",") . " ON DUPLICATE KEY UPDATE value=VALUES(value),remarks=VALUES(remarks);"; + if ($query_check) { + $ilDB->manipulate($query); + } + } - if (empty($scope)) { - if ($local_value !== "" && $local_value !== $separated[2]) { - // keep the locally changed value - $lang_array[$separated[0]][$separated[1]] = $local_value; + $query = "INSERT INTO lng_modules (module, lang_key, lang_array) VALUES "; + $modules_to_delete = []; + foreach ($lang_array as $module => $lang_arr) { + if ($scope === "local") { + $q = "SELECT * FROM lng_modules WHERE " . + " lang_key = " . $ilDB->quote($lang_key, "text") . + " AND module = " . $ilDB->quote($module, "text"); + $set = $ilDB->query($q); + $row = $ilDB->fetchAssoc($set); + if ($row === null) { continue; } - } elseif ($scope === "local") { - if ($local_value !== "") { - // keep a locally changed value that is newer than the local file - $lang_array[$separated[0]][$separated[1]] = $local_value; - continue; + $arr2 = unserialize($row["lang_array"], ["allowed_classes" => false]); + if (is_array($arr2)) { + $lang_arr = array_merge($arr2, $lang_arr); } } - $query .= sprintf( - "(%s,%s,%s,%s,%s,%s),", - $ilDB->quote($separated[0], "text"), - $ilDB->quote($separated[1], "text"), + "(%s,%s,%s),", + $ilDB->quote($module, "text"), $ilDB->quote($lang_key, "text"), - $ilDB->quote($separated[2], "text"), - $ilDB->quote($change_date, "timestamp"), - $ilDB->quote($separated[3] ?? null, "text") + $ilDB->quote(serialize($lang_arr), "clob"), ); - $query_check = true; - $lang_array[$separated[0]][$separated[1]] = $separated[2]; + $modules_to_delete[] = $module; } - $query = rtrim($query, ",") . " ON DUPLICATE KEY UPDATE value=VALUES(value),remarks=VALUES(remarks);"; - if ($query_check) { - $ilDB->manipulate($query); - } - } - $query = "INSERT INTO lng_modules (module, lang_key, lang_array) VALUES "; - $modules_to_delete = []; - foreach ($lang_array as $module => $lang_arr) { - if ($scope === "local") { - $q = "SELECT * FROM lng_modules WHERE " . - " lang_key = " . $ilDB->quote($lang_key, "text") . - " AND module = " . $ilDB->quote($module, "text"); - $set = $ilDB->query($q); - $row = $ilDB->fetchAssoc($set); - if ($row === null) { - continue; - } - $arr2 = unserialize($row["lang_array"], ["allowed_classes" => false]); - if (is_array($arr2)) { - $lang_arr = array_merge($arr2, $lang_arr); - } - } - $query .= sprintf( - "(%s,%s,%s),", - $ilDB->quote($module, "text"), - $ilDB->quote($lang_key, "text"), - $ilDB->quote(serialize($lang_arr), "clob"), - ); - $modules_to_delete[] = $module; - } + $inModulesToDelete = $ilDB->in('module', $modules_to_delete, false, 'text'); + $ilDB->manipulate(sprintf( + "DELETE FROM lng_modules WHERE lang_key = %s AND $inModulesToDelete", + $ilDB->quote($lang_key, "text") + )); - $inModulesToDelete = $ilDB->in('module', $modules_to_delete, false, 'text'); - $ilDB->manipulate(sprintf( - "DELETE FROM lng_modules WHERE lang_key = %s AND $inModulesToDelete", - $ilDB->quote($lang_key, "text") - )); + $query = rtrim($query, ",") . ";"; + $ilDB->manipulate($query); + } - $query = rtrim($query, ",") . ";"; - $ilDB->manipulate($query); + chdir($tmpPath); } - chdir($tmpPath); + } /** diff --git a/components/ILIAS/Language/src/ComponentTranslation/ComponentLanguageFileDirectory.php b/components/ILIAS/Language/src/ComponentTranslation/ComponentLanguageFileDirectory.php new file mode 100644 index 000000000000..0f5afd89933d --- /dev/null +++ b/components/ILIAS/Language/src/ComponentTranslation/ComponentLanguageFileDirectory.php @@ -0,0 +1,53 @@ + + */ +class ComponentLanguageFileDirectory implements LanguageFileDirectory +{ + + private string $base_directory; + + public function __construct( + private Component $component, + private string $prefix, + private string $path_inside_component = 'lang/' + ) { + } + + public function getPrefix(): string + { + return $this->prefix; + } + + public function getPath(): string + { + $reflector = new \ReflectionClass($this->component); + $ilias_base_dir = realpath(__DIR__ . '/../../../../../'); + $this->base_directory = str_replace($ilias_base_dir . '/', '', dirname($reflector->getFileName())); + + return $this->base_directory . '/' . $this->path_inside_component; + } +} diff --git a/components/ILIAS/Language/src/ComponentTranslation/LanguageFileDirectory.php b/components/ILIAS/Language/src/ComponentTranslation/LanguageFileDirectory.php new file mode 100644 index 000000000000..3d8e1ed13d27 --- /dev/null +++ b/components/ILIAS/Language/src/ComponentTranslation/LanguageFileDirectory.php @@ -0,0 +1,43 @@ + + */ +class LanguageFileDirectoryManager +{ + + /** + * @var LanguageFileDirectory[] + */ + private array $directories; + + public function __construct( + LanguageFileDirectory ...$directory + ) { + $this->directories = $directory; + $this->check(); + } + + private function check(): void + { + // Basic checks + $main_files = 0; + $prefixes = []; + foreach ($this->directories as $d) { + switch (true) { + case $d instanceof MainLanguageFileDirectory: + $main_files++; + if ($main_files > 1) { + throw new \InvalidArgumentException( + "There must not be more than one MainLanguageFileDirectory" + ); + } + break; + case $d instanceof ComponentLanguageFileDirectory: + if (empty($d->getPrefix())) { + throw new \InvalidArgumentException( + "ComponentLanguageFileDirectory must have a non-empty prefix" + ); + } + if (isset($prefixes[$d->getPrefix()])) { + throw new \InvalidArgumentException( + "There must not be two ComponentLanguageFileDirectory with the same prefix" + ); + } + $prefixes[$d->getPrefix()] = true; + break; + default: + if (empty($d->getPrefix())) { + throw new \InvalidArgumentException("LanguageFileDirectory must have a non-empty prefix"); + } + break; + } + } + } + + /** + * @return \Generator|LanguageFileDirectory[] + */ + public function getDirectories(): \Generator + { + yield from $this->directories; + } +} diff --git a/components/ILIAS/Language/src/ComponentTranslation/MainLanguageFileDirectory.php b/components/ILIAS/Language/src/ComponentTranslation/MainLanguageFileDirectory.php new file mode 100644 index 000000000000..c99cc1f0a8ac --- /dev/null +++ b/components/ILIAS/Language/src/ComponentTranslation/MainLanguageFileDirectory.php @@ -0,0 +1,38 @@ + + */ +class MainLanguageFileDirectory implements LanguageFileDirectory +{ + public function getPrefix(): string + { + return ''; // the files already contain the prefixes. This special case is handled inside ilSetupLanguage + } + + public function getPath(): string + { + return 'lang/'; + } +} diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index 37b31817324b..6d15f52190ee 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -9824,90 +9824,6 @@ export#:#export_resource#:#Ressource export#:#export_save_selection#:#Export starten export#:#export_select_resources#:#Objekte auswählen export#:#no_file#:#Keine Datei -file#:#add_icon#:#Icon hinzufügen -file#:#amount_of_downloads#:#Downloads -file#:#amount_of_downloads_since#:#%d seit %s -file#:#copyright_custom#:#Benutzerdefiniert -file#:#copyright_custom_info#:#Lizenz auswählen, welche auf alle entpackten Dateien dieses Archivs angewandt wird. -file#:#copyright_inherited#:#Vererbt -file#:#copyright_inherited_info#:#Lizenz des Zip-Archivs auf seine entpackten Dateien anwenden.
Lizenz des Zip-Archivs: %s. -file#:#could_not_create_file_objs#:#Beim Erstellen der Dateiobjekte ist ein Fehler aufgetreten, wenden Sie sich an die Administrierenden der Plattform. -file#:#de_activate_icon#:#(De-)Aktivieren -file#:#download_ascii_filename#:#Nur ASCII-Zeichen im Download -file#:#download_ascii_filename_info#:#Die Namen heruntergeladener Dateien enthalten nur ASCII-Zeichen und können so auf allen Systemen problemlos genutzt werden. Andere Zeichen werden durch Unterstriche ersetzt. Auf Installationen, die Dateinamen mit nicht-lateinischen Schriftzeichen nutzen, muss diese Option deaktiviert werden. -file#:#file_action_download#:#Datei herunterladen oder Inhalt anzeigen -file#:#file_action_download_info#:#Wenn WOPI aktiviert ist und die Berechtigung „Inhalt anzeigen“ erteilt wurde, wird die Datei auf der Registerkarte „Inhalt“ angezeigt. Wenn nicht, wird die Datei zum direkten Download angeboten. -file#:#file_action_show#:#Zunächst Reiter „Info“ anzeigen -file#:#file_action_show_info#:#Der Reiter „Info“ wird angezeigt, wo die Datei in einem zweiten Schritt heruntergeladen werden kann. -file#:#file_btn_lp_toggle_state_completed#:#Auf „Nicht bearbeitet“ setzen -file#:#file_btn_lp_toggle_state_not_completed#:#Auf „Bearbeitet“ setzen -file#:#file_copy#:#Datei kopieren -file#:#file_download#:#Datei herunterladen -file#:#file_import#:#Dateiimport -file#:#file_new_version#:#Neue Version anlegen -file#:#file_new_version_info#:#Eine neue Dateiversion anlegen. Alte Versionen bleiben erhalten. -file#:#file_publish#:#Entwurf veröffentlichen -file#:#file_rollback_rollback_first#:#Die Version konnte nicht zurückgesetzt werden, weil ein unveröffentlichter Entwurf existiert. -file#:#file_rollback_same_version#:#Dies ist bereits die veröffentlichte Version -file#:#file_unpublish#:#Als Entwurf markieren -file#:#file_upload_info_file_with_critical_extension#:#Mindestens eine Datei enthält eine kritische oder unbekannte Dateiendung. Die Dateiendung wird bei jedem Download zu .sec geändert. Bitte kontaktieren Sie gegebenenfalls Ihre technische Betreuung. Dateiname(n): %s -file#:#file_uploaded_by#:#Hochgeladen von -file#:#file_version_draft#:#Entwurf -file#:#file_version_draft_info#:#Die aktuellste Version ist im Status „Entwurf“. Solange diese Version nicht veröffentlicht wurde, können keine neuen Versionen angelegt werden. Personen mit Leserecht auf die Datei erhalten die aktuell veröffentlichte Version. -file#:#form_icon_creation#:#Icon erstellen -file#:#form_icon_updating#:#Icon aktualisieren -file#:#general_upload_error_occured#:#Beim Verarbeiten der Datei ist ein unerwartetet Fehler aufgetreten. -file#:#important_info#:#Wichtige Informationen -file#:#important_info_byline#:#Die Angaben werden im Reiter „Info“ angezeigt. -file#:#input_active#:#Aktiv -file#:#input_desc_active#:#Dieses Icon aktivieren. -file#:#input_desc_icon#:#Bild welches als Icon für Dateien mit den spezifizierten Suffixen verwendet werden soll. -file#:#input_desc_suffixes#:#Liste Komma-separierter Suffixe (Nur Buchstaben und Zahlen ohne vorangehenden Punkt). -file#:#input_icon#:#Icon -file#:#input_suffixes#:#Suffix(e) -file#:#migrated#:#Status -file#:#mime_type#:#MIME-Type -file#:#msg_cant_unpublish#:#Aktion konnte nicht ausgeführt werden -file#:#msg_confirm_entry_deletion#:#Wollen Sie den nachfolgenden Eintrag wirklich löschen?: -file#:#msg_error_active_suffixes_blacklisted#:#Eine der gewählten Dateiendungen ist auf der globalen Blacklist und kann derzeit nicht genutzt werden. -file#:#msg_error_active_suffixes_conflict#:#Fehler: Es dürfen nicht mehrere Icons für ein Suffix aktiv sein. Bitte deaktivieren Sie entweder dieses Icon oder das andere aktivierte Icon, dessen Suffixe sich mit jenen dieses Icons überschneiden. -file#:#msg_error_active_suffixes_not_whitelisted#:#Die gewählte Dateiendung ist nicht auf der globalen Whitelist, beim Download werden die Dateine zu .sec. umbenannt. -file#:#msg_error_duplicate_suffix_entries#:#Fehler: Die Komma-separierte Suffix-Liste enthält Duplikate. -file#:#msg_error_icon_deletion#:#Fehler: Icon Löschung fehlgeschlagen. -file#:#msg_error_suffixes_with_forbidden_characters#:#Fehler: unerlaubte Zeichen. Nur Buchstaben, Nummern, Leerzeichen und Kommas sind erlaubt. -file#:#msg_icon_missing_from_db#:#Icon ist nicht in der Datenbank. -file#:#msg_icon_missing_from_irss#:#Icon ist nicht im Resource Storage. -file#:#msg_success_icon_activated#:#Icon erfolgreich aktiviert. -file#:#msg_success_icon_created#:#Icon erfolgreich erstellt. -file#:#msg_success_icon_deactivated#:#Icon erfolgreich deaktiviert. -file#:#msg_success_icon_deletion#:#Icon erfolgreich gelöscht. -file#:#msg_success_icon_updated#:#Icon erfolgreich aktualisiert. -file#:#msg_unzip_success#:#Archiv wurde erfolreich entpackt. -file#:#on_click_action#:#Klick auf Titel -file#:#preview_caption#:#Vorschau %svon %s -file#:#preview_image_size_info#:#Die Vorschauversionen der Bilder werden je nach Bedarf verkleinert oder vergrößert, so dass ihre längste Seite der hier eingegebenen Länge (in px) entspricht. -file#:#preview_persisting#:#Vorschaubilder speichern -file#:#preview_persisting_info#:#Vorschaubilder werden generiert und gespeichert. Sie müssen nicht mehr bei jedem Aufruf neu erzeugt werden. Das verbessert die Performanz. -file#:#previews_for_tiles#:#Kachelbilder -file#:#previews_for_tiles_info#:#Verwende Vorschaubilder für Kacheln. -file#:#publish_before_delete#:#Version(en) konnte(n) nicht gelöscht werden, da ein noch unveröffentlichter Entwurf existiert. -file#:#replace_file_info#:#Alle früheren Dateiversionen werden gelöscht. -file#:#resource_id#:#Ressourcen ID -file#:#service_settings#:#Weitere Funktionen -file#:#service_settings_saved#:#Gespeichert -file#:#set_license_for_all_files#:#Lizenz für alle Dateien festlegen -file#:#show_amount_of_downloads#:#Anzahl Downloads anzeigen -file#:#show_amount_of_downloads_info#:#Die Anzahl der Downloads wird im Reiter „Info“ des Dateiobjekts angezeigt. -file#:#storage_id#:#Storage ID -file#:#suffix_specific_icons#:#Suffix-spezifische Icons -file#:#suffixes#:#Suffix(e) -file#:#upload_files#:#Dateien hochladen -file#:#upload_files_limit#:#Die maximale Größe einer Datei beträgt %s. -file#:#upload_files_title#:#Dateien hochladen -file#:#upload_info#:#Datei -file#:#upload_info_desc#:#Sie können die Dateien und die Dateiversionen im Tab "Versionen" verwalten. -file#:#version_uploaded#:#Version hochgeladen am -file#:#versionname#:#Angezeigter Titel fils#:#add_upload_policy#:#Richtlinie hinzufügen fils#:#edit_upload_policy#:#Richtlinie bearbeiten fils#:#file_services#:#Datei-Services @@ -16500,7 +16416,7 @@ survey#:#concatenation#:#Verkettung survey#:#confirm_delete_all_user_data#:#Sind Sie sicher, dass Sie alle Datensätze und Ergebnisse der Umfrage löschen wollen? Dies wirkt sich sowohl auf die gegebenen Antworten als auch auf die Teilnahmeliste selbst aus. survey#:#confirm_delete_single_user_data#:#Sind Sie sicher, dass Sie die Datensätze und Antworten der ausgewählten Personen löschen wollen? Somit werden auch alle zugehörigen Daten gelöscht. survey#:#confirm_remove_heading#:#Sind Sie sicher, dass Sie die Überschrift entfernen wollen? -survey#:#confirm_sync_questions#:#Die geänderte Frage ist eine Kopie, welche für die Verwendung der aktuellen Umfrage erstellt wurde. Möchten Sie die Änderung ebenfalls auf die Ursprungsfrage anwenden? +survey#:#confirm_sync_questions#:#Die geänderte Frage ist eine Kopie, welche für die Verwendung der aktuellen Umfrage erstellt wurde. Möchten Sie die Änderung ebenfalls auf die Ursprungsfrage anwenden? survey#:#conjunction_and#:#wenn jede Bedingung erfüllt wird survey#:#conjunction_and_title#:#Jede der folgenden Bedingungen erfüllen survey#:#conjunction_or#:#wenn eine Bedingung erfüllt wird @@ -16509,7 +16425,7 @@ survey#:#constraint_add#:#Verzweigungsregel hinzufügen survey#:#constraint_fulfilled#:#Seite anzeigen survey#:#constraints#:#Verzweigungsregel survey#:#constraints_first_question_description#:#Der erste Eintrag kann keine Verzweigungsregel haben, da es keine vorherigen Einträge gibt. -survey#:#constraints_introduction#:#Verzweigungsregeln können für einzelne Fragen als auch für einen Fragenblock hinzugefügt werden. In Abhängigkeit der gegebenen Antwort, werden teilnehmenden Personen bestimmte Fragen angezeigt, sodass irrelevante Fragen übersprungen werden können. Für die erste Frage als auch für einen Fragenblock kann keine Verzweigungsregel festgelegt werden. +survey#:#constraints_introduction#:#Verzweigungsregeln können für einzelne Fragen als auch für einen Fragenblock hinzugefügt werden. In Abhängigkeit der gegebenen Antwort, werden teilnehmenden Personen bestimmte Fragen angezeigt, sodass irrelevante Fragen übersprungen werden können. Für die erste Frage als auch für einen Fragenblock kann keine Verzweigungsregel festgelegt werden. survey#:#constraints_list_of_entities#:#Fragen survey#:#constraints_no_nonessay_available#:#Es gibt keine vorangegangenen Fragen, die zur Erstellung von Verzweigungsregeln verwendet werden können. Folgende Fragetypen werden unterstützt: Metrische Frage, Single Choice Frage und Multiple Choice Frage. survey#:#constraints_no_questions_or_questionblocks_selected#:#Bitte wählen Sie mindestens eine Frage oder einen Fragenblock aus! @@ -16554,7 +16470,7 @@ survey#:#dc_yes#:#ja survey#:#default_codes_mail_message#:#Ihr Zugangscode für die Umfrage lautet [code]. Sie können die Umfrage jederzeit unter der folgenden URL [url] erreichen. survey#:#default_codes_mail_subject#:#Ihr Zugangscode für die Umfrage %s survey#:#define_questionblock#:#Fragenblock anlegen -survey#:#delete_saved_message#:#Textvorlage löschen +survey#:#delete_saved_message#:#Textvorlage löschen survey#:#display_all_available#:#Alle verfügbaren anzeigen survey#:#dont_use_questionpool#:#Fragen nicht in einen Fragenpool einfügen und nur für diese Umfrage verfügbar machen survey#:#duplicate#:#Kopieren @@ -16622,7 +16538,7 @@ survey#:#language_changed#:#Sprache geändert survey#:#layout#:#Layout survey#:#lower_limit#:#Untergrenze survey#:#mail_import_example2#:#heinrichfaust@pudelskern.de, Heinrich; Faust -survey#:#mail_import_example3#:#emiliagalotti@dramaitalien.de, Emilia; Galotti +survey#:#mail_import_example3#:#emiliagalotti@dramaitalien.de, Emilia; Galotti survey#:#mail_sent_short#:#Versendet survey#:#mail_survey_codes#:#Zugangsschlüssel und Nachrichten versenden survey#:#mailaddresses#:#Senden an @@ -16642,7 +16558,7 @@ survey#:#matrix_columns#:#Matrixspalten survey#:#matrix_left_pole#:#Linker Pol survey#:#matrix_neutral_answer#:#Text für eine neutrale Spalte ("Nicht definiert", "Ich weiß nicht", "Keine Angabe" etc.) survey#:#matrix_neutral_column_separator#:#Neutraler Spaltentrenner -survey#:#matrix_neutral_column_separator_description#:#Eine breite Linie (Trenner) zwischen der neutralen Spalte und den restlichen Spalten hinzufügen. +survey#:#matrix_neutral_column_separator_description#:#Eine breite Linie (Trenner) zwischen der neutralen Spalte und den restlichen Spalten hinzufügen. survey#:#matrix_question_checkbox_not_checked#:#Bitte wählen Sie mindestens ein Kontrollkästchen in jeder Zeile aus. survey#:#matrix_question_radio_button_not_checked#:#Bitte wählen Sie in jeder Zeile eine Antwortoption aus. survey#:#matrix_right_pole#:#Rechter Pol @@ -16721,7 +16637,7 @@ survey#:#questions#:#Fragen survey#:#questions_inserted#:#Frage(n) hinzugefügt. survey#:#questions_removed#:#Fragen und/oder Fragenblock entfernt! survey#:#questiontype#:#Fragetyp -survey#:#ratio_absolute#:#Verhältnis (absolut) +survey#:#ratio_absolute#:#Verhältnis (absolut) survey#:#ratio_non_absolute#:#Verhältnis (nicht absolut) survey#:#recipients#:#Senden an survey#:#remove_question#:#Entfernen @@ -16746,7 +16662,7 @@ survey#:#select_value#:#Wert festlegen survey#:#selection#:#Auswahl survey#:#send_to_all#:#Alle E-Mail-Adressen, die mit einem Zugangscode verknüpft sind. survey#:#send_to_answered#:#Alle Personen, welche die Umfrage bereits beendet haben -survey#:#send_to_unanswered#:#Alle E-Mail-Adressen, die mit einem Zugangscode verknüpft sind und deren zugehörige teilnehmende Personen die Umfrage noch nicht abgeschlossen haben. +survey#:#send_to_unanswered#:#Alle E-Mail-Adressen, die mit einem Zugangscode verknüpft sind und deren zugehörige teilnehmende Personen die Umfrage noch nicht abgeschlossen haben. survey#:#show_questiontext#:#Fragentexte anzeigen survey#:#show_questiontext_description#:#Zeigen Sie den Fragetext jeder Frage im Fragenblock an. Wenn dieses Kontrollkästchen nicht aktiviert ist, werden die Fragentexte ausgeblendet und nur die Antwortoptionen angezeigt. Dies kann nützlich sein, wenn Sie Fragen mit identischen Fragentexten innerhalb eines Fragenblocks haben. survey#:#skipped#:#Übersprungen @@ -16780,7 +16696,7 @@ survey#:#survey_360_appraisees#:#Feedback-Nehmer survey#:#survey_360_edit_raters#:#Feedback-Geber verwalten survey#:#survey_360_mode#:#360°-Feedback survey#:#survey_360_mode_info#:#Ermöglicht es Einzelpersonen, von mehreren Personen bewertet zu werden. Die Ergebnisse werden zusammengefasst. -survey#:#survey_360_no_appraisees#:#Zur Zeit benötigen keine Feedback-Nehmer Ihre Bewertung +survey#:#survey_360_no_appraisees#:#Zur Zeit benötigen keine Feedback-Nehmer Ihre Bewertung survey#:#survey_360_no_closed_appraisees#:#Es sind noch keine Umfragen geschlossen worden. survey#:#survey_360_rate_other_appraisee#:#Feedback geben survey#:#survey_360_rate_other_appraisees#:#Feedback geben @@ -16901,7 +16817,7 @@ survey#:#survey_reminder_subject#:#Umfrage „%s“ – Teilnahmeerinnerung survey#:#survey_remove_competence#:#Kompetenz entfernen survey#:#survey_results_anonymization#:#Datenschutz survey#:#survey_results_anonymized#:#Ohne Namen / Anonyme Umfrage -survey#:#survey_results_anonymized_info#:#Die Befragten bleiben anonym. Je nach globalen Einstellungen werden Namen entweder durch die Bezeichnung „Anonym“ oder durch individuelle Codes ersetzt. Bei der Verwendung werden in dem Reiter „Ergebnisse“ keine persönlichen Daten angegeben, sodass dort eine Zuordnung der Antworten zu Personen nicht möglich ist. +survey#:#survey_results_anonymized_info#:#Die Befragten bleiben anonym. Je nach globalen Einstellungen werden Namen entweder durch die Bezeichnung „Anonym“ oder durch individuelle Codes ersetzt. Bei der Verwendung werden in dem Reiter „Ergebnisse“ keine persönlichen Daten angegeben, sodass dort eine Zuordnung der Antworten zu Personen nicht möglich ist. survey#:#survey_results_finished#:#Umfrage beendet survey#:#survey_results_not_started#:#Umfrage nicht begonnen survey#:#survey_results_personalized#:#Mit Namen @@ -16974,7 +16890,7 @@ survey#:#svy_eval_view_tables#:#Tabelle survey#:#svy_eval_view_tables_charts#:#Tabelle und Diagramm survey#:#svy_evaluation_access_all_info#:#Alle registrierten Personen, die Zugriff auf die Umfrage haben, können die Ergebnisse einsehen. survey#:#svy_evaluation_access_off_info#:#Nur Personen mit dem Recht „Einstellungen bearbeiten“ haben Zugriff auf die Ergebnisse der Umfrage. -survey#:#svy_evaluation_access_participants_info#:#Alle Personen, welche die Umfrage abgeschlossen haben, können anschließend die Ergebnisse einsehen. +survey#:#svy_evaluation_access_participants_info#:#Alle Personen, welche die Umfrage abgeschlossen haben, können anschließend die Ergebnisse einsehen. survey#:#svy_export_files#:#Exportierte Dateien survey#:#svy_export_format#:#Ergebnisse der Umfrage exportieren survey#:#svy_export_pdf#:#PDF exportieren @@ -16998,11 +16914,11 @@ survey#:#svy_mail_context_reminder_survey_title#:#Umfragetitel survey#:#svy_mail_context_reminder_title#:#Umfrage: Teilnahme-Erinnerung survey#:#svy_mail_own_results#:#Eigene Antworten per E-Mail versenden survey#:#svy_mail_own_results_body#:#Sie haben an folgender Umfrage teilgenommen: -survey#:#svy_mail_own_results_subject#:#Umfrage „%s“ - Ihre Teilnahmebestätigung mit Antworten +survey#:#svy_mail_own_results_subject#:#Umfrage „%s“ - Ihre Teilnahmebestätigung mit Antworten survey#:#svy_mail_send_confirmation#:#Teilnahmebestätigung anfordern survey#:#svy_matrix_layout_percentages_sum_invalid#:#Die Prozentzahl der Spaltenaufteilung muss zusammen 100% ergeben. survey#:#svy_max_sum_score#:#Maximale Gesamtpunktzahl -survey#:#svy_neutral_answer#:#Text für eine neutrale Antwort („Nicht definiert", „Ich weiß nicht", „Keine Angabe" etc.) +survey#:#svy_neutral_answer#:#Text für eine neutrale Antwort („Nicht definiert", „Ich weiß nicht", „Keine Angabe" etc.) survey#:#svy_no_appraisees_found#:#Es besteht weiterhin die Möglichkeit für ausgewählte Personen Feedback abzugeben. Sobald die Umfrage geschlossen wird, können die Kompetenzen angezeigt werden. survey#:#svy_notification_tutor_results#:#Eine E-Mail mit den Umfrageergebnissen survey#:#svy_notification_tutor_results_alert#:#Diese Funktion erfordert ein Enddatum. @@ -17072,7 +16988,7 @@ survey#:#vertical#:#Vertikal survey#:#warning_question_not_complete#:#Die Frage ist unvollständig! survey#:#workingtime#:#Bearbeitungsdauer svy#:#survey_360_appraisees_remind_info#:#Wenn die Selbsteinschätzung aktiviert wurde, werden alle Feedback-Nehmer, welche die Umfrage noch nicht abgeschlossen haben, benachrichtigt. -svy#:#survey_360_raters_remind_info#:#Feedback-Geber, welche die Umfrage noch nicht abgeschlossen haben, erhalten eine Benachrichtigung. +svy#:#survey_360_raters_remind_info#:#Feedback-Geber, welche die Umfrage noch nicht abgeschlossen haben, erhalten eine Benachrichtigung. svy#:#svy_0_open_appraisees#:#Sie können die Umfrage für keinen Feedback-Nehmer mehr durchführen. svy#:#svy_all_pages#:#Alle Seiten svy#:#svy_all_participants#:#Alle Befragte @@ -17081,13 +16997,13 @@ svy#:#svy_code#:#Zugangscode svy#:#svy_codes#:#Zugangscodes svy#:#svy_current_page#:#Aktuelle Seite svy#:#svy_finish_survey#:#An Umfrage "%1" teilnehmen -svy#:#svy_finished_x_appraisees#:#Sie haben Bewertungen bereits für %s Feedback-Nehmer abgegeben. +svy#:#svy_finished_x_appraisees#:#Sie haben Bewertungen bereits für %s Feedback-Nehmer abgegeben. svy#:#svy_information#:#Information svy#:#svy_invite_participants#:#Personen hinzufügen svy#:#svy_link_to_svy#:#Link zur Umfrage svy#:#svy_part_overview#:#Übersicht svy#:#svy_placeholders_label#:#Verfügbare Platzhalter -svy#:#svy_print_selection#:#Inhalt der Druckansicht auswählen +svy#:#svy_print_selection#:#Inhalt der Druckansicht auswählen svy#:#svy_remove_all_participants#:#Alle Datensätze löschen svy#:#svy_remove_participants#:#Daten entfernen svy#:#svy_selected_participants#:#Ausgewählte Befragte @@ -18081,4 +17997,4 @@ wsp#:#wsp_type_ltiv#:#Zertifikat: LTI-Konsument wsp#:#wsp_type_scov#:#Zertifikat: SCORM wsp#:#wsp_type_tstv#:#Zertifikat: Test wsp#:#wsp_type_webr#:#Weblink -wsp#:#wsp_type_wfld#:#Ordner \ No newline at end of file +wsp#:#wsp_type_wfld#:#Ordner diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index 575808529257..52d49e775308 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -8685,7 +8685,7 @@ dcl#:#dcl_file_not_readable#:#The file could not be read. Please make sure that dcl#:#dcl_filter#:#Available in Filter dcl#:#dcl_filter_changeable#:#Filter Changeable dcl#:#dcl_formula#:#Formula -dcl#:#dcl_formula_desc#:#Similar to when using a spreadsheet, entries can be combined or calculated using a formula. +dcl#:#dcl_formula_desc#:#Similar to when using a spreadsheet, entries can be combined or calculated using a formula. dcl#:#dcl_formula_detail_desc#:#Entries in this field are generated automatically. You cannot enter or edit information in this field. dcl#:#dcl_height#:#Height in Pixels dcl#:#dcl_height_desc#:#The height of the file will be reduced to this value during upload. @@ -8734,7 +8734,7 @@ dcl#:#dcl_msg_table_edited#:#Table settings saved. dcl#:#dcl_msg_tableview_created#:#View created. dcl#:#dcl_msg_tableview_deleted#:#View deleted. dcl#:#dcl_msg_tableview_updated#:#View updated. -dcl#:#dcl_msg_tableviews_delete_all#:#Deletion not possible. There must be at least one view in existence. +dcl#:#dcl_msg_tableviews_delete_all#:#Deletion not possible. There must be at least one view in existence. dcl#:#dcl_multiple_selection#:#Multiple Selection dcl#:#dcl_new#:#Create New Data Collection dcl#:#dcl_new_entries#:#New Entries @@ -8771,7 +8771,7 @@ dcl#:#dcl_owner#:#Owner dcl#:#dcl_owner_description#:#The owner of the entry. dcl#:#dcl_owner_name#:#Owner (Name) dcl#:#dcl_page_type_dclf#:#Data Collection Detailed View -dcl#:#dcl_placeholder_info#:#In order for the data from the fields of this table to be shown in this detailed view, please enter the corresponding placeholders for those fields. Those placeholders are listed in the tool bars of the page elements 'Text' and 'Data Table'. +dcl#:#dcl_placeholder_info#:#In order for the data from the fields of this table to be shown in this detailed view, please enter the corresponding placeholders for those fields. Those placeholders are listed in the tool bars of the page elements 'Text' and 'Data Table'. dcl#:#dcl_please_select#:#--- Please select --- dcl#:#dcl_prop_expression#:#Expression dcl#:#dcl_prop_expression_info#:#Valid 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]])

Allowed fields (click on a title to use as a placeholder within the expression):
%s
(Allowed fields are checkbox, number, text and date that don’t contain any formula-sensitive characters inside their titles) @@ -8781,7 +8781,7 @@ dcl#:#dcl_record#:#Entry dcl#:#dcl_record_deleted#:#Entry deleted. dcl#:#dcl_record_settings#:#Entry Settings dcl#:#dcl_reference#:#Reference -dcl#:#dcl_reference_desc#:#A field which will display selected entries made in another field. This other field can be located in a different table. Changes made to the original entry will affect the version displayed in this field. +dcl#:#dcl_reference_desc#:#A field which will display selected entries made in another field. This other field can be located in a different table. Changes made to the original entry will affect the version displayed in this field. dcl#:#dcl_reference_link#:#Link Referenced Entry dcl#:#dcl_reference_link_info#:#Please note: You need to have set up and activated a ‘Detailed View’ template in the table in which the referenced entry is located. dcl#:#dcl_reference_title#:#Referenced Field @@ -8858,7 +8858,7 @@ dcl#:#dcl_wrong_regex#:#The text you entered does not fulfil the requirements of dcl#:#dcl_xls_async_export#:#as XLSX (asynchronous) dcl#:#disable_comments#:#Disable Comments dcl#:#disable_visible#:#Disable Visible -dcl#:#duplicate_entries_exist#:#Some of the existing values for this field are identical. Please make sure that all existing entries have unique values for this field in order to change this setting. +dcl#:#duplicate_entries_exist#:#Some of the existing values for this field are identical. Please make sure that all existing entries have unique values for this field in order to change this setting. dcl#:#enable_comments#:#Enable Comments dcl#:#enable_visible#:#Enable Visible dcl#:#entry_of#:#Entry %1$d of %2$d @@ -9798,90 +9798,6 @@ export#:#export_resource#:#Resource export#:#export_save_selection#:#Start Export export#:#export_select_resources#:#Select Resources export#:#no_file#:#No file -file#:#add_icon#:#Add Icon -file#:#amount_of_downloads#:#Downloads -file#:#amount_of_downloads_since#:#%d times since %s -file#:#copyright_custom#:#Custom -file#:#copyright_custom_info#:#Choose a custom copyright which will be applied to all unzipped files of this archive. -file#:#copyright_inherited#:#Inherited -file#:#copyright_inherited_info#:#Apply the copyright of the zip archive to its unzipped files.
Copyright of zip archive: %s. -file#:#could_not_create_file_objs#:#An error occurred while creating your file objects. Please contact the administrators of this platform. -file#:#de_activate_icon#:#Activate / Deactivate -file#:#download_ascii_filename#:#Allow Only ASCII Characters in Downloaded Filenames -file#:#download_ascii_filename_info#:#Downloaded files should only have ASCII-characters in their filename. Deactivate to use all characters. -file#:#file_action_download#:#Download file or view content -file#:#file_action_download_info#:#If WOPI is activated and the permission 'View Content' is given, the file is shown in tab 'Content'. If not, the file will be offered for direct download. -file#:#file_action_show#:#Redirect user to the file’s ‘Info’ tab -file#:#file_action_show_info#:#The 'Info' tab is shown where the file could be downloaded in a second step. -file#:#file_btn_lp_toggle_state_completed#:#Set Not Completed -file#:#file_btn_lp_toggle_state_not_completed#:#Set Completed -file#:#file_copy#:#Copy File -file#:#file_download#:#Download File -file#:#file_import#:#Import File -file#:#file_new_version#:#Create New Version -file#:#file_new_version_info#:#Create new file version. Previous versions will not be modified. -file#:#file_publish#:#Publish Draft -file#:#file_rollback_rollback_first#:#The selected version could not be published because an unpublished draft exists. -file#:#file_rollback_same_version#:#This is already the published version! -file#:#file_unpublish#:#Mark as Draft -file#:#file_upload_info_file_with_critical_extension#:#At least one uploaded file contains a critical or unknown file ending. Whenever the file is downloaded, its ending will be changed to ‘.sec’. If necessary, contact your administrator. Filename(s): %s -file#:#file_uploaded_by#:#Uploaded By -file#:#file_version_draft#:#Draft Version -file#:#file_version_draft_info#:#The latest version of this file has the status ‘Draft’. As long as this version has not been published, no new versions can be created. People with read permission for the file get the most recent previously published version. -file#:#form_icon_creation#:#Create Icon -file#:#form_icon_updating#:#Update Icon -file#:#general_upload_error_occured#:#An unexpected error occurred during upload. -file#:#important_info#:#Important Information -file#:#important_info_byline#:#The information will be displayed in the ‘Info’ tab. -file#:#input_active#:#Active -file#:#input_desc_active#:#Activate this icon. -file#:#input_desc_icon#:#Image to be used as the icon for files with the specified suffixes. -file#:#input_desc_suffixes#:#List of comma-separated suffixes (characters and numbers only, without preceding full stop). -file#:#input_icon#:#Icon -file#:#input_suffixes#:#Suffix(es) -file#:#migrated#:#Status -file#:#mime_type#:#MIME Type -file#:#msg_cant_unpublish#:#File could not be unpublished. -file#:#msg_confirm_entry_deletion#:#Are you sure you want to delete the following entry?: -file#:#msg_error_active_suffixes_blacklisted#:#One of the selected file extensions is on the global blacklist and cannot therefore be currently used. -file#:#msg_error_active_suffixes_conflict#:#Error: It is not possible to have multiple icons activated for the same suffix. Please deactivate either this icon or the other activated icon whose suffixes overlap with those of this icon. -file#:#msg_error_active_suffixes_not_whitelisted#:#The selected file extension is not on the global whitelist. The file suffixes will be changed to ‘.sec’ when downloaded. -file#:#msg_error_duplicate_suffix_entries#:#Error: the comma separated list of suffixes contains duplicate entries. -file#:#msg_error_icon_deletion#:#Error: icon deletion failed. -file#:#msg_error_suffixes_with_forbidden_characters#:#Error: forbidden characters. Only letters, numbers, spaces and commas are allowed. -file#:#msg_icon_missing_from_db#:#Icon missing from database. -file#:#msg_icon_missing_from_irss#:#Icon missing from resource storage. -file#:#msg_success_icon_activated#:#Icon successfully activated. -file#:#msg_success_icon_created#:#Icon successfully created. -file#:#msg_success_icon_deactivated#:#Icon successfully deactivated. -file#:#msg_success_icon_deletion#:#Icon successfully deleted. -file#:#msg_success_icon_updated#:#Icon successfully updated. -file#:#msg_unzip_success#:#Archive successfully unzipped. -file#:#on_click_action#:#Action When Title Clicked -file#:#preview_caption#:#Preview %sof %s -file#:#preview_image_size_info#:#The preview versions of images will be downscaled or upscaled as appropriate, so that their longest side is the length (in px) entered here. -file#:#preview_persisting#:#Persistent Preview Images -file#:#preview_persisting_info#:#Generated preview images will be stored by ILIAS and used from then on each time the preview icon for that file is clicked on. If deactivated, previews will be generated anew each time. -file#:#previews_for_tiles#:#Tiles -file#:#previews_for_tiles_info#:#Use Preview for Tiles where possible. -file#:#publish_before_delete#:#It was not possible to delete any of the existing versions because an unpublished draft exists. -file#:#replace_file_info#:#All previous file versions will be deleted. -file#:#resource_id#:#Resource ID -file#:#service_settings#:#Additional Features -file#:#service_settings_saved#:#Changes saved. -file#:#set_license_for_all_files#:#Set License for All Files -file#:#show_amount_of_downloads#:#Show Number of Downloads -file#:#show_amount_of_downloads_info#:#Display the number of times a file object has been downloaded on its 'Info' page. -file#:#storage_id#:#Storage ID -file#:#suffix_specific_icons#:#Suffix-Specific Icons -file#:#suffixes#:#Suffix(es) -file#:#upload_files#:#Upload Files -file#:#upload_files_limit#:#The maximum file size allowed is %s. -file#:#upload_files_title#:#Upload Files -file#:#upload_info#:#File -file#:#upload_info_desc#:#Uploads and versions can be managed in the ‘Versions’ tab. -file#:#version_uploaded#:#Version Uploaded -file#:#versionname#:#Title fils#:#add_upload_policy#:#Add Policy fils#:#edit_upload_policy#:#Edit Policy fils#:#file_services#:#File Services @@ -18033,4 +17949,4 @@ wsp#:#wsp_type_ltiv#:#Certificate: LTI Consumer wsp#:#wsp_type_scov#:#Certificate: SCORM wsp#:#wsp_type_tstv#:#Certificate: Test wsp#:#wsp_type_webr#:#Weblink -wsp#:#wsp_type_wfld#:#Folder \ No newline at end of file +wsp#:#wsp_type_wfld#:#Folder